Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e71dcce
fix(security): harden process launching helpers
mleem97 Jul 8, 2026
f6268df
fix(core): use invariant telemetry identifiers
mleem97 Jul 8, 2026
833dc19
refactor(core): expose preference keys as static properties
mleem97 Jul 8, 2026
99cab89
refactor(core): expose beta preference key as property
mleem97 Jul 8, 2026
baa9ee8
refactor(steam): expose constants as static properties
mleem97 Jul 8, 2026
b04e884
refactor(ui): replace dialog optional parameters with overloads
mleem97 Jul 8, 2026
2c5b703
refactor(core): make cli entrypoint static
mleem97 Jul 8, 2026
a7afc9c
fix(helper): avoid IP-looking fallback version
mleem97 Jul 8, 2026
b8180c8
fix(core): harden repro bundle process invocation
mleem97 Jul 8, 2026
07fe4d1
refactor(core): replace collection optional parameters with overloads
mleem97 Jul 8, 2026
b233c64
refactor(core): replace download optional parameters with overloads
mleem97 Jul 8, 2026
4aa815b
refactor(core): replace sync optional parameter with overload
mleem97 Jul 8, 2026
c5d3bf5
refactor(core): document release debug log no-op
mleem97 Jul 8, 2026
750d097
docs: modularize agent instructions
mleem97 Jul 8, 2026
f1fa66e
docs: add agent collaboration defaults
mleem97 Jul 8, 2026
fa98b80
docs: add project context reference
mleem97 Jul 8, 2026
af7e7a8
docs: add tool and build reference
mleem97 Jul 8, 2026
1fa1cfd
fix(ci): constrain malicious scan subprocess calls
mleem97 Jul 8, 2026
47fe7cd
refactor(core): replace poller optional interval with overload
mleem97 Jul 8, 2026
b688b08
refactor(core): replace log optional parameters with overloads
mleem97 Jul 8, 2026
573314f
chore: tune static analyzer noise floor
mleem97 Jul 8, 2026
631e411
Merge branch 'main' into fix/static-analysis-issues
mleem97 Jul 8, 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
715 changes: 393 additions & 322 deletions .github/scripts/malicious_scan.py

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions .globalconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
is_global = true

# The repository intentionally keeps several generated/template-heavy UI and parser files together
# to preserve XAML/code-behind locality and Steam BBCode parser readability. Track structural
# refactors separately from security and correctness fixes.
dotnet_diagnostic.S104.severity = none
dotnet_diagnostic.S138.severity = none

# Some public APIs preserve ergonomic overload-compatible signatures while older callers migrate.
dotnet_diagnostic.S2360.severity = none
389 changes: 42 additions & 347 deletions AGENTS.md

Large diffs are not rendered by default.

20 changes: 20 additions & 0 deletions SOUL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# SOUL.md — Collaboration Defaults

## Communication

- Use clear, technical language.
- Prefer concise summaries before code changes.
- Respond in German when the user writes German, unless the requested artifact or repository policy requires English.
- Keep documentation artifacts in English unless the user or maintainer explicitly requests another language.

## Review posture

- Keep refactors minimal and architecture-safe.
- Prefer observable behavior preservation for static-analysis cleanup.
- Call out skipped checks, unavailable tooling, or incomplete verification explicitly.

## Agent behavior

- Do not hide uncertainty in PR descriptions or final responses.
- Do not invent tool output.
- If repository guardrails conflict with a direct maintainer request, ask for confirmation before proceeding.
33 changes: 33 additions & 0 deletions TOOLS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# TOOLS.md — Build, CI, and Operations

Check warning on line 1 in TOOLS.md

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

TOOLS.md#L1

Referenced file "EXTERNAL_DEPENDENCIES.md" not found in workspace.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 HIGH RISK

Referenced file EXTERNAL_DEPENDENCIES.md was not found. Please add the file or update the documentation references in TOOLS.md and AGENTS.md.

See Issue in Codacy


## Build

- Local build script: `build/scripts/build.ps1`.
- Interactive builders: `build/builder.ps1` and `build/builder.sh`.
- CI workflow: `.github/workflows/build-and-release.yml`.
- Keep script and workflow changes aligned unless the PR explicitly documents a staged migration.

## Steam Workshop

- Steam AppID for Data Center: `4170200`.
- `SteamPublishRateLimiter.Shared` enforces cooldown behavior for publish attempts.
- UI cooldown copy should show seconds when rate-limit state is visible.

## Signing

- Windows signing uses `build/installer/sign-authenticode.ps1`.
- Supported signing inputs: `CODE_SIGN_THUMBPRINT`, or `CODE_SIGN_PFX` plus `CODE_SIGN_PFX_PASSWORD`.
- Do not include `steam_api64.dll` in signing loops unless the maintainer confirms the vendor binary is safe to sign.

## Telemetry

- Telemetry implementation: `TelemetryService.cs`.
- Telemetry must respect `AppSettings.TelemetryEnabled`.

Check warning on line 25 in TOOLS.md

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

TOOLS.md#L25

Absolute rule without escape hatch: "- Telemetry must respect `AppSettings.TelemetryEnabled`."
- Installation tracking uses an anonymized machine identifier.

## Troubleshooting

- Duplicate Avalonia title bars: check custom-chrome settings.
- Steam upload blocked: inspect rate-limit state and cooldown copy.
- JSON trimming warnings: verify source-generation registration in `AppJsonContext`.
- Linux package build failures: verify external packaging tools listed in `EXTERNAL_DEPENDENCIES.md`.
33 changes: 33 additions & 0 deletions USER.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# USER.md — Project Context

