-
Notifications
You must be signed in to change notification settings - Fork 4
Add ci builds / improve local builds #2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
DaymareOn
merged 29 commits into
DaymareOn:main
from
KaninHop:Improve-Builds-and-Add-CI
Apr 15, 2026
Merged
Changes from all commits
Commits
Show all changes
29 commits
Select commit
Hold shift + click to select a range
60bcdff
Add ci builds
KaninHop 3ffe3ae
Fix missing github action permission
KaninHop 98f13de
Address coderabbit feedback part 1
KaninHop b386b86
ensure dev paths don't get committed
KaninHop f3a2f28
revert jmap changes
KaninHop f550cbb
update tasks.json and complile.ps1 to work better with dev builds
KaninHop b052276
Fix build status url
KaninHop 96e05b7
more rabbit requested changes
KaninHop 3a8d3f9
Merge remote-tracking branch 'origin/main' into Improve-Builds-and-Ad…
KaninHop f99aef5
Merge branch 'Improve-Builds-and-Add-CI' into feat/add-frame-time-bug…
KaninHop 8c9fb45
Rabbit feedback and fix some incorrect labels when upgrading existing…
KaninHop efdfd3e
Rabbit fixes to improve loading robustness
KaninHop 1eb6bdb
fix Potential logic inconsistency between pre-check and sequential pa…
KaninHop e48240c
Switch to submodule for skyui, move stubs to dependencies folder
KaninHop 3ff1c32
Feat/add frame time buget with ci (#2)
KaninHop f28d241
Merge branch 'DaymareOn:main' into Improve-Builds-and-Add-CI
KaninHop b1bde03
Publish github release when tag is added
KaninHop 644546b
Merge branch 'Improve-Builds-and-Add-CI' of https://github.com/KaninH…
KaninHop a730813
Cleanup and rabbit feedback
KaninHop 0827de3
Remove old pex files before each build rabbit feedback
KaninHop 9c047f0
Ensure Ci and Local release builds are the same
KaninHop d6e9c2e
Fix rootDir Lookup - Rabbit Feedback
KaninHop 17311b6
Fix incorrect vanilla script stub
KaninHop fe9de8e
Update .github/workflows/build.yml
KaninHop 5092d16
Fix submodule declaration
KaninHop 17ecc8d
fix: remove ghost submodule Source/Scripts/Stubs/SkyUI-Community
KaninHop 5f5104f
Add default xml and separte max skelotons
KaninHop d8b89f5
Merge remote-tracking branch 'upstream/main' into Improve-Builds-and-…
KaninHop 3a1d6e9
Ensure the right compiled scripts are included
KaninHop File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,41 @@ | ||
| --- | ||
| description: Build the FSMP MCM Papyrus scripts using Caprica | ||
| --- | ||
|
|
||
| # Build FSMP MCM | ||
|
|
||
| Compiles the Papyrus source scripts (`.psc`) into compiled Papyrus executables (`.pex`) using the Caprica compiler. This project uses in-repo stubs for all dependencies, making it easy to build without external setup. | ||
|
|
||
| ## Prerequisites | ||
|
|
||
| - **Caprica Compiler**: `Caprica/Caprica.exe` must be present. | ||
| - If missing, download version 0.3.0a from [KrisV-777/Caprica Releases](https://github.com/KrisV-777/Caprica/releases/tag/0.3.0a). | ||
| - **PowerShell**: Used to run the build script. | ||
|
|
||
| ## Build Command | ||
|
|
||
| 1. Run the compilation script from the repository root: | ||
|
|
||
| ```powershell | ||
| # Default Release mode (uses stubs) | ||
| ./dev-scripts/compile.ps1 | ||
|
|
||
| # Dev mode (uses your real local scripts) | ||
| ./dev-scripts/compile.ps1 -Mode Dev | ||
| ``` | ||
|
|
||
| The compiled `.pex` files will be placed in the `Scripts/` directory. | ||
|
|
||
| ## Alternative: Papyrus Project (.ppj) | ||
|
|
||
| You can also use the `skyrimse.ppj` file with any Papyrus project runner (like `Pypro` or `Caprica` directly if your version supports it). | ||
|
|
||
| ```powershell | ||
| ./Caprica/Caprica.exe skyrimse.ppj | ||
| ``` | ||
|
|
||
| ## Notes | ||
|
|
||
| - The build script uses the `--ignorecwd` flag to prevent Caprica from auto-adding the CWD to imports, avoiding namespace conflicts. | ||
| - It also uses `--game skyrim` for Skyrim-specific compatibility. | ||
| - Warning `W4007` about `loadConfigDone` being unused is expected and harmless. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,90 @@ | ||
| name: Build FSMP MCM | ||
|
|
||
| on: | ||
| push: | ||
| branches: [main] | ||
| tags: | ||
| - 'v*.*.*' | ||
| - 'v*.*' | ||
| pull_request: | ||
| branches: [main] | ||
| workflow_dispatch: | ||
|
|
||
| permissions: | ||
| contents: write | ||
|
|
||
| jobs: | ||
| build: | ||
| runs-on: windows-latest | ||
|
KaninHop marked this conversation as resolved.
|
||
| steps: | ||
| - name: Checkout Repository | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| submodules: recursive | ||
|
|
||
| - name: Setup CI Dependencies | ||
| shell: powershell | ||
| run: ./dev-scripts/setup_ci.ps1 | ||
|
|
||
| - name: Compile Papyrus Scripts | ||
| shell: powershell | ||
| run: | | ||
| $flagsFile = Resolve-Path "Dependencies/Stubs/BaseGame/TESV_Papyrus_Flags.flg" | ||
| $imports = @( | ||
| (Resolve-Path "Source/Scripts"), | ||
| (Resolve-Path "Dependencies/SkyUI-Community/source/scripts"), | ||
| (Resolve-Path "Dependencies/Stubs/BaseGame"), | ||
| (Resolve-Path "Dependencies/Stubs/SKSE"), | ||
| (Resolve-Path "Dependencies/Stubs/JContainers"), | ||
| (Resolve-Path "Dependencies/Stubs/PapyrusUtil"), | ||
| (Resolve-Path "Dependencies/Stubs/ConsoleUtil") | ||
| ) -join ";" | ||
| if (-not (Test-Path "Scripts")) { New-Item -ItemType Directory -Path "Scripts" } | ||
| Remove-Item "Scripts/*.pex" -ErrorAction SilentlyContinue | ||
| $output = Resolve-Path "Scripts" | ||
|
|
||
| # Compile FSMPM.psc | ||
| $fsmpm = Resolve-Path "Source/Scripts/FSMPM.psc" | ||
| & ./ci_tools/Caprica.exe --game skyrim --flags "$flagsFile" --import "$imports" --output "$output" --ignorecwd "$fsmpm" | ||
| if ($LASTEXITCODE -ne 0) { throw "FSMPM.psc compilation failed" } | ||
|
|
||
| # Compile FSMPMPlayerScript.psc | ||
| $player = Resolve-Path "Source/Scripts/FSMPMPlayerScript.psc" | ||
| & ./ci_tools/Caprica.exe --game skyrim --flags "$flagsFile" --import "$imports" --output "$output" --ignorecwd "$player" | ||
| if ($LASTEXITCODE -ne 0) { throw "FSMPMPlayerScript.psc compilation failed" } | ||
|
|
||
| Write-Host "All scripts compiled successfully." | ||
| Get-ChildItem Scripts/*.pex | ForEach-Object { Write-Host " $($_.Name) - $($_.Length) bytes" } | ||
|
|
||
| - name: Package Distributable | ||
| shell: powershell | ||
| run: | | ||
| $buildDir = "Build/FSMPM - The FSMP MCM" | ||
| if (Test-Path "Build") { Remove-Item -Recurse -Force "Build" } | ||
| New-Item -ItemType Directory -Path "$buildDir/Scripts" -Force | ||
| New-Item -ItemType Directory -Path "$buildDir/SKSE/Plugins/hdtSkinnedMeshConfigs/configsPresets" -Force | ||
| New-Item -ItemType Directory -Path "$buildDir/Source/Scripts" -Force | ||
|
|
||
| Copy-Item "FSMPM - The FSMP MCM.esp" $buildDir/ | ||
| Copy-Item Scripts/*.pex "$buildDir/Scripts/" | ||
| Copy-Item SKSE/Plugins/hdtSkinnedMeshConfigs/configs.xml "$buildDir/SKSE/Plugins/hdtSkinnedMeshConfigs/" | ||
| Copy-Item SKSE/Plugins/hdtSkinnedMeshConfigs/configsPresets/*.xml "$buildDir/SKSE/Plugins/hdtSkinnedMeshConfigs/configsPresets/" | ||
| Copy-Item Source/Scripts/*.psc "$buildDir/Source/Scripts/" | ||
|
|
||
| Compress-Archive -Path "$buildDir/*" -DestinationPath "Build/FSMP-MCM.zip" -Force | ||
| Write-Host "Distributable archive created: Build/FSMP-MCM.zip" | ||
|
|
||
| - name: Upload Build Artifact | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: FSMP-MCM | ||
| path: Build/FSMP-MCM.zip | ||
|
|
||
| - name: Publish GitHub Release | ||
| if: startsWith(github.ref, 'refs/tags/v') | ||
| uses: softprops/action-gh-release@v2 | ||
| with: | ||
| files: Build/FSMP-MCM.zip | ||
| name: FSMP-MCM ${{ github.ref_name }} | ||
| draft: false | ||
| prerelease: false | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| # Build artifacts | ||
| Build/ | ||
|
|
||
| # Local configuration | ||
| Caprica/Caprica.exe | ||
| skyrimse.dev.ppj | ||
|
|
||
|
|
||
| # OS generated files | ||
| .DS_Store | ||
| Thumbs.db |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| [submodule "Dependencies/SkyUI-Community"] | ||
| path = Dependencies/SkyUI-Community | ||
| url = https://github.com/doodlum/SkyUI-Community.git |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Submodule SkyUI-Community
added at
de600b
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| ; Minimal stub for CI builds | ||
| Scriptname Actor extends ObjectReference Hidden | ||
|
|
||
| Function AddToFaction(Faction akFaction) native | ||
| Function RemoveFromFaction(Faction akFaction) native | ||
| Function StopCombat() native | ||
| Function EvaluatePackage() native | ||
| Function Kill(Actor akKiller = None) native |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,49 @@ | ||
| ; Minimal stub for CI builds | ||
| Scriptname Alias Hidden | ||
|
|
||
| Quest Function GetOwningQuest() native | ||
| bool Function RegisterForAnimationEvent(ObjectReference akSender, string asEventName) native | ||
| Function RegisterForLOS(Actor akViewer, ObjectReference akTarget) native | ||
| Function RegisterForSingleLOSGain(Actor akViewer, ObjectReference akTarget) native | ||
| Function RegisterForSingleLOSLost(Actor akViewer, ObjectReference akTarget) native | ||
| Function RegisterForSingleUpdate(float afInterval) native | ||
| Function RegisterForUpdate(float afInterval) native | ||
| Function RegisterForUpdateGameTime(float afInterval) native | ||
| Function RegisterForSingleUpdateGameTime(float afInterval) native | ||
| Function RegisterForSleep() native | ||
| Function RegisterForTrackedStatsEvent() native | ||
| Function StartObjectProfiling() native | ||
| Function StopObjectProfiling() native | ||
| Function UnregisterForLOS(Actor akViewer, ObjectReference akTarget) native | ||
| Function UnregisterForAnimationEvent(ObjectReference akSender, string asEventName) native | ||
| Function UnregisterForSleep() native | ||
| Function UnregisterForTrackedStatsEvent() native | ||
| Function UnregisterForUpdate() native | ||
| Function UnregisterForUpdateGameTime() native | ||
|
|
||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
| Event OnAnimationEvent(ObjectReference akSource, string asEventName) | ||
| EndEvent | ||
|
|
||
| Event OnAnimationEventUnregistered(ObjectReference akSource, string asEventName) | ||
| EndEvent | ||
|
|
||
| Event OnGainLOS(Actor akViewer, ObjectReference akTarget) | ||
| EndEvent | ||
|
|
||
| Event OnLostLOS(Actor akViewer, ObjectReference akTarget) | ||
| EndEvent | ||
|
|
||
| Event OnSleepStart(float afSleepStartTime, float afDesiredSleepEndTime) | ||
| EndEvent | ||
|
|
||
| Event OnSleepStop(bool abInterrupted) | ||
| EndEvent | ||
|
|
||
| Event OnTrackedStatsEvent(string arStatName, int aiStatValue) | ||
| EndEvent | ||
|
|
||
| Event OnUpdate() | ||
| EndEvent | ||
|
|
||
| Event OnUpdateGameTime() | ||
| EndEvent | ||
|
KaninHop marked this conversation as resolved.
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| ; Minimal stub for CI builds | ||
| Scriptname Debug Hidden | ||
|
|
||
| Function MessageBox(string asMessageBoxText) native global | ||
| Function Notification(string asNotificationText) native global | ||
| Function Trace(string asTextToPrint, int aiSeverity = 0) native global | ||
| Function TraceStack(string asTextToPrint = "Tracing stack on request", int aiSeverity = 0) native global | ||
| bool Function TraceUser(string asUserLog, string asTextToPrint, int aiSeverity = 0) native global |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| ; Minimal forward-declaration stub for CI builds | ||
| Scriptname Faction extends Form Hidden |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,58 @@ | ||
| ; Minimal stub for CI builds - provides the base Form class | ||
| ; This is an interface-only file for compilation purposes | ||
| Scriptname Form Hidden | ||
|
|
||
| Int Function GetFormID() native | ||
| int Function GetGoldValue() native | ||
| bool Function HasKeyword(Keyword akKeyword) native | ||
| bool Function PlayerKnows() native | ||
| bool Function RegisterForAnimationEvent(ObjectReference akSender, string asEventName) native | ||
| Function RegisterForLOS(Actor akViewer, ObjectReference akTarget) native | ||
| Function RegisterForSingleLOSGain(Actor akViewer, ObjectReference akTarget) native | ||
| Function RegisterForSingleLOSLost(Actor akViewer, ObjectReference akTarget) native | ||
| Function RegisterForSingleUpdate(float afInterval) native | ||
| Function RegisterForSleep() native | ||
| Function RegisterForTrackedStatsEvent() native | ||
| Function RegisterForUpdate(float afInterval) native | ||
| Function RegisterForUpdateGameTime(float afInterval) native | ||
| Function RegisterForSingleUpdateGameTime(float afInterval) native | ||
| Function StartObjectProfiling() native | ||
| Function StopObjectProfiling() native | ||
| Function UnregisterForAnimationEvent(ObjectReference akSender, string asEventName) native | ||
| Function UnregisterForLOS(Actor akViewer, ObjectReference akTarget) native | ||
| Function UnregisterForSleep() native | ||
| Function UnregisterForTrackedStatsEvent() native | ||
| Function UnregisterForUpdate() native | ||
| Function UnregisterForUpdateGameTime() native | ||
|
|
||
| ; SKSE additions | ||
| Function RegisterForModEvent(string eventName, string callbackName) native | ||
| Function UnregisterForModEvent(string eventName) native | ||
| Function SendModEvent(string eventName, string strArg = "", float numArg = 0.0) native | ||
|
KaninHop marked this conversation as resolved.
|
||
|
|
||
| Event OnAnimationEvent(ObjectReference akSource, string asEventName) | ||
| EndEvent | ||
|
|
||
| Event OnAnimationEventUnregistered(ObjectReference akSource, string asEventName) | ||
| EndEvent | ||
|
|
||
| Event OnGainLOS(Actor akViewer, ObjectReference akTarget) | ||
| EndEvent | ||
|
|
||
| Event OnLostLOS(Actor akViewer, ObjectReference akTarget) | ||
| EndEvent | ||
|
|
||
| Event OnSleepStart(float afSleepStartTime, float afDesiredSleepEndTime) | ||
| EndEvent | ||
|
|
||
| Event OnSleepStop(bool abInterrupted) | ||
| EndEvent | ||
|
|
||
| Event OnTrackedStatsEvent(string arStatName, int aiStatValue) | ||
| EndEvent | ||
|
|
||
| Event OnUpdate() | ||
| EndEvent | ||
|
|
||
| Event OnUpdateGameTime() | ||
| EndEvent | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| ; Minimal forward-declaration stub for CI builds | ||
| Scriptname GlobalVariable extends Form Hidden | ||
|
|
||
| Function SetValue(float afNewValue) native | ||
| float Function GetValue() native | ||
| float Function Mod(float afHowMuch) native |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| ; Minimal forward-declaration stub for CI builds | ||
| Scriptname Keyword extends Form Hidden |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| ; Minimal stub for CI builds | ||
| Scriptname ObjectReference extends Form Hidden | ||
|
|
||
| Function Disable(bool abFadOut = false) native | ||
| Function DisableNoWait(bool abFadOut = false) native | ||
| Function Enable(bool abFadIn = false) native | ||
| Function EnableNoWait(bool abFadIn = false) native | ||
| Function MoveTo(ObjectReference akTarget, float afXOffset = 0.0, float afYOffset = 0.0, float afZOffset = 0.0, bool abMatchRotation = true) native | ||
| Function Reset() native | ||
|
|
||
| Event OnActivate(ObjectReference akActionRef) | ||
| EndEvent | ||
|
|
||
| Event OnInit() | ||
| EndEvent |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,39 @@ | ||
| ; Minimal stub for CI builds | ||
| Scriptname Quest extends Form Hidden | ||
|
|
||
| Function CompleteAllObjectives() native | ||
| Function CompleteQuest() native | ||
| Function FailAllObjectives() native | ||
| Alias Function GetAlias(int aiAliasID) native | ||
| int Function GetCurrentStageID() native | ||
| bool Function IsActive() native | ||
| bool Function IsCompleted() native | ||
| bool Function IsObjectiveCompleted(int aiObjective) native | ||
| bool Function IsObjectiveDisplayed(int aiObjective) native | ||
| bool Function IsObjectiveFailed(int aiObjective) native | ||
| bool Function IsRunning() native | ||
| bool Function IsStageDone(int aiStage) native | ||
| bool Function IsStarting() native | ||
| bool Function IsStopping() native | ||
| bool Function IsStopped() native | ||
| Function Reset() native | ||
| Function SetActive(bool abActive = true) native | ||
| bool Function SetCurrentStageID(int aiStageID) native | ||
| Function SetObjectiveCompleted(int aiObjective, bool abCompleted = true) native | ||
| Function SetObjectiveDisplayed(int aiObjective, bool abDisplayed = true, bool abForce = false) native | ||
| Function SetObjectiveFailed(int aiObjective, bool abFailed = true) native | ||
| bool Function Start() native | ||
| Function Stop() native | ||
| bool Function UpdateCurrentInstanceGlobal(GlobalVariable aUpdateGlobal) native | ||
|
|
||
| int Function GetStage() | ||
| return GetCurrentStageID() | ||
| EndFunction | ||
|
|
||
| bool Function GetStageDone(int aiStage) | ||
| return IsStageDone(aiStage) | ||
| EndFunction | ||
|
|
||
| bool Function SetStage(int aiStage) | ||
| return SetCurrentStageID(aiStage) | ||
| EndFunction |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix markdownlint issues (trailing space and final newline).
Line 11 has trailing whitespace, and the file should end with exactly one newline.
Suggested fix
Also applies to: 41-41
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)
[warning] 11-11: Trailing spaces
Expected: 0 or 2; Actual: 1
(MD009, no-trailing-spaces)
🤖 Prompt for AI Agents