Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
0e0e6bf
feat(downloads): complete download acquisition and catalog browsing f…
undead2146 Aug 16, 2026
b1317c8
fix(downloads): resolve review findings on catalog identity, search c…
undead2146 Aug 16, 2026
de45435
fix(downloads): address review feedback on catalog parsing, bundle va…
undead2146 Aug 17, 2026
9d50393
fix(downloads): harden protocol subscription url, multi-axis variant …
undead2146 Aug 17, 2026
a221cd2
fix(downloads): enforce HTTPS for subscription url and reduce progres…
undead2146 Aug 17, 2026
31076d3
fix(scripts): make generate-test-shortcuts.sh strictly POSIX-compliant
undead2146 Aug 17, 2026
fefb55d
refactor(quality): resolve DeepSource C# code review findings across …
undead2146 Aug 17, 2026
aaebf85
refactor(catalog): resolve DeepSource code quality and anti-pattern f…
undead2146 Aug 17, 2026
6e69c0c
refactor(quality): specify granular catches in parser and simplify or…
undead2146 Aug 17, 2026
15f4dc4
refactor(community-outpost): rename helper to GetFilenameFromUri
undead2146 Aug 17, 2026
91491ad
refactor(quality): standardize async test method naming and resolve s…
undead2146 Aug 17, 2026
ae04ace
refactor(quality): modularize catalog identity, resolver, and parser …
undead2146 Aug 17, 2026
9417f4f
refactor: resolve all static analysis, cyclomatic complexity, and tes…
undead2146 Aug 17, 2026
96ffd2c
refactor: resolve all DeepSource static analysis and cyclomatic compl…
undead2146 Aug 17, 2026
cfddcdd
refactor: resolve remaining DeepSource analyzer findings in viewmodel…
undead2146 Aug 17, 2026
095d961
refactor: resolve all remaining static analysis issues in services, v…
undead2146 Aug 17, 2026
0db2d0a
test: refine mock verify predicates and test data theory in core tests
undead2146 Aug 17, 2026
1e5dbd5
test: avoid long numeric literals in ModDB size test data
undead2146 Aug 17, 2026
d1ce5c8
fix(generalsonline): add manifest pool and factory dependencies to de…
undead2146 Aug 18, 2026
648c56e
refactor(tests): resolve DeepSource analysis findings in process mana…
undead2146 Aug 18, 2026
e137161
feat(content): enable automated extraction for self-extracting mod ex…
undead2146 Aug 17, 2026
d82cc4a
fix(core): handle empty digits in GameVersionHelper and resolve tuple…
undead2146 Aug 18, 2026
b29cbeb
fix(tests): update quarantine tests to use lowercase exitCode and imp…
undead2146 Aug 18, 2026
c87d0a5
Merge upstream/development into feat/ui-downloads
undead2146 Aug 18, 2026
8e3c5ce
Fix syntax errors and compilation in SuperHackersProfileReconciler an…
undead2146 Aug 18, 2026
11215bd
fix(downloads): support SFX exe payload extraction and exact ModDB so…
undead2146 Aug 18, 2026
6249757
fix(downloads): initialize read variable to satisfy DeepSource analyzer
undead2146 Aug 18, 2026
9bee8f4
feat(content): add Smart Install Maker SFX payload extractor and fix …
undead2146 Aug 18, 2026
8a6a7bc
fix(downloads): resolve UI freezing during extraction and workspace d…
undead2146 Aug 18, 2026
7230f22
fix(userdata): resolve file conflict when prior owner profile is deac…
undead2146 Aug 18, 2026
7dfd026
Merge remote-tracking branch 'origin/development' into feat/ui-downloads
undead2146 Aug 18, 2026
8afd9f8
fix(content): resolve Smart Install Maker extraction truncating asset…
undead2146 Aug 18, 2026
c0f570a
fix(content): merge nested if conditions in ArchivePayloadProcessor p…
undead2146 Aug 18, 2026
6f1c760
fix(downloads): prevent false downloaded state for sibling releases s…
undead2146 Aug 18, 2026
2f10203
fix(downloads): resolve CS-R1073 naming, normalize resolver lookups, …
undead2146 Aug 18, 2026
3f7d9e2
docs(cleanup): remove redundant planning, remediation, and acceptance…
undead2146 Aug 18, 2026
34628d2
Merge upstream/development into feat/ui-downloads
undead2146 Aug 19, 2026
49c7446
fix(backport): incorporate side PR refinements, security fixes, and r…
undead2146 Aug 19, 2026
5940f17
fix(app): resolve DeepSource CS-W1084 duplicate branch and clean up s…
undead2146 Aug 19, 2026
18b3208
Merge upstream/development into feat/ui-downloads
undead2146 Aug 19, 2026
92d98d2
fix(converter): catch native heif exceptions to avoid unhandled loade…
undead2146 Aug 19, 2026
c627aeb
Merge upstream/development into feat/ui-downloads and resolve launch …
undead2146 Aug 19, 2026
e170959
Merge upstream/development into feat/ui-downloads and resolve userdat…
undead2146 Aug 19, 2026
3fb913a
fix(tests): update SettingsViewModelTests constructor arguments for s…
undead2146 Aug 19, 2026
6d33c1e
Merge upstream/development into feat/ui-downloads and resolve Setting…
undead2146 Aug 19, 2026
b7baa83
Merge upstream/development into feat/ui-downloads and resolve content…
undead2146 Aug 19, 2026
d3f2d32
fix(content): propagate cancellation in CommunityOutpostDeliverer and…
undead2146 Aug 19, 2026
8ec6b4a
fix(github): align DeliverContentAsync loose file and archive flow to…
undead2146 Aug 19, 2026
807c432
fix(content): resolve ModDB Cloudflare verification loop and local co…
undead2146 Aug 19, 2026
3c17a55
fix(viewmodels): remove duplicate ShowLoadingOverlay in AddLocalConte…
undead2146 Aug 19, 2026
b7b8ba4
fix(viewmodels): restore full AddLocalContentViewModel members and ev…
undead2146 Aug 19, 2026
be3b5b6
feat(launching): add native PE binary classification, CAS client sour…
undead2146 Aug 19, 2026
be72262
fix(tests): disambiguate ContentType and fix manifest property in uni…
undead2146 Aug 19, 2026
d0aef57
fix(content): handle closed Playwright browser in ModDB and normalize…
undead2146 Aug 20, 2026
c7f6592
fix(workspace): make strategy file processors abstract to remove NotI…
undead2146 Aug 20, 2026
50b4f5a
fix(review): decompose ModDB scraping and use method groups in worksp…
undead2146 Aug 20, 2026
059d2f3
fix(content): import AngleSharp.Dom namespace for IDocument in ModDBD…
undead2146 Aug 20, 2026
71a25b0
fix(tests): skip PID recording when launcher exits immediately and in…
undead2146 Aug 20, 2026
a6f6924
chore(ci): re-trigger review workflows
undead2146 Aug 20, 2026
e02cb2c
fix(userdata): resolve multi-profile map conflicts, game client valid…
undead2146 Aug 20, 2026
996f7e5
fix(review): simplify conditional predicates and decompose workspace …
undead2146 Aug 20, 2026
616474f
fix(process): handle exited launcher in adoption and fix stylecop ord…
undead2146 Aug 20, 2026
927248c
Merge remote-tracking branch 'origin/development' into feat/ui-downloads
undead2146 Aug 20, 2026
1d660f8
fix(downloads): prevent card image resets, ModDB search hangs, and pr…
undead2146 Aug 20, 2026
70882cd
feat(content): resolve SIM extractor overflow, download deduplication…
undead2146 Aug 20, 2026
604122f
Merge remote-tracking branch 'origin/development' into feat/ui-downloads
undead2146 Aug 20, 2026
871d286
fix(downloads): place CancellationToken as last parameter in ContentD…
undead2146 Aug 20, 2026
fa4162d
fix(content): improve local content progress UI, safe BIG normalizati…
undead2146 Aug 20, 2026
8f214f9
test(content): supply valid BIG headers in inactive archive unit tests
undead2146 Aug 20, 2026
3647165
fix(launch): eliminate redundant workspace notifications and remove s…
undead2146 Aug 20, 2026
ae08ffb
fix(workspace): enable workspace reuse on Steam launches and clean ad…
undead2146 Aug 20, 2026
fd07f92
fix(workspace): auto-configure game-drive CAS pool and resolve fast l…
undead2146 Aug 20, 2026
83ec8a5
ux(launch): inform user when workspace initialization occurs during p…
undead2146 Aug 20, 2026
7f7e01e
Merge remote-tracking branch 'origin/development' into feat/ui-downloads
undead2146 Aug 20, 2026
58dba36
feat(downloads): add clear logs option, clean tab styles, and refine …
undead2146 Aug 20, 2026
c2bc9b5
Merge remote-tracking branch 'origin/development' into feat/ui-downloads
undead2146 Aug 20, 2026
5138e4e
fix(downloads): resolve DeepSource uninitialized variables, async nam…
undead2146 Aug 20, 2026
a96b7d2
fix(settings): use DateTime.UtcNow in log cleanup to resolve DeepSour…
undead2146 Aug 20, 2026
f3140d1
fix(content): resolve all review comments on AODMaps, ModDB dates, an…
undead2146 Aug 20, 2026
9f74c32
fix(discovery): simplify ternary expression in GitHub discovery to re…
undead2146 Aug 20, 2026
87bfa1f
fix(downloads): improve log cleanup safety and payload extraction val…
undead2146 Aug 20, 2026
610931c
fix(deepsource): resolve CS-W1022, CS-R1008, and CS-W1091 issues in l…
undead2146 Aug 20, 2026
7115363
fix(content): support raw zlib and bzip2 streams in modern smart inst…
undead2146 Aug 20, 2026
6ee0ed2
fix(content): prioritize archive releases over setup installers and f…
undead2146 Aug 20, 2026
3cc6969
fix(logging): include ResilientFileSink implementation for Serilog fi…
undead2146 Aug 20, 2026
742226c
fix(review): resolve DeepSource CS-R1008, CS-R1114, and CommunityOutp…
undead2146 Aug 20, 2026
e5d15f8
fix(content): resolve Smart Install Maker extraction and SFX signatur…
undead2146 Aug 20, 2026
12487af
fix(content): define stagingRoot variable in Smart Install Maker extr…
undead2146 Aug 20, 2026
f11329e
fix(tests): resolve BZip2Stream.Create signature and ContentManifest …
undead2146 Aug 20, 2026
ac5ea93
fix(tests): use Description property on ContentMetadata
undead2146 Aug 20, 2026
63c4a58
fix(tests): resolve synthetic byte arrays and manifest ID segment format
undead2146 Aug 20, 2026
7304358
fix(tests): ensure compression streams finalize in synthetic SIM helper
undead2146 Aug 20, 2026
9a0773b
fix(content): resolve DeepSource code quality findings in payload pro…
undead2146 Aug 20, 2026
bd97b0a
fix(workspace): only show workspace initialization notification when …
undead2146 Aug 21, 2026
27beef7
fix(downloads): prioritize selected release/patch and add sidebar man…
undead2146 Aug 21, 2026
7d1c0b9
fix(launcher): dismiss workspace initialization notification on launc…
undead2146 Aug 21, 2026
756c9be
test(core): use object initializer in LaunchProgressTests to resolve …
undead2146 Aug 21, 2026
29d1389
Merge remote-tracking branch 'origin/development' into feat/ui-downloads
undead2146 Aug 21, 2026
cec0d84
style(ui): modernize downloads and content views to design system tokens
undead2146 Aug 21, 2026
d093167
Merge remote-tracking branch 'origin/development' into feat/ui-downloads
undead2146 Aug 22, 2026
024da38
feat(downloads): apply dynamic theming and badge styles to content views
undead2146 Aug 22, 2026
40c831d
feat(downloads): replace hardcoded colors and hex styles with dynamic…
undead2146 Aug 22, 2026
d4bc0b2
Merge remote-tracking branch 'origin/development' into feat/ui-downloads
undead2146 Aug 22, 2026
e5f53f8
fix(downloads): resolve static analysis and SonarCloud findings acros…
undead2146 Aug 22, 2026
4df155d
fix(downloads): resolve SonarCloud quality gate findings and stylecop…
undead2146 Aug 22, 2026
1408615
fix(downloads): improve content type detection and resolve SonarCloud…
undead2146 Aug 22, 2026
03b3ef5
merge: update branch with latest changes from origin/development
undead2146 Aug 22, 2026
73f14ca
fix(core,ui): resolve SonarCloud Quality Gate and DeepSource issues
undead2146 Aug 22, 2026
f0dac0a
fix(quality): resolve SonarCloud reliability bugs and security vulner…
undead2146 Aug 22, 2026
985ce7c
fix(downloads): resolve sonarcloud and deepsource code smells across …
undead2146 Aug 22, 2026
aec07a1
fix(catalog): extract ZeroHourGameSegment constant in GenericCatalogD…
undead2146 Aug 22, 2026
55c26d6
fix(quality): resolve all SonarCloud issues across download and conte…
undead2146 Aug 22, 2026
2a1e79a
merge: update branch with latest changes from origin/development
undead2146 Aug 22, 2026
57cf9e0
feat(content): support direct ModDB page URL search and auto-switch p…
undead2146 Aug 22, 2026
2dee759
fix(quality): resolve SonarCloud and DeepSource static analysis findi…
undead2146 Aug 23, 2026
1814850
fix(quality): resolve SonarCloud reliability bug and major code smells
undead2146 Aug 23, 2026
5c4f35d
fix(quality): resolve all SonarCloud and DeepSource code smells and b…
undead2146 Aug 23, 2026
84d977e
fix(tools): guard managed Chromium progress task against cancellation…
undead2146 Aug 23, 2026
ab92886
fix(quality): resolve all SonarCloud reliability and code smell findings
undead2146 Aug 23, 2026
8fcab5c
fix(discoverer): distinguish ModDB detail pages from article sections…
undead2146 Aug 23, 2026
49169c8
fix(quality): resolve DeepSource complexity, lambda, initialization, …
undead2146 Aug 23, 2026
1f80f49
feat(ui): implement docked resizable sidebar layout with interactive …
undead2146 Aug 23, 2026
f32923a
merge: integrate docked resizable sidebar layout with interactive spl…
undead2146 Aug 23, 2026
c8289f1
fix(workspace,installations): identify standalone Zero Hour and elimi…
undead2146 Aug 23, 2026
37ffea8
fix(quality): resolve SonarCloud code smells in PlaywrightService and…
undead2146 Aug 23, 2026
32af39e
fix(ui): polish card badges, modernize action buttons, and restore pr…
undead2146 Aug 23, 2026
8fb5e54
fix(downloads): replace Task.Delay with Task.Yield in ProcessDiscover…
undead2146 Aug 23, 2026
8a981d0
fix(downloads,workspace): restore progressive card rendering delay an…
undead2146 Aug 23, 2026
e375eb5
fix(installations): robust Zero Hour detection, manifest reconstructi…
Aug 23, 2026
9339cb3
fix(tests): allow background catalog fetch to populate cache before a…
undead2146 Aug 23, 2026
240eefd
fix(installations): refine capability manifest seeding, guard subdire…
undead2146 Aug 23, 2026
fe1f398
fix(installations): use PathComparer for manifest grouping and Enumer…
undead2146 Aug 23, 2026
61a847f
fix(installations): restrict archive discovery enumeration to big arc…
undead2146 Aug 24, 2026
4ed5b74
fix(installations): use case-insensitive archive search for zero hour…
undead2146 Aug 24, 2026
84bf3bf
refactor(game-installations): reduce cognitive complexity and elimina…
undead2146 Aug 24, 2026
ae5886b
Merge remote-tracking branch 'origin/development' into feat/ui-downlo…
undead2146 Aug 26, 2026
6545ee5
fix(info): implement standard dispose pattern in InfoViewModel
undead2146 Aug 26, 2026
225851d
Merge remote-tracking branch 'origin/development' into feat/ui-downlo…
undead2146 Aug 26, 2026
6e5269f
Merge remote-tracking branch 'origin/development' into feat/ui-downlo…
undead2146 Aug 30, 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 .github/workflows/gitnexus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ jobs:
name: GitNexus Index & Artifact
runs-on: ubuntu-latest
timeout-minutes: 10
env:
NODE_OPTIONS: "--dns-result-order=ipv4first"

steps:
- name: Checkout Code
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
.*
!.github/
!.gitignore
!.gitattributes
!**/.gitattributes
!.agents/
!.claude/

Expand Down
5 changes: 2 additions & 3 deletions GenHub/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
</PropertyGroup>
<ItemGroup>
<!-- Avalonia packages -->
<!-- Important: keep version in sync! -->
<PackageVersion Include="AngleSharp" Version="1.5.0" />
<PackageVersion Include="AngleSharp" Version="1.5.2" />
<PackageVersion Include="Avalonia" Version="11.2.7" />
<PackageVersion Include="Avalonia.Desktop" Version="11.2.7" />
<PackageVersion Include="Avalonia.Themes.Fluent" Version="11.2.7" />
Expand Down Expand Up @@ -56,4 +55,4 @@
<PackageVersion Include="HeyRed.ImageSharp.Heif" Version="2.1.3" />
<PackageVersion Include="LibHeif.Native" Version="1.15.1" />
</ItemGroup>
</Project>
</Project>
31 changes: 29 additions & 2 deletions GenHub/GenHub.Core/Constants/AODMapsConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace GenHub.Core.Constants;

/// <summary>
/// Constants for AODMaps (Age of Defense Maps) provider.
/// Constants for AODMaps (Art of Defense Maps) provider.
/// </summary>
[SuppressMessage("Minor Code Smell", "S1075:URIs should not be hardcoded", Justification = "Centralized URI constants / mock demo paths")]
[SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Domain acronym")]
Expand All @@ -19,7 +19,7 @@ public static class AODMapsConstants
public const string DiscovererSourceName = "AODMaps";

/// <summary>Gets the discoverer description.</summary>
public const string DiscovererDescription = "Age of Defense Maps";
public const string DiscovererDescription = "Art of Defense Maps";

/// <summary>Gets the resolver ID for AODMaps.</summary>
public const string ResolverId = "AODMaps";
Expand Down Expand Up @@ -117,6 +117,9 @@ public static class AODMapsConstants
/// <summary>Gets the download URL metadata key.</summary>
public const string DownloadUrlMetadataKey = "downloadUrl";

/// <summary>Gets the list page URL metadata key.</summary>
public const string ListPageUrlMetadataKey = "listPageUrl";

/// <summary>Gets the direct download metadata key.</summary>
public const string DirectDownloadMetadataKey = "directDownload";

Expand All @@ -126,6 +129,30 @@ public static class AODMapsConstants
/// <summary>Gets the download count metadata key.</summary>
public const string DownloadCountMetadataKey = "downloadCount";

/// <summary>Gets the player count metadata key.</summary>
public const string PlayerCountMetadataKey = ContentConstants.PlayerCountMetadataKey;

/// <summary>Gets the category metadata key used for download-card badges and combined filtering.</summary>
public const string CategoryMetadataKey = ContentConstants.CategoryMetadataKey;

/// <summary>Filter / badge label for Compstomp maps.</summary>
public const string CategoryCompstomp = "Compstomp";

/// <summary>Filter / badge label for map packs.</summary>
public const string CategoryMapPacks = "Map Packs";

/// <summary>Filter / badge label for air maps.</summary>
public const string CategoryAir = "Air";

/// <summary>Filter / badge label for race maps.</summary>
public const string CategoryRace = "Race";

/// <summary>Filter / badge label for Art of Attack maps.</summary>
public const string CategoryAoa = "AOA";

/// <summary>Filter / badge label for Contra AOD maps.</summary>
public const string CategoryContra = "Contra";

/// <summary>Gets the last updated metadata key.</summary>
public const string LastUpdatedMetadataKey = "lastUpdated";

Expand Down
24 changes: 23 additions & 1 deletion GenHub/GenHub.Core/Constants/AppUpdateConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,28 @@ public static class AppUpdateConstants
"3. Launch the installed version (will be in %LOCALAPPDATA%\\GenHub)\n\n" +
"Update available: v{1}";

/// <summary>
/// Default update notification title.
/// </summary>
public const string UpdateNotificationTitle = "Update Available";

/// <summary>
/// Update available notification message format.
/// {0}: Version.
/// </summary>
public const string UpdateAvailableMessageFormat = "A new version ({0}) is available.";

/// <summary>
/// Branch/Artifact update notification title.
/// </summary>
public const string BranchUpdateNotificationTitle = "Branch Update Available";

/// <summary>
/// Branch update available notification message format.
/// {0}: Version, {1}: Branch.
/// </summary>
public const string BranchUpdateAvailableMessageFormat = "A new build ({0}) is available on branch '{1}'.";

/// <summary>
/// Update available notification title for release channel.
/// </summary>
Expand Down Expand Up @@ -214,7 +236,7 @@ public static class AppUpdateConstants
public const string UpdateFailedNotificationFormat = "Failed to install update: {0}";

/// <summary>
/// View updates action button text.
/// "View Updates" action text.
/// </summary>
public const string ViewUpdatesAction = "View Updates";

Expand Down
69 changes: 66 additions & 3 deletions GenHub/GenHub.Core/Constants/CatalogConstants.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,26 @@
namespace GenHub.Core.Constants;

/// <summary>
/// Constants for publisher catalog system.
/// Constants for the modular publisher-catalog system.
/// </summary>
/// <remarks>
/// Layering (see Publisher Studio architecture):
/// <list type="bullet">
/// <item>
/// <b>Provider Definition</b> — static publisher metadata + catalog endpoint(s)
/// (bundled <c>*.provider.json</c> today; user-hosted definitions via Publisher Studio later).
/// </item>
/// <item>
/// <b>Catalog</b> — dynamic content listing (<c>catalog.json</c> / remote endpoint), updated on each release.
/// </item>
/// <item>
/// <b>Artifacts</b> — downloadable files referenced by catalog releases.
/// </item>
/// </list>
/// Anyone can author a GenHub-schema catalog, host it, and share
/// <c>genhub://subscribe?url=...</c>. Discovery uses <see cref="GenericCatalogResolverId"/>
/// for catalog-direct subscriptions without per-publisher code.
/// </remarks>
public static class CatalogConstants
{
/// <summary>
Expand All @@ -11,12 +29,17 @@ public static class CatalogConstants
public const int CatalogSchemaVersion = 1;

/// <summary>
/// Filename for subscriptions storage.
/// Filename for user subscription storage under application data.
/// </summary>
public const string SubscriptionFileName = "subscriptions.json";

/// <summary>
/// Resolver ID for generic catalog resolver.
/// Sidebar / discoverer category for user-subscribed catalogs (vs built-in static/dynamic).
/// </summary>
public const string SubscribedPublisherCategory = "subscribed";

/// <summary>
/// Resolver / pipeline ID for the generic catalog pipeline (any GenHub-schema catalog).
/// </summary>
public const string GenericCatalogResolverId = "generic-catalog";

Expand All @@ -29,4 +52,44 @@ public static class CatalogConstants
/// Maximum catalog size in bytes (10 MB).
/// </summary>
public const long MaxCatalogSizeBytes = 10 * 1024 * 1024;

/// <summary>
/// Maximum number of entries allowed when extracting publisher catalog archives.
/// </summary>
public const int MaxZipEntryCount = 50_000;

/// <summary>
/// Maximum cumulative uncompressed size allowed when extracting publisher catalog archives (5 GB).
/// </summary>
public const long MaxZipUncompressedSizeBytes = 5L * 1024 * 1024 * 1024;

/// <summary>
/// Resolver metadata key for serialized publisher profile JSON.
/// </summary>
public const string PublisherProfileJsonMetadataKey = "publisherProfileJson";

/// <summary>
/// Resolver metadata key for serialized catalog item JSON.
/// </summary>
public const string CatalogItemJsonMetadataKey = "catalogItemJson";

/// <summary>
/// Resolver metadata key for serialized release JSON.
/// </summary>
public const string ReleaseJsonMetadataKey = "releaseJson";

/// <summary>
/// Resolver metadata key for the stable catalog content id (not the display name).
/// </summary>
public const string CatalogContentIdMetadataKey = "catalogContentId";

/// <summary>
/// Resolver metadata key for serialized bundle component descriptors.
/// </summary>
public const string BundleComponentsJsonMetadataKey = "bundleComponentsJson";

/// <summary>
/// Resolver metadata key for serialized publisher referrals JSON.
/// </summary>
public const string CatalogReferralsJsonMetadataKey = "catalogReferralsJson";
}
17 changes: 6 additions & 11 deletions GenHub/GenHub.Core/Constants/CncLabsConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,24 +117,19 @@ public static class CNCLabsConstants
public const string QueryStringIdParameter = "id";

/// <summary>
/// CSS selector for a single downloadable item container on list pages.
/// CSS selector for a single downloadable item container on list pages (2026 Bootstrap redesign).
/// </summary>
public const string ListItemSelector = "div.DownloadItem";
public const string ListItemSelector = "div.list-group-item";

/// <summary>
/// CSS selector for the hidden input that carries the map's numeric File Id.
/// CSS selector for the anchor with the display name of the map (2026 Bootstrap redesign).
/// </summary>
public const string FileIdHiddenSelector = "input[type='hidden'][id$='FileIdField']";
public const string DisplayNameAnchorSelector = "h5 a[href*='/downloads/details/']";

/// <summary>
/// CSS selector for the anchor with the display name of the map.
/// CSS selector for the element that contains the short description (2026 Bootstrap redesign).
/// </summary>
public const string DisplayNameAnchorSelector = "a.DisplayName";

/// <summary>
/// CSS selector for the element that contains the short description.
/// </summary>
public const string DescriptionSelector = "span[id$='DescriptionLabel']";
public const string DescriptionSelector = "div.mb-1.text-muted.small";

/// <summary>
/// CSS selector for bold labels inside the item description cell (used to locate the "Author:" label).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ public static class CommunityOutpostCatalogConstants
public const string UnknownVersion = "unknown";

/// <summary>Default base URL for making relative URLs absolute.</summary>
public const string DefaultBaseUrl = "https://legi.cc/patch";
public const string DefaultBaseUrl = CommunityOutpostConstants.BaseUrl + "/patch";

/// <summary>Default base URL for downloading GenPatcher content .dat packages.</summary>
public const string DefaultFilesBaseUrl = CommunityOutpostConstants.BaseUrl + "/gp2/f";

/// <summary>Metadata key for the content code.</summary>
public const string ContentCodeKey = "contentCode";
Expand Down
12 changes: 11 additions & 1 deletion GenHub/GenHub.Core/Constants/CommunityOutpostConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,14 @@ namespace GenHub.Core.Constants;
/// Endpoint URLs and timeouts are configured via data-driven configuration.
/// See <c>Providers/communityoutpost.provider.json</c> for runtime-configurable values.
/// </remarks>
[SuppressMessage("Minor Code Smell", "S1075:URIs should not be hardcoded", Justification = "Centralized URI constants / mock demo paths")]
[SuppressMessage("Minor Code Smell", "S1075:URIs should not be hardcoded", Justification = "Default base URL for Community Outpost service")]
public static class CommunityOutpostConstants
{
/// <summary>
/// Base URL for Community Outpost / GenPatcher service.
/// </summary>
public const string BaseUrl = "https://legi.cc";

/// <summary>
/// The publisher ID for Community Outpost.
/// </summary>
Expand Down Expand Up @@ -53,6 +58,11 @@ public static class CommunityOutpostConstants
/// </summary>
public const string ContentName = "Community Patch";

/// <summary>
/// Tag and content code for Community Patch items.
/// </summary>
public const string CommunityPatchTag = "community-patch";

/// <summary>
/// Description for the discoverer.
/// </summary>
Expand Down
27 changes: 27 additions & 0 deletions GenHub/GenHub.Core/Constants/ContentConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,4 +94,31 @@ public static class ContentConstants
/// Maximum allowed size for the content catalog in bytes (10 MB).
/// </summary>
public const long MaxCatalogSizeBytes = 10 * ConversionConstants.BytesPerMegabyte;

/// <summary>
/// Shared resolver/display metadata key for map player counts.
/// Builtin and catalog publishers should set this so download cards can render a consistent badge.
/// </summary>
public const string PlayerCountMetadataKey = "playerCount";

/// <summary>
/// Shared resolver/display metadata key for content categories (AOA, Compstomp, ModDB category, etc.).
/// </summary>
public const string CategoryMetadataKey = "category";

/// <summary>
/// Display metadata key for a comma-separated list of included/required content names
/// (e.g. catalog ContentBundle dependencies resolved to friendly titles).
/// </summary>
public const string IncludesSummaryMetadataKey = "includesSummary";

/// <summary>
/// Number of recent releases and addons to eagerly preload extended details for.
/// </summary>
public const int PreloadRecentItemsLimit = 5;

/// <summary>
/// Maximum concurrent background requests when preloading recent item details.
/// </summary>
public const int PreloadConcurrencyLimit = 3;
}
15 changes: 15 additions & 0 deletions GenHub/GenHub.Core/Constants/DirectoryNames.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,19 @@ public static class DirectoryNames
/// Directory for storing tool workspaces.
/// </summary>
public const string ToolWorkspaces = "ToolWorkspaces";

/// <summary>
/// Directory for persistent Playwright browser profiles (cookies/storage for bot-protected sites).
/// </summary>
public const string BrowserProfiles = "BrowserProfiles";

/// <summary>
/// Directory for the app-owned Playwright Chromium runtime (not the system Chrome/Edge install).
/// </summary>
public const string BrowserRuntime = "BrowserRuntime";

/// <summary>
/// Directory for game movie assets.
/// </summary>
public const string Movies = "Movies";
}
6 changes: 6 additions & 0 deletions GenHub/GenHub.Core/Constants/GameClientConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@ public static class GameClientConstants
/// <summary>Primary Generals Vanilla Patch archive filename.</summary>
public const string GeneralsPatchBig = "Patch.big";

/// <summary>Generals Vanilla security archive filename.</summary>
public const string GeneralsSecurityBig = "gensec.big";

/// <summary>Zero Hour archive extension suffix.</summary>
public const string ZeroHourArchiveExtensionSuffix = "ZH.big";

// ===== GeneralsOnline Client Detection =====

/// <summary>GeneralsOnline 60Hz client executable name.</summary>
Expand Down
Loading
Loading