## Repository

- Application: gregModmanager.
- Purpose: cross-platform desktop mod manager for the gregFramework ecosystem.
- UI framework: Avalonia UI 11.2.
- Desktop target: .NET 9.
- Runtime-facing helper compatibility: .NET 6 unless explicitly requested and validated.
- Primary solution: `GregModmanager.sln`.

## Important paths

- Desktop app: `src/GregModmanager.Avalonia/`.
- Core services and models: `src/GregModmanager.Core/`.
- SubDirectoryFixer helper: `src/SubDirectoryFixer/`.
- Tests: `tests/GregModmanager.Tests/`.
- Build scripts: `build/scripts/`.
- Installer assets: `build/installer/`.
- Wiki submodule: `wiki/`.

## Architecture

- Core remains platform-agnostic and should not reference Avalonia.
- Avalonia references Core.
- Service registration belongs in the Avalonia `Program.cs` composition root.
- Platform-specific behavior should be behind runtime checks or compile-time guards.

## Release context

- Version source of truth: `src/GregModmanager.Avalonia/GregModmanager.Avalonia.csproj`.
- Changelog source of truth: `CHANGELOG.md`.
- Release promotion normally runs through `.github/workflows/promote-changelog.yml`.
48 changes: 42 additions & 6 deletions src/GregModmanager.Avalonia/Services/DialogService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,15 @@ namespace GregModmanager.Avalonia.Services;

public interface IDialogService
{
Task<bool> ShowConfirmAsync(string title, string message, string ok = "OK", string cancel = "Cancel");
Task ShowMessageAsync(string title, string message, string ok = "OK");
Task<string?> ShowPromptAsync(string title, string message, string ok = "OK", string cancel = "Cancel", string initialValue = "");
Task<bool> ShowConfirmAsync(string title, string message);
Task<bool> ShowConfirmAsync(string title, string message, string ok);
Task<bool> ShowConfirmAsync(string title, string message, string ok, string cancel);
Task ShowMessageAsync(string title, string message);
Task ShowMessageAsync(string title, string message, string ok);
Task<string?> ShowPromptAsync(string title, string message);
Task<string?> ShowPromptAsync(string title, string message, string ok);
Task<string?> ShowPromptAsync(string title, string message, string ok, string cancel);
Task<string?> ShowPromptAsync(string title, string message, string ok, string cancel, string initialValue);
}

public sealed class DialogService : IDialogService
Expand All @@ -23,7 +29,17 @@ public sealed class DialogService : IDialogService
return null;
}

public async Task<bool> ShowConfirmAsync(string title, string message, string ok = "OK", string cancel = "Cancel")
public Task<bool> ShowConfirmAsync(string title, string message)
{
return ShowConfirmAsync(title, message, "OK", "Cancel");
}

public Task<bool> ShowConfirmAsync(string title, string message, string ok)
{
return ShowConfirmAsync(title, message, ok, "Cancel");
}

public async Task<bool> ShowConfirmAsync(string title, string message, string ok, string cancel)
{
var window = GetTopLevel();
if (window == null) return false;
Expand Down Expand Up @@ -67,7 +83,12 @@ public async Task<bool> ShowConfirmAsync(string title, string message, string ok
return result == true;
}

public async Task ShowMessageAsync(string title, string message, string ok = "OK")
public Task ShowMessageAsync(string title, string message)
{
return ShowMessageAsync(title, message, "OK");
}

public async Task ShowMessageAsync(string title, string message, string ok)
{
var window = GetTopLevel();
if (window == null) return;
Expand Down Expand Up @@ -106,7 +127,22 @@ public async Task ShowMessageAsync(string title, string message, string ok = "OK
await dialog.ShowDialog(window);
}

public async Task<string?> ShowPromptAsync(string title, string message, string ok = "OK", string cancel = "Cancel", string initialValue = "")
public Task<string?> ShowPromptAsync(string title, string message)
{
return ShowPromptAsync(title, message, "OK", "Cancel", string.Empty);
}

public Task<string?> ShowPromptAsync(string title, string message, string ok)
{
return ShowPromptAsync(title, message, ok, "Cancel", string.Empty);
}

public Task<string?> ShowPromptAsync(string title, string message, string ok, string cancel)
{
return ShowPromptAsync(title, message, ok, cancel, string.Empty);
}

public async Task<string?> ShowPromptAsync(string title, string message, string ok, string cancel, string initialValue)
{
var window = GetTopLevel();
if (window == null) return null;
Expand Down
32 changes: 16 additions & 16 deletions src/GregModmanager.Core/Program.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
using System;
namespace GregModmanager;
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("gregModmanager Core CLI (Linux)");
Console.WriteLine("Version: 1.5.0");
Console.WriteLine("Ecosystem: gregFramework v1.0.0.30-pre");
// This is a stub for the Linux-compatible background logic
// GUI components are excluded in this target.
}
}
using System;

namespace GregModmanager;

public static class Program
{
public static void Main(string[] args)
{
Console.WriteLine("gregModmanager Core CLI (Linux)");
Console.WriteLine("Version: 1.5.0");
Console.WriteLine("Ecosystem: gregFramework v1.0.0.30-pre");

// This is a stub for the Linux-compatible background logic
// GUI components are excluded in this target.
}
}
Loading
Loading