Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
13eee7b
Remove defunct hooks
lightbull-stfc Aug 10, 2026
8de3ef4
Update protobuf message definitions
lightbull-stfc Aug 10, 2026
08e7e0d
Update EntityGroup enum
lightbull-stfc Aug 10, 2026
0a62fff
Refactor `sync.cc`, fix resources and starbase module sync, add suppo…
lightbull-stfc Aug 10, 2026
0c7368c
bump version to 1.1.6
lightbull-stfc Aug 10, 2026
615a551
Update libcurl configuration to use shared=false and enable openssl3
lightbull-stfc Aug 10, 2026
b8fd4de
Revert to older xmake version, enhance CI configuration to upload dia…
lightbull-stfc Aug 11, 2026
4dc9f40
Temporarily add timeouts to configuration jobs
lightbull-stfc Aug 11, 2026
135014d
Remove ParseEntitySlotsData due to changed function signature
lightbull-stfc Aug 11, 2026
ee0eb93
Enhance CI configuration for macOS builds and packaging
lightbull-stfc Aug 11, 2026
34fc102
Update cpr.libcurl configurations for platform-specific settings
lightbull-stfc Aug 11, 2026
5c12050
Refactor CI configuration for macOS builds to enhance launcher bundle…
lightbull-stfc Aug 11, 2026
cc2c773
Update cpr.libcurl configurations for macOS to include Apple-specific…
lightbull-stfc Aug 11, 2026
9ca5ecc
Improve caching and packaging processes in CI runs
lightbull-stfc Aug 11, 2026
bdb5225
Refactor release workflow
lightbull-stfc Aug 11, 2026
0a26e70
Add Windows DLL provenance marker
Guffawaffle Aug 3, 2026
bfcb89e
Attest trusted Windows DLL builds
Guffawaffle Aug 3, 2026
d681cd5
Merge remote-tracking branch 'origin/dev' into feature/windows-dll-pr…
Guffawaffle Aug 18, 2026
7f5f8d0
Prevent duplicate Spud detour targets
Guffawaffle Aug 29, 2026
9a3d297
feat: restore double-tap Escape exit
Guffawaffle Aug 29, 2026
ac12ed0
Add cross-platform notification audio cues
Guffawaffle Aug 29, 2026
801d19d
Fix held Escape counting as double tap
Guffawaffle Aug 29, 2026
05daae5
Warn when audio alerts lack toast hooks
Guffawaffle Aug 29, 2026
1159e9c
ci: use semver tags for workflow actions
Guffawaffle Aug 29, 2026
ab5a688
Merge remote-tracking branch 'origin/dev' into feature/windows-dll-pr…
Guffawaffle Aug 29, 2026
15904a6
ci: isolate artifact attestation permissions
Guffawaffle Aug 29, 2026
ebaf7b2
ci: retain producer identity for attestation retries
Guffawaffle Aug 29, 2026
71a311e
ci: reconstruct attestation identity from trusted context
Guffawaffle Aug 29, 2026
d835b52
feat: add native navigation shortcuts
Guffawaffle Aug 30, 2026
2fca4d2
fix: scope native shortcut to galaxy
Guffawaffle Aug 30, 2026
4e17dcd
fix: resolve live shortcut manager
Guffawaffle Aug 30, 2026
dbdc22f
fix: rely on configured zoom shortcuts
Guffawaffle Aug 30, 2026
abbe39c
docs: use valid equals shortcut token
Guffawaffle Aug 30, 2026
b32349b
feat: add native Events shortcut action
Guffawaffle Aug 30, 2026
f7111e6
fix: preserve native Galaxy shortcut alias
Guffawaffle Aug 30, 2026
7213776
feat: add efficient fleet transition notifications
Guffawaffle Aug 30, 2026
7d7e6e8
fix: harden fleet notification transitions
Guffawaffle Aug 30, 2026
fd0790e
fix: preserve fleet follow-through coverage
Guffawaffle Aug 30, 2026
ac52649
fix: stabilize fleet state before notifications
Guffawaffle Aug 30, 2026
2804dfd
fix: require quiet fleet seed window
Guffawaffle Aug 30, 2026
c810462
fix: finalize stable fleet baselines safely
Guffawaffle Aug 30, 2026
df01eae
fix: close fleet seed edge cases
Guffawaffle Aug 30, 2026
81f1f68
fix: stabilize fleet baseline sources
Guffawaffle Aug 30, 2026
b37977c
fix: observe hydrated fleet widget state
Guffawaffle Aug 30, 2026
59be3cc
fix: accumulate widget seed frames
Guffawaffle Aug 30, 2026
ad2396f
fix: preserve staggered widget baselines
Guffawaffle Aug 30, 2026
177fbb1
fix: reset fleet seed after manager loss
Guffawaffle Aug 30, 2026
4b14dfe
fix: retain fleet baseline provenance
Guffawaffle Aug 30, 2026
b4ebffd
fix: stabilize fleet source handoff
Guffawaffle Aug 30, 2026
9ea4fa7
fix: validate fleet source before events
Guffawaffle Aug 30, 2026
5ff4120
fix: cover fleet topology and widget opc
Guffawaffle Aug 30, 2026
19564c8
perf: avoid redundant fleet widget lookups
Guffawaffle Aug 30, 2026
9769fc3
Merge cross-platform notification audio foundation
Guffawaffle Aug 30, 2026
192ced5
feat: add configurable fleet audio alerts
Guffawaffle Aug 30, 2026
2fab58b
fix: fail closed on fleet audio config
Guffawaffle Aug 30, 2026
680ea00
feat: enable fleet audio on macOS
Guffawaffle Aug 30, 2026
7b6911d
docs: clarify cross-platform fleet audio gating
Guffawaffle Aug 30, 2026
ee7f7f5
fix: reopen bulk claim flyout on shop return
Guffawaffle Aug 30, 2026
4f045c0
fix: fail closed on bulk flyout hook drift
Guffawaffle Aug 30, 2026
4596a43
Merge bulk-claim lifecycle improvements
Guffawaffle Aug 30, 2026
7a6e89c
Merge remote-tracking branch 'origin/dev' into local/all-improvements
Guffawaffle Aug 30, 2026
3c83263
Add configurable fleet label detail
Guffawaffle Aug 30, 2026
07786a6
Merge ship label detail controls
Guffawaffle Aug 30, 2026
56f653f
Allow fleet audio cues without system notifications
Guffawaffle Aug 30, 2026
2308169
Merge fleet audio configuration fix
Guffawaffle Aug 30, 2026
4eba957
Add All option for disabled audio events
Guffawaffle Aug 31, 2026
6ae3b52
Cover Fabric event object audio routes
Guffawaffle Aug 31, 2026
802e60f
Harden global audio suppression policy
Guffawaffle Aug 31, 2026
e116f9e
Match Spud x64 hook target resolution
Guffawaffle Aug 31, 2026
668dbc4
Merge global audio suppression option
Guffawaffle Aug 31, 2026
6077e33
Add local officer preset reordering
Guffawaffle Aug 31, 2026
c2a4434
Harden preset reorder input and state writes
Guffawaffle Aug 31, 2026
87b95b5
Scope preset state to config profiles
Guffawaffle Aug 31, 2026
634d354
Merge officer preset reordering
Guffawaffle Aug 31, 2026
223324a
Add mod shortcut hints to native overlay
Guffawaffle Aug 31, 2026
8a6807b
Harden shortcut hint state transitions
Guffawaffle Aug 31, 2026
05bea0d
Refresh shortcut hints when shown
Guffawaffle Aug 31, 2026
42d0742
Hook shortcut visibility at safe method boundary
Guffawaffle Aug 31, 2026
c3774fa
Merge mod shortcut hints
Guffawaffle Aug 31, 2026
d1f12b4
Keep officer preset identity order canonical
Guffawaffle Aug 31, 2026
10eacd1
Fix macOS officer preset array build
Guffawaffle Aug 31, 2026
76910a0
Keep officer preset identity order canonical
Guffawaffle Aug 31, 2026
6d7fef7
Fix macOS officer preset array build
Guffawaffle Aug 31, 2026
61b0f87
Fix fleet label hooks and add type profiles
Guffawaffle Sep 1, 2026
e47468c
Rename fleet label zoom settings
Guffawaffle Sep 1, 2026
909e8fa
Document detour size validation
Guffawaffle Sep 1, 2026
1df1afc
Merge corrected ship label detail controls
Guffawaffle Sep 1, 2026
5dc6cb8
Trim global audio wildcard handling
Guffawaffle Sep 1, 2026
695bd81
Merge trimmed audio wildcard handling
Guffawaffle Sep 1, 2026
0d1ce20
Preserve bounded string view conversions
Guffawaffle Sep 1, 2026
34a09a2
Fix fleet label bind lifecycle
Guffawaffle Sep 1, 2026
0a2ace7
Merge fleet label lifecycle fix
Guffawaffle Sep 1, 2026
a947ae0
Guard Fleet Watch service readiness
Guffawaffle Sep 1, 2026
90813b4
Merge Fleet Watch service readiness fix
Guffawaffle Sep 1, 2026
5ae7c51
Merge current dev into all improvements
Guffawaffle Sep 1, 2026
0575a46
Merge Windows DLL provenance
Guffawaffle Sep 1, 2026
477f2ef
Merge duplicate Spud target enforcement
Guffawaffle Sep 1, 2026
fc2f495
Merge double-tap Escape exit
Guffawaffle Sep 1, 2026
95bf4ba
Merge current officer preset reordering
Guffawaffle Sep 1, 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
120 changes: 109 additions & 11 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,24 @@ env:
jobs:
build-win:
runs-on: windows-2025-vs2026
outputs:
run_attempt: ${{ steps.build_identity.outputs.run_attempt }}
permissions:
actions: read
contents: read
env:
STFC_MSVC_SCCACHE: "1"
WINDOWS_SCCACHE_SCHEMA: "v1"
SCCACHE_DIR: ${{ github.workspace }}/build/.windows-sccache
SCCACHE_CACHE_SIZE: "2G"

steps:
- name: Capture build identity
id: build_identity
shell: pwsh
run: |
"run_attempt=${{ github.run_attempt }}" >> $env:GITHUB_OUTPUT

- name: Checkout
uses: actions/checkout@v7
with:
Expand All @@ -58,7 +69,7 @@ jobs:
key: xmake-tool-${{ runner.os }}-${{ runner.arch }}-${{ env.XMAKE_VERSION }}-${{ env.XMAKE_CACHE_SCHEMA }}

- name: Setup XMake
uses: xmake-io/github-action-setup-xmake@v1
uses: xmake-io/github-action-setup-xmake@v1.2.5
with:
xmake-version: ${{ env.XMAKE_VERSION }}

Expand Down Expand Up @@ -119,7 +130,27 @@ jobs:
- name: Configure
id: configure_windows
timeout-minutes: 30
run: xmake f -m release -y -v
shell: pwsh
run: |
$commit = (git rev-parse HEAD).Trim()
if ($commit -notmatch '^[0-9a-f]{40}$') {
throw "Unable to resolve the checked-out commit for DLL provenance."
}

$sourceState = "git:$commit"
$buildInvocation = "github:${{ github.run_id }}:${{ github.run_attempt }}:windows"
$identity = "stfc-identity-v1;distribution=netniv.stfc-community-mod;source=$sourceState;" +
"base=$commit;build=$buildInvocation;mode=release;channel=ci"
"STFC_EXPECTED_IDENTITY=$identity" >> $env:GITHUB_ENV

$xmakeArgs = @(
'f', '-m', 'release', '-y', '-v',
"--stfc_source_state_id=$sourceState",
"--stfc_base_commit=$commit",
"--stfc_build_invocation_id=$buildInvocation",
'--stfc_build_channel=ci'
)
xmake @xmakeArgs

- name: Verify dependency lock
shell: pwsh
Expand All @@ -146,7 +177,7 @@ jobs:

- name: Upload configure diagnostics
if: ${{ failure() && steps.configure_windows.outcome == 'failure' }}
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v7.0.1
with:
name: xmake-configure-diagnostics-windows
path: ~/.xmake/cache/packages/**/installdir.failed/logs/install.txt
Expand All @@ -172,8 +203,18 @@ jobs:
"build/windows/x64/release/stfc-community-mod.dll" `
"version.dll"

- name: Verify DLL provenance
shell: pwsh
run: |
$dll = (Resolve-Path -LiteralPath 'version.dll').Path
$comments = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($dll).Comments
if (-not [string]::Equals($comments, $env:STFC_EXPECTED_IDENTITY, [System.StringComparison]::Ordinal)) {
throw "DLL provenance mismatch. Expected '$env:STFC_EXPECTED_IDENTITY'; found '$comments'."
}
Write-Host "Verified DLL provenance: $comments"

- name: Upload
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v7.0.1
with:
name: stfc-community-mod
path: version.dll
Expand Down Expand Up @@ -208,6 +249,63 @@ jobs:
path: ${{ runner.tool_cache }}/xmake
key: ${{ steps.restore_xmake.outputs.cache-primary-key }}

attest-win:
name: attest-win
needs: build-win
if: >-
github.event_name == 'push' &&
github.repository == 'netniV/stfc-mod' &&
github.ref_protected &&
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev')
runs-on: windows-2025-vs2026
permissions:
actions: read
contents: read
id-token: write
attestations: write

steps:
- name: Download Windows DLL
uses: actions/download-artifact@v8.0.1
with:
name: stfc-community-mod
path: .artifacts/windows

- name: Verify DLL provenance
shell: pwsh
env:
STFC_SOURCE_COMMIT: ${{ github.sha }}
STFC_RUN_ID: ${{ github.run_id }}
STFC_BUILD_RUN_ATTEMPT: ${{ needs.build-win.outputs.run_attempt }}
run: |
$dll = (Resolve-Path -LiteralPath '.artifacts/windows/version.dll').Path
$commit = $env:STFC_SOURCE_COMMIT
$runId = $env:STFC_RUN_ID
$buildAttempt = $env:STFC_BUILD_RUN_ATTEMPT

if ($commit -notmatch '^[0-9a-f]{40}$') {
throw "Unable to resolve the workflow commit for DLL provenance."
}
if ($runId -notmatch '^[1-9][0-9]*$') {
throw "Unable to resolve the workflow run ID for DLL provenance."
}
if ($buildAttempt -notmatch '^[1-9][0-9]*$') {
throw "The producing build did not provide a valid run attempt."
}

$expected = "stfc-identity-v1;distribution=netniv.stfc-community-mod;source=git:$commit;" +
"base=$commit;build=github:${runId}:${buildAttempt}:windows;mode=release;channel=ci"
$comments = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($dll).Comments
if (-not [string]::Equals($comments, $expected, [System.StringComparison]::Ordinal)) {
throw "DLL provenance mismatch. Expected '$expected'; found '$comments'."
}
Write-Host "Verified DLL provenance: $comments"

- name: Attest Windows DLL
uses: actions/attest@v4.2.1
with:
subject-path: .artifacts/windows/version.dll

build-mac:
name: build-mac (${{ matrix.arch }})

Expand Down Expand Up @@ -249,7 +347,7 @@ jobs:
key: xmake-tool-${{ runner.os }}-${{ runner.arch }}-${{ env.XMAKE_VERSION }}-${{ env.XMAKE_CACHE_SCHEMA }}

- name: Setup XMake
uses: xmake-io/github-action-setup-xmake@v1
uses: xmake-io/github-action-setup-xmake@v1.2.5
with:
xmake-version: ${{ env.XMAKE_VERSION }}

Expand Down Expand Up @@ -359,7 +457,7 @@ jobs:

- name: Upload configure diagnostics
if: ${{ failure() && steps.configure.outcome == 'failure' }}
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v7.0.1
with:
name: xmake-configure-diagnostics-macos-${{ matrix.arch }}
path: ~/.xmake/cache/packages/**/installdir.failed/logs/install.txt
Expand Down Expand Up @@ -468,7 +566,7 @@ jobs:
fi

- name: Upload intermediate build
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v7.0.1
with:
name: ${{ matrix.artifact }}
path: macos-${{ matrix.arch }}-build.tar
Expand Down Expand Up @@ -532,13 +630,13 @@ jobs:
show-progress: false

- name: Download ARM64 build
uses: actions/download-artifact@v8
uses: actions/download-artifact@v8.0.1
with:
name: macos-arm64-build
path: .artifacts/arm64

- name: Download x86_64 build
uses: actions/download-artifact@v8
uses: actions/download-artifact@v8.0.1
with:
name: macos-x86_64-build
path: .artifacts/x86_64
Expand Down Expand Up @@ -740,15 +838,15 @@ jobs:
"$DMG_SOURCE/"

- name: Upload installer
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v7.0.1
with:
name: stfc-community-mod-installer
path: stfc-community-mod-installer.dmg
compression-level: 0
if-no-files-found: error

- name: Upload macOS mod archive
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@v7.0.1
with:
name: stfc-community-mod-macos-universal
path: stfc-community-mod-macos-universal
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ void SomeFunction_Hook(auto original, SomeClass* _this, ...) {
```
macOS does not tolerate repeated hooks of the same function. If multiple features need to intercept the same game method, consolidate the behavior behind one detour or add platform guards instead of installing overlapping hooks.
Do not over-focus on hidden IL2CPP `MethodInfo*` parameters during drift repair; match the game-visible signature from `dump.cs` unless there is concrete runtime evidence that the hidden parameter is the issue.
Before adding a detour to a small IL2CPP wrapper or thunk, verify its native method extent against SPUD's architecture-specific overwrite size on every supported architecture for the exact client build. A successful platform build does not validate hook fit; prefer a substantive downstream method when exact per-architecture extent is unavailable.

**IL2CPP class resolution** — Game classes are resolved at runtime using helpers:
```cpp
Expand Down
15 changes: 10 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ This project is maintained solely at my own cost of time, energy and money. Any

Please see the [INSTALL.md](INSTALL.md) instructions which has steps on how to use this mod with Star Trek Fleet Command.

For the Windows DLL identity marker, artifact-attestation trust boundary, and verification command, see
[Windows DLL provenance](docs/WINDOWS_DLL_PROVENANCE.md).

Please note, that whilst Mac support was added in this version, it's supported on an as-is basis due to lack of Mac development environments.

## Keyboard shortcuts
Expand All @@ -69,10 +72,10 @@ been applied. Valid values for any short can be found in [KEYMAPPING.md](KEYMAPP
| -----------: | -------------------------------- |
| F10 | Bug fixer (exits game) |
| F1-F5 | Zoom presets |
| Q | Zoom Out |
| E | Zoom In |
| Q | Zoom In |
| E | Zoom Out |
| MINUS | Zoom (min) |
| EQUALS | Zoom (default) |
| = | Zoom (default) |
| BACKSPACE | Zoom (max) |
| C | Open/Focus Chat - Full Screen |
| Alt-C | Open/Focus Chat - Side of Screen |
Expand Down Expand Up @@ -109,9 +112,12 @@ action items such as:

| Key | Shortcut |
| ------: | ---------------- |
| T | Events |
| T | Away Teams |
| G | Galaxy |
| Ctrl-G | Galaxy (native) |
| H | System |
| Shift-E | Events |
| Ctrl-E | Events (native) |
| Shift-G | Exterior View |
| Shift-H | Interior View |
| B | Bookmarks |
Expand All @@ -125,7 +131,6 @@ action items such as:
| O | Command Center |
| Shift-O | Officers |
| Shift-Q | Q-Trials |
| Shift-T | Away Teams |
| X | ExoComp |
| Z | Daily Missions |

Expand Down
34 changes: 34 additions & 0 deletions docs/WINDOWS_DLL_PROVENANCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Windows DLL provenance

Windows builds publish a `stfc-identity-v1` marker in the DLL's standard `Comments` version resource. The marker is
minimal, descriptive, and self-declared. It helps identify a build, but it is not evidence of authenticity and must
not be used as an authorization or trust decision by itself.

For protected `main` and `dev` pushes in `netniV/stfc-mod`, the upstream Build workflow creates a GitHub/Sigstore
build-provenance attestation for the exact `version.dll` bytes after verifying the embedded marker. Pull requests,
fork runs, unprotected refs, tags, and other repositories do not create authoritative attestations.

After downloading and extracting an attested DLL, verify its byte integrity, expected upstream workflow identity,
protected source ref, and reviewed source commit with a current GitHub CLI. Replace `<expected-commit-sha>` with the
40-character commit for the artifact:

```shell
gh attestation verify version.dll \
--repo netniV/stfc-mod \
--signer-workflow netniV/stfc-mod/.github/workflows/ci.yaml \
--source-ref refs/heads/main \
--source-digest <expected-commit-sha>
```

For a reviewed `dev` artifact, use `--source-ref refs/heads/dev` instead. Do not omit the source ref or digest when
making a trust decision.

Successful verification establishes that the exact file digest is covered by an attestation issued for the named
repository and signer workflow, including source commit provenance. It does not establish that the source,
dependencies, build environment, or resulting behavior are free from malicious or unsafe behavior. It also does not,
by itself, authorize the artifact as an official release.

The first authoritative upstream attestation can exist only after the attestation workflow is merged and then runs on
an eligible protected upstream push. Existing releases are unattested. Downstream consumers, including STFC Mod
Bridge, must continue to use exact reviewed file size and SHA-256 allowlists until an attested upstream artifact is
actually available and their attestation policy is separately reviewed.
Loading
Loading