From 4a1a8975a3e3b8de065bc24287d834c659f7ec38 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 13 Jul 2025 01:30:19 -0700 Subject: [PATCH 01/85] Rename properties to avoid namespace collisions, add more toggles --- .github/actions/compile/action.yml | 2 +- KSPBuildTools.csproj | 6 +- KSPCommon.props | 165 +++++++++++------------ KSPCommon.targets | 74 ++++++++-- docs/msbuild/generating-version-files.md | 4 +- docs/msbuild/properties.md | 16 +-- tests/plugin-mod-nuget/plugin-mod.csproj | 11 +- tests/plugin-mod/plugin-mod.csproj | 11 +- 8 files changed, 161 insertions(+), 128 deletions(-) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index d8c70dc..ab716de 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -76,5 +76,5 @@ runs: working-directory: ${{ inputs.working-directory }} run: | dotnet msbuild -p:Configuration=${{ inputs.build-configuration }} \ - -p:ManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} \ + -p:KSPManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} \ ${{ runner.debug && '-v:detailed' }} diff --git a/KSPBuildTools.csproj b/KSPBuildTools.csproj index aa6d9f9..4ebf998 100644 --- a/KSPBuildTools.csproj +++ b/KSPBuildTools.csproj @@ -24,7 +24,7 @@ 1701;1702;CS0649;CS1591;NU5128 2024 KSPModdingLibs Contributors KSPBuildTools - $(ProjectDir) + $(ProjectDir) KSPBuildTools README.md KSP Build Tools @@ -50,4 +50,8 @@ + + + + \ No newline at end of file diff --git a/KSPCommon.props b/KSPCommon.props index f9ce71c..c061bc3 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -4,47 +4,84 @@ true - + - true - - - - - true - true - - - - - 1.12 1.11 1.10 1.9 1.8 + + + true + + + true + + + true + + + + + + true + + + + + true + + + + true + + + + true + + + + + 1.12 1.11 1.10 1.9 1.8 + - - KSP_x64_Data\Managed - KSP.app\Contents\Resources\Data\Managed - KSP_Data\Managed + + + KSP_x64_Data/Managed + + + KSP.app/Contents/Resources/Data/Managed + + + KSP_Data/Managed + + - KSP_x64.exe - KSP.app/Contents/MacOS/KSP - KSP.x86_64 - C:\Program Files (x86)\Steam\steamapps\common\Kerbal Space Program - $(HOME)/Library/Application Support/Steam/steamapps/common/Kerbal Space Program + KSP_x64.exe + KSP.app/Contents/MacOS/KSP + KSP.x86_64 + + C:\Program Files (x86)\Steam\steamapps\common\Kerbal Space Program + + + $(HOME)/Library/Application Support/Steam/steamapps/common/Kerbal Space Program + - - $(SolutionDir.TrimEnd([System.IO.Path]::DirectorySeparatorChar)) - GameData/$(SolutionName) + + + $(ProjectDir)/../GameData/$(ProjectName)/ + + + $(KSPModGameData)/Plugins/ + - @@ -55,16 +92,16 @@ + - - $(ManagedRelativePath)/Assembly-CSharp.dll + $(KSPManagedRelativePath)/Assembly-CSharp.dll property + + - - - $(KSP_ROOT) + $(KSP_ROOT) environment variable @@ -73,86 +110,38 @@ + - - $(SolutionDir)KSP + $(SolutionDir)KSP solution directory + - $(ReferencePath) reference path + - $(SteamKSPRoot) steam - - - $(KSPRoot)/$(ManagedRelativePath) + + + $(KSPRoot)/$(KSPManagedRelativePath) Program - $(KSPRoot)\$(KSPExecutable) + $(KSPRoot)/$(KSPExecutable) $(KSPRoot) portable - - - - true - - true - - false - $(ManagedPath) - - - - - - System (KSP/Mono) - False - - - System (KSP/Mono) - False - - - System.Core (KSP/Mono) - False - - - System.Xml (KSP/Mono) - False - - - - - UnityEngine - False - - - - - Assembly-CSharp - False - - - Assembly-CSharp-firstpass - False - - - - + diff --git a/KSPCommon.targets b/KSPCommon.targets index fdc4607..a377d89 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -8,8 +8,57 @@ - + + > + + true + + true + + false + $(ManagedPath) + true + + + + + + System (KSP/Mono) + False + + + System (KSP/Mono) + False + + + System.Core (KSP/Mono) + False + + + System.Xml (KSP/Mono) + False + + + + + UnityEngine + False + + + + + Assembly-CSharp + False + + + Assembly-CSharp-firstpass + False + + + + - - - + + - + + - - + + @@ -82,9 +132,7 @@ - + @@ -110,7 +158,7 @@ Otherwise 0.0 is used (no minimum version) --> + Condition=" '$(GenerateKSPAssemblyDependencyAttributes)' == 'true' "> $([System.String]::Copy('%(Reference.identity)').Split(',')[0]) @@ -156,7 +204,9 @@ - + $(ProjectName) diff --git a/docs/msbuild/generating-version-files.md b/docs/msbuild/generating-version-files.md index 43e72c5..ede9715 100644 --- a/docs/msbuild/generating-version-files.md +++ b/docs/msbuild/generating-version-files.md @@ -8,7 +8,7 @@ To use, add the following to your csproj, filling in the URLs and paths for your - $(RepoRootPath)GameData/MyMod/mymod.version + $(KSPModRoot)/mymod.version https://github.com/username/repo/releases/latest/download/mymod.version https://github.com/username.repo/releases/latest @@ -44,7 +44,7 @@ The `include` value can also be set to a json file including any other values yo - $(RepoRootPath)GameData/MyMod/mymod.version + $(KSPModRoot)/mymod.version ``` \ No newline at end of file diff --git a/docs/msbuild/properties.md b/docs/msbuild/properties.md index 97d35e2..6eea55b 100644 --- a/docs/msbuild/properties.md +++ b/docs/msbuild/properties.md @@ -4,20 +4,20 @@ This property should be set to the root directory of your KSP install. You should not set this in your csproj, see [Locating your KSP Install](getting-started.md/#locating-your-ksp-install) ``` -```{confval} RepoRootPath +```{confval} KSPModRoot --- -default: `$(SolutionDir)` +default: `$(ProjectDir)/../GameData/$(ProjectName)/` --- -specifies the root directory of your mod repository. Generally you'll want to set this to be relative to the csproj file using `$(MSBuildThisFileDirectory)`. +specifies the root directory of your mod (the folder that gets placed into GameData). Generally you'll want to set this to be relative to the csproj file using `$(MSBuildThisFileDirectory)`. ``` -```{confval} BinariesOutputRelativePath +```{confval} KSPModPluginFolder --- -default: `GameData/$(SolutionName)` +default: `$(KSPModRoot)/Plugins` --- -the directory where compiled binaries should be copied. This is relative to the `RepoRootPath`. The binaries will be copied to this directory after each build. +the directory where compiled binaries should be copied. This is relative to the `KSPModRoot`. The binaries will be copied to this directory after each build. ``` ```{confval} CKANCompatibleVersions @@ -36,14 +36,14 @@ If set to `true`, automatically generates the `KSPAssembly` for your assembly fr If set to `true`, automatically generates `KSPAssemblyDependency` attributes for each dependency. Dependencies should have either the `CKANIdentifier` metadata or `KSPAssemblyName` metadata. Versions can be supplied with `CKANVersion` or `KSPAssemblyVersion`. ``` -```{confval} ReferenceUnityAssemblies +```{confval} ReferenceKSPUnityAssemblies --- default: `true` --- If set to `true`, adds assembly references to all UnityEngine assemblies in the KSP install. You can set this to `false` to opt out of this behavior if you want to create a pure C# assembly that does not depend on Unity. ``` -```{confval} ReferenceKSPAssemblies +```{confval} ReferenceKSPGameAssemblies --- default: `true` --- diff --git a/tests/plugin-mod-nuget/plugin-mod.csproj b/tests/plugin-mod-nuget/plugin-mod.csproj index 68f03b2..a8ff565 100644 --- a/tests/plugin-mod-nuget/plugin-mod.csproj +++ b/tests/plugin-mod-nuget/plugin-mod.csproj @@ -22,8 +22,8 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginModNuget - $(MSBuildThisFileDirectory) - GameData/plugin-mod-nuget + $(MSBuildThisFileDirectory)GameData/plugin-mod-nuget/ + $(KSPModRoot)/ @@ -39,12 +39,7 @@ - $(RepoRootPath)$(BinariesOutputRelativePath)/plugin-mod-nuget.version + $(KSPModRoot)/plugin-mod-nuget.version - - - true - true - diff --git a/tests/plugin-mod/plugin-mod.csproj b/tests/plugin-mod/plugin-mod.csproj index 4a3cc0f..ce4a55b 100644 --- a/tests/plugin-mod/plugin-mod.csproj +++ b/tests/plugin-mod/plugin-mod.csproj @@ -17,8 +17,8 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginMod - $(MSBuildThisFileDirectory) - GameData/plugin-mod + $(MSBuildThisFileDirectory)GameData/plugin-mod/ + $(KSPModRoot)/ @@ -34,14 +34,9 @@ - $(RepoRootPath)$(BinariesOutputRelativePath)/plugin-mod.version + $(KSPModRoot)/plugin-mod.version - - true - true - - From 5fa2acd600ed54be4d1e73e7defd3cd734178ac3 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 13 Jul 2025 01:31:45 -0700 Subject: [PATCH 02/85] fix syntax error --- KSPCommon.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index a377d89..f5210d0 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -9,7 +9,7 @@ - > + true From 08ad322cdb5533ecc2426d7024f0f9f74db89349 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 13 Jul 2025 17:02:04 -0700 Subject: [PATCH 03/85] Fix logic error double-importing system assemblies --- KSPCommon.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index f5210d0..3b2da26 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -9,7 +9,7 @@ - + true From 31852ae7185860db8883b15c509228bc01174805 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 13 Jul 2025 18:22:40 -0700 Subject: [PATCH 04/85] move references back where they belong, fix whitespace --- KSPCommon.props | 111 +++++++++++++++++++++++++++------------------- KSPCommon.targets | 51 --------------------- 2 files changed, 66 insertions(+), 96 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index c061bc3..fd31c0a 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -7,77 +7,47 @@ - - true - - - true - - - true - + true + true + true - - true - + true - - true - + true - - true - + true - - true - + true - - 1.12 1.11 1.10 1.9 1.8 - + 1.12 1.11 1.10 1.9 1.8 - - KSP_x64_Data/Managed - - - KSP.app/Contents/Resources/Data/Managed - - - KSP_Data/Managed - + KSP_x64_Data/Managed + KSP.app/Contents/Resources/Data/Managed + KSP_Data/Managed KSP_x64.exe KSP.app/Contents/MacOS/KSP KSP.x86_64 - - C:\Program Files (x86)\Steam\steamapps\common\Kerbal Space Program - - - $(HOME)/Library/Application Support/Steam/steamapps/common/Kerbal Space Program - + C:\Program Files (x86)\Steam\steamapps\common\Kerbal Space Program + $(HOME)/Library/Application Support/Steam/steamapps/common/Kerbal Space Program - - $(ProjectDir)/../GameData/$(ProjectName)/ - - - $(KSPModGameData)/Plugins/ - + $(ProjectDir)/../GameData/$(ProjectName)/ + $(KSPModGameData)/Plugins/ @@ -141,6 +111,57 @@ portable + + + + true + + true + + false + $(ManagedPath) + true + + + + + + + System (KSP/Mono) + False + + + System (KSP/Mono) + False + + + System.Core (KSP/Mono) + False + + + System.Xml (KSP/Mono) + False + + + + + UnityEngine + False + + + + + Assembly-CSharp + False + + + Assembly-CSharp-firstpass + False + + + + diff --git a/KSPCommon.targets b/KSPCommon.targets index 3b2da26..506a6d5 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -7,57 +7,6 @@ - - - - - true - - true - - false - $(ManagedPath) - true - - - - - - System (KSP/Mono) - False - - - System (KSP/Mono) - False - - - System.Core (KSP/Mono) - False - - - System.Xml (KSP/Mono) - False - - - - - UnityEngine - False - - - - - Assembly-CSharp - False - - - Assembly-CSharp-firstpass - False - - - - $(ProjectDir)/../GameData/$(ProjectName)/ - $(KSPModGameData)/Plugins/ + + diff --git a/KSPCommon.targets b/KSPCommon.targets index 506a6d5..0188e67 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -29,8 +29,8 @@ - - + + diff --git a/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj b/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj index b269787..72bb719 100644 --- a/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj +++ b/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj @@ -50,10 +50,6 @@ prompt MinimumRecommendedRules.ruleset - - $(MSBuildThisFileDirectory)../ - GameData/plugin-mod-legacy - diff --git a/tests/plugin-mod-nuget/plugin-mod.csproj b/tests/plugin-mod-nuget/plugin-mod.csproj index a8ff565..d406465 100644 --- a/tests/plugin-mod-nuget/plugin-mod.csproj +++ b/tests/plugin-mod-nuget/plugin-mod.csproj @@ -22,8 +22,6 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginModNuget - $(MSBuildThisFileDirectory)GameData/plugin-mod-nuget/ - $(KSPModRoot)/ diff --git a/tests/plugin-mod/plugin-mod.csproj b/tests/plugin-mod/plugin-mod.csproj index ce4a55b..38f7614 100644 --- a/tests/plugin-mod/plugin-mod.csproj +++ b/tests/plugin-mod/plugin-mod.csproj @@ -17,8 +17,6 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginMod - $(MSBuildThisFileDirectory)GameData/plugin-mod/ - $(KSPModRoot)/ From e2b205e34740eb6005e1250e16f00e39d66b6661 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 13 Jul 2025 19:01:43 -0700 Subject: [PATCH 06/85] fix project path/name variables --- KSPCommon.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KSPCommon.props b/KSPCommon.props index 281e775..8e1e5e0 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -46,7 +46,7 @@ - $(ProjectDir)/../GameData/$(ProjectName)/ + $(MSBuildProjectDirectory)/../GameData/$(MSBuildProjectName)/ From cdc5ef664a38ac5898afbdc8d188d67879c4cc87 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 13 Jul 2025 19:12:03 -0700 Subject: [PATCH 07/85] fix test mod roots --- tests/plugin-mod-nuget/plugin-mod.csproj | 1 + tests/plugin-mod/plugin-mod.csproj | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/plugin-mod-nuget/plugin-mod.csproj b/tests/plugin-mod-nuget/plugin-mod.csproj index d406465..8fa0bd4 100644 --- a/tests/plugin-mod-nuget/plugin-mod.csproj +++ b/tests/plugin-mod-nuget/plugin-mod.csproj @@ -22,6 +22,7 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginModNuget + $(MSBuildThisFileDirectory) diff --git a/tests/plugin-mod/plugin-mod.csproj b/tests/plugin-mod/plugin-mod.csproj index 38f7614..9d1b7a8 100644 --- a/tests/plugin-mod/plugin-mod.csproj +++ b/tests/plugin-mod/plugin-mod.csproj @@ -17,6 +17,7 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginMod + $(MSBuildThisFileDirectory) From ce6db033bad9c310e4b9243b3059bda64b381160 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 13 Jul 2025 19:14:22 -0700 Subject: [PATCH 08/85] oops --- tests/plugin-mod-nuget/plugin-mod.csproj | 2 +- tests/plugin-mod/plugin-mod.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/plugin-mod-nuget/plugin-mod.csproj b/tests/plugin-mod-nuget/plugin-mod.csproj index 8fa0bd4..0e5ec71 100644 --- a/tests/plugin-mod-nuget/plugin-mod.csproj +++ b/tests/plugin-mod-nuget/plugin-mod.csproj @@ -22,7 +22,7 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginModNuget - $(MSBuildThisFileDirectory) + $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) diff --git a/tests/plugin-mod/plugin-mod.csproj b/tests/plugin-mod/plugin-mod.csproj index 9d1b7a8..1feffeb 100644 --- a/tests/plugin-mod/plugin-mod.csproj +++ b/tests/plugin-mod/plugin-mod.csproj @@ -17,7 +17,7 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginMod - $(MSBuildThisFileDirectory) + $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) From 1c41d5fac02c818b0c8461348b56b5d710ccf566 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 13 Jul 2025 19:27:50 -0700 Subject: [PATCH 09/85] Rename properties to begin with KSPBT Except the CKAN ones because those are self-evident --- .github/actions/compile/action.yml | 2 +- KSPBuildTools.csproj | 2 +- KSPCommon.props | 113 +++++++++++------------ KSPCommon.targets | 48 +++++----- docs/msbuild/dependencies.md | 18 ++-- docs/msbuild/generating-version-files.md | 4 +- docs/msbuild/getting-started.md | 4 +- docs/msbuild/properties.md | 33 +++++-- tests/plugin-mod/plugin-mod.csproj | 6 +- 9 files changed, 121 insertions(+), 109 deletions(-) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index ab716de..0acac95 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -76,5 +76,5 @@ runs: working-directory: ${{ inputs.working-directory }} run: | dotnet msbuild -p:Configuration=${{ inputs.build-configuration }} \ - -p:KSPManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} \ + -p:KSPBTManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} \ ${{ runner.debug && '-v:detailed' }} diff --git a/KSPBuildTools.csproj b/KSPBuildTools.csproj index 4ebf998..cbf382a 100644 --- a/KSPBuildTools.csproj +++ b/KSPBuildTools.csproj @@ -24,7 +24,7 @@ 1701;1702;CS0649;CS1591;NU5128 2024 KSPModdingLibs Contributors KSPBuildTools - $(ProjectDir) + $(ProjectDir) KSPBuildTools README.md KSP Build Tools diff --git a/KSPCommon.props b/KSPCommon.props index 8e1e5e0..ece1800 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -7,20 +7,19 @@ - true - true - true - + true + true + true - true + true - true + true - true + true - true + true 1.12 1.11 1.10 1.9 1.8 @@ -28,32 +27,32 @@ - - KSP_x64_Data/Managed - KSP.app/Contents/Resources/Data/Managed - KSP_Data/Managed + + KSP_x64_Data/Managed + KSP.app/Contents/Resources/Data/Managed + KSP_Data/Managed - KSP_x64.exe - KSP.app/Contents/MacOS/KSP - KSP.x86_64 - C:\Program Files (x86)\Steam\steamapps\common\Kerbal Space Program - $(HOME)/Library/Application Support/Steam/steamapps/common/Kerbal Space Program + KSP_x64.exe + KSP.app/Contents/MacOS/KSP + KSP.x86_64 + C:\Program Files (x86)\Steam\steamapps\common\Kerbal Space Program + $(HOME)/Library/Application Support/Steam/steamapps/common/Kerbal Space Program - $(MSBuildProjectDirectory)/../GameData/$(MSBuildProjectName)/ - - + $(MSBuildProjectDirectory)/../GameData/$(MSBuildProjectName)/ + + - + @@ -65,55 +64,55 @@ - $(KSPManagedRelativePath)/Assembly-CSharp.dll - property + $(KSPBTManagedRelativePath)/Assembly-CSharp.dll + property - + - - $(KSP_ROOT) - environment variable + + $(KSP_ROOT) + environment variable - - - + + + - - $(SolutionDir)KSP - solution directory + + $(SolutionDir)KSP + solution directory - - $(ReferencePath) - reference path + + $(ReferencePath) + reference path - - $(SteamKSPRoot) - steam + + $(KSPBTSteamGameRoot) + steam - - - $(KSPRoot)/$(KSPManagedRelativePath) + + + $(KSPBTGameRoot)/$(KSPBTManagedRelativePath) Program - $(KSPRoot)/$(KSPExecutable) - $(KSPRoot) + $(KSPBTGameRoot)/$(KSPBTGameExecutable) + $(KSPBTGameRoot) portable - + true @@ -121,42 +120,42 @@ false - $(ManagedPath) + $(KSPBTManagedPath) true - - + + System (KSP/Mono) False - + System (KSP/Mono) False - + System.Core (KSP/Mono) False - + System.Xml (KSP/Mono) False - - + + UnityEngine False - - + + Assembly-CSharp False - + Assembly-CSharp-firstpass False diff --git a/KSPCommon.targets b/KSPCommon.targets index 0188e67..1cde14c 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -4,33 +4,33 @@ - + - - + + Condition="'$(KSPBTGameRoot)' == ''"/> - <_KSPRootMessage Include="KSPRoot Candidates:"/> - <_KSPRootMessage Include="Candidate: %(KSPRootCandidate.source) from %(KSPRootCandidate.identity)"/> - <_KSPRootMessage Include="Chosen KSPRoot: $(KSPRoot) in $(KSPRootSource)" Condition="'$(KSPRoot)' != ''"/> + <_GameRootMessage Include="KSPBTGameRoot Candidates:"/> + <_GameRootMessage Include="Candidate: %(KSPBTGameRootCandidate.source) from %(KSPBTGameRootCandidate.identity)"/> + <_GameRootMessage Include="Chosen KSPBTGameRoot: $(KSPBTGameRoot) in $(KSPBTGameRootSource)" Condition="'$(KSPBTGameRoot)' != ''"/> - + - + - - + <_BinariesToCopy Include="$(TargetDir)/**/*.dll"/> + <_BinariesToCopy Include="$(TargetDir)/**/*.pdb" Condition="'$(Condition)' == 'Debug'"/> - - + + @@ -45,14 +45,14 @@ <_CKANDependency Include="@(CKANDependency)"/> - @(_CKANDependency, ' ') + <_CKANDependencyList>@(_CKANDependency, ' ') - <_CKANCommands Include="compat add --gamedir "$(KSPROOT)" %(_CKANCompatibleVersionItems.Identity)" + <_CKANCommands Include="compat add --gamedir "$(KSPBTGameRoot)" %(_CKANCompatibleVersionItems.Identity)" Condition=" '$(CKANCompatibleVersions)' != '' "/> - <_CKANCommands Include="install --no-recommends --gamedir "$(KSPROOT)" $(CKANDependencyList)" Condition="'$(CKANDependencyList)' != ''"/> + <_CKANCommands Include="install --no-recommends --gamedir "$(KSPBTGameRoot)" $(_CKANDependencyList)" Condition="'$(CKANDependencyList)' != ''"/> @@ -64,7 +64,7 @@ - + @@ -82,8 +82,8 @@ - + <_Parameter1>$(AssemblyName) @@ -106,8 +106,8 @@ Otherwise CKANVersion is used. Otherwise 0.0 is used (no minimum version) --> - + $([System.String]::Copy('%(Reference.identity)').Split(',')[0]) @@ -153,9 +153,9 @@ - + Condition= " '$(KSPBTGenerateVersionFile)' == 'true' "> $(ProjectName) diff --git a/docs/msbuild/dependencies.md b/docs/msbuild/dependencies.md index 9ef01ea..3ff72a6 100644 --- a/docs/msbuild/dependencies.md +++ b/docs/msbuild/dependencies.md @@ -6,15 +6,15 @@ KSPBuildTools can help manage other mods that you depend on Mod DLLs should be referenced as with any other DLLs, like so. See [the Microsoft docs on Reference items](https://learn.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-items?view=vs-2022#reference) for more info. Make sure that `False`{l=xml} is set or the DLL will be copied to your output directory. -the {confval}`KSPRoot` property can be used to reference the KSP install wherever it is. +the {confval}`KSPBTGameRoot` property can be used to reference the KSP install wherever it is. ```xml - + False - $(KSPRoot)/GameData/000_Harmony/0Harmony.dll + $(KSPBTGameRoot)/GameData/000_Harmony/0Harmony.dll False @@ -27,7 +27,7 @@ KSPBuildTools can install CKAN mods automatically when built. This is useful for ```xml - + False ModuleManager @@ -42,7 +42,7 @@ You can also mark explicit versions to install. ```xml - + False ModuleManager 4.2.3 @@ -59,7 +59,7 @@ KSP mods should mark their dependency DLLs using the `KSPAssemblyDependency` att `[assembly: KSPAssemblyDependency("0Harmony", 0, 0, 0)]`{l=csharp} -If the {confval}`GenerateKSPAssemblyDependencyAttributes` property is set to `true`, KSPBuildTools will generate these attributes automatically. It uses any `Reference` item that has a `` or `` metadata value. +If the {confval}`KSPBTGenerateDependencyAttributes` property is set to `true`, KSPBuildTools will generate these attributes automatically. It uses any `Reference` item that has a `` or `` metadata value. The assembly name is set to the `` metadata value, and falls back to the `` metadata value. @@ -68,7 +68,7 @@ The version is taken from the `` metadata value, however lea ```xml - + False TweakScaleRescaled Scale @@ -78,7 +78,7 @@ The version is taken from the `` metadata value, however lea - true - true + true + true ``` \ No newline at end of file diff --git a/docs/msbuild/generating-version-files.md b/docs/msbuild/generating-version-files.md index ede9715..d407402 100644 --- a/docs/msbuild/generating-version-files.md +++ b/docs/msbuild/generating-version-files.md @@ -8,7 +8,7 @@ To use, add the following to your csproj, filling in the URLs and paths for your - $(KSPModRoot)/mymod.version + $(KSPBTModRoot)/mymod.version https://github.com/username/repo/releases/latest/download/mymod.version https://github.com/username.repo/releases/latest @@ -44,7 +44,7 @@ The `include` value can also be set to a json file including any other values yo - $(KSPModRoot)/mymod.version + $(KSPBTModRoot)/mymod.version ``` \ No newline at end of file diff --git a/docs/msbuild/getting-started.md b/docs/msbuild/getting-started.md index 27ec814..3863937 100644 --- a/docs/msbuild/getting-started.md +++ b/docs/msbuild/getting-started.md @@ -74,9 +74,9 @@ KSPBuildTools needs to know where you have KSP installed in order to reference t There are several options for this. KSPBuildTools will choose in the following order. Either [autodiscovery in the solution directory](#solution-directory) or [setting a reference path in a .user file](#environment-variable) are the recommended methods for most users. -### KSPRoot MSBuild Property +### KSPBTGameRoot MSBuild Property -If the {confval}`KSPRoot` MSBuild property is already set, KSPBuildTools will use it as-is. This can be set in your .csproj.user file. +If the {confval}`KSPBTGameRoot` MSBuild property is already set, KSPBuildTools will use it as-is. This can be set in your .csproj.user file. ### Environment Variable diff --git a/docs/msbuild/properties.md b/docs/msbuild/properties.md index 6eea55b..02b3937 100644 --- a/docs/msbuild/properties.md +++ b/docs/msbuild/properties.md @@ -1,23 +1,23 @@ # MSBuild Properties -```{confval} KSPRoot +```{confval} KSPBTGameRoot This property should be set to the root directory of your KSP install. You should not set this in your csproj, see [Locating your KSP Install](getting-started.md/#locating-your-ksp-install) ``` -```{confval} KSPModRoot +```{confval} KSPBTModRoot --- -default: `$(ProjectDir)/../GameData/$(ProjectName)/` +default: `$(MSBuildProjectDir)/../GameData/$(MSBuildProjectName)/` --- specifies the root directory of your mod (the folder that gets placed into GameData). Generally you'll want to set this to be relative to the csproj file using `$(MSBuildThisFileDirectory)`. ``` -```{confval} KSPModPluginFolder +```{confval} KSPBTModPluginFolder --- -default: `$(KSPModRoot)/Plugins` +default: `Plugins` --- -the directory where compiled binaries should be copied. This is relative to the `KSPModRoot`. The binaries will be copied to this directory after each build. +the directory where compiled binaries should be copied. This is relative to the `KSPBTMosRoot`. The DLLs will be copied to this directory after each build. ``` ```{confval} CKANCompatibleVersions @@ -28,22 +28,35 @@ default: `1.12 1.11 1.10 1.9 1.8` Used by the `CKANInstall` target to set additional KSP versions to treat as compatible when installing ``` -```{confval} GenerateKSPAssemblyAttribute +```{confval} KSPBTGenerateAssemblyAttribute +--- +default: `true` +--- If set to `true`, automatically generates the `KSPAssembly` for your assembly from the `Version` property. ``` -```{confval} GenerateKSPAssemblyDependencyAttributes +```{confval} KSPBTGenerateDependencyAttributes +--- +default: `true` +--- If set to `true`, automatically generates `KSPAssemblyDependency` attributes for each dependency. Dependencies should have either the `CKANIdentifier` metadata or `KSPAssemblyName` metadata. Versions can be supplied with `CKANVersion` or `KSPAssemblyVersion`. ``` -```{confval} ReferenceKSPUnityAssemblies +```{confval} KSPBTReferenceSystemAssemblies +--- +default: `true` +--- +If set to `true`, adds assembly references to Mono System DLLs. +``` + +```{confval} KSPBTReferenceUnityAssemblies --- default: `true` --- If set to `true`, adds assembly references to all UnityEngine assemblies in the KSP install. You can set this to `false` to opt out of this behavior if you want to create a pure C# assembly that does not depend on Unity. ``` -```{confval} ReferenceKSPGameAssemblies +```{confval} KSPBTReferenceGameAssemblies --- default: `true` --- diff --git a/tests/plugin-mod/plugin-mod.csproj b/tests/plugin-mod/plugin-mod.csproj index 1feffeb..57edfbc 100644 --- a/tests/plugin-mod/plugin-mod.csproj +++ b/tests/plugin-mod/plugin-mod.csproj @@ -17,13 +17,13 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginMod - $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) + $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) - $(KSPRoot)/GameData/000_Harmony/0Harmony.dll + $(KSPBTGameRoot)/GameData/000_Harmony/0Harmony.dll Harmony2 2.2.1.0 False @@ -33,7 +33,7 @@ - $(KSPModRoot)/plugin-mod.version + $(KSPBTModRoot)/plugin-mod.version From 769b65e9fd91af80c2149edfb3b72ec989fd6ebb Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 14 Jul 2025 23:08:43 -0700 Subject: [PATCH 10/85] add ability to declare mod dependencies with ModReference items --- KSPCommon.targets | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/KSPCommon.targets b/KSPCommon.targets index 1cde14c..f26a71a 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -61,6 +61,7 @@ + @@ -72,6 +73,23 @@ + + + + + %(ModReference.identity) + + + + + From 0b686197eec5d5e76a4dd6a7f6bf7f6e57dd50c0 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 15 Jul 2025 22:32:00 -0700 Subject: [PATCH 11/85] Update changelog to reflect recent changes --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd420c8..4c01fb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,25 @@ All notable changes to this project will be documented in this file +## Unreleased + +### Msbuild + +- Renamed global msbuild properties to have the `KSPBT` prefix to avoid namespace collisions with other frameworks + - `KSPRoot` is now `KSPBTGameRoot`. It should no longer be referenced within a .csproj file + - `RepoRootPath` is now `KSPBTModRoot`, and should now point to the mod folder within GameData rather than the + root of a git repo + - `BinariesOutputRelativePath` is now `KSPBTModPluginFolder` + - `GenerateKSPAssemblyAttribute` is now `KSPBTGenerateAssemblyAttribute` and defaults to true + - `GenerateKSPAssemblyDependencyAttributes` is now `KSPBTGenerateDependencyAttributes` and defaults to true + - `ReferenceUnityAssemblies` is now `KSPBTReferenceUnityAssemblies` + - `ReferenceKSPAssemblies` is now `KSPBTReferenceGameAssemblies` +- Added the `KSPBTReferenceSystemAssemblies` property to control referencing the mono system DLLs within the KSP + managed folder. Setting this property to false will load the implicit framework DLLs instead. +- Mod dependencies should now be declared with + `ModReference` items. This avoids the need for the KSP install path to be known at evaluation time. + + ## 0.0.4 - 2025-06-15 ### Library From 96c6a69d7cbe3d6229f9d1b7ecfaf65bb1fe78ee Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 15 Jul 2025 23:41:50 -0700 Subject: [PATCH 12/85] Move references back to the targets file --- KSPCommon.props | 51 ----------------------------------------------- KSPCommon.targets | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 51 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index ece1800..f5bf28d 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -111,57 +111,6 @@ portable - - - - true - - true - - false - $(KSPBTManagedPath) - true - - - - - - - System (KSP/Mono) - False - - - System (KSP/Mono) - False - - - System.Core (KSP/Mono) - False - - - System.Xml (KSP/Mono) - False - - - - - UnityEngine - False - - - - - Assembly-CSharp - False - - - Assembly-CSharp-firstpass - False - - - - diff --git a/KSPCommon.targets b/KSPCommon.targets index f26a71a..9929dd9 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -2,6 +2,56 @@ + + + + true + + true + + false + $(KSPBTManagedPath) + true + + + + + + + System (KSP/Mono) + False + + + System (KSP/Mono) + False + + + System.Core (KSP/Mono) + False + + + System.Xml (KSP/Mono) + False + + + + + UnityEngine + False + + + + + Assembly-CSharp + False + + + Assembly-CSharp-firstpass + False + + + From a2a8bd17bcefde99d8abae7441b5869ac7cf495e Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Wed, 16 Jul 2025 00:22:24 -0700 Subject: [PATCH 13/85] Fix some bugs with CKAN install and tests --- KSPCommon.targets | 2 +- tests/plugin-mod-nuget/plugin-mod.csproj | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index 9929dd9..e49390b 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -116,7 +116,7 @@ - + diff --git a/tests/plugin-mod-nuget/plugin-mod.csproj b/tests/plugin-mod-nuget/plugin-mod.csproj index 0e5ec71..6eead32 100644 --- a/tests/plugin-mod-nuget/plugin-mod.csproj +++ b/tests/plugin-mod-nuget/plugin-mod.csproj @@ -22,13 +22,13 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginModNuget - $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) + $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) - $(KSPRoot)/GameData/000_Harmony/0Harmony.dll + $(KSPBTGameRoot)/GameData/000_Harmony/0Harmony.dll Harmony2 2.2.1.0 False @@ -38,7 +38,7 @@ - $(KSPModRoot)/plugin-mod-nuget.version + $(KSPBTModRoot)/plugin-mod-nuget.version From bd0a6ec18dad8ef6c574e28747cdb5d4b9054d59 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 17 Jul 2025 21:58:12 -0700 Subject: [PATCH 14/85] try something --- KSPCommon.props | 13 +++++++++++++ KSPCommon.targets | 14 -------------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index f5bf28d..d696f3a 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -111,6 +111,19 @@ portable + + + + true + + true + + false + $(KSPBTManagedPath) + true + + diff --git a/KSPCommon.targets b/KSPCommon.targets index e49390b..3652aca 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -2,20 +2,6 @@ - - - - true - - true - - false - $(KSPBTManagedPath) - true - - - From e5bceffbd35e7c8dc77f016adca6a2b8140afac7 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sat, 19 Jul 2025 11:29:11 -0700 Subject: [PATCH 15/85] add an sln makes debugging way easier in Rider --- .../workflows/internal-test-plugin-nuget.yml | 2 +- .gitignore | 6 ++++ KSPBuildTools.csproj | 4 --- KSPBuildTools.sln | 34 +++++++++++++++++++ ...gin-mod.csproj => plugin-mod-nuget.csproj} | 1 + 5 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 KSPBuildTools.sln rename tests/plugin-mod-nuget/{plugin-mod.csproj => plugin-mod-nuget.csproj} (97%) diff --git a/.github/workflows/internal-test-plugin-nuget.yml b/.github/workflows/internal-test-plugin-nuget.yml index 9519ca2..ffbedbc 100644 --- a/.github/workflows/internal-test-plugin-nuget.yml +++ b/.github/workflows/internal-test-plugin-nuget.yml @@ -39,7 +39,7 @@ jobs: with: ksp-zip-url: https://github.com/KSPModdingLibs/KSPLibs/raw/main/KSP-1.12.5.zip working-directory: ${{ env.TESTDIR }} - solution-file-path: plugin-mod.csproj + solution-file-path: plugin-mod-nuget.csproj env: KSPBuildToolsVersion: ${{ inputs.package-version }} diff --git a/.gitignore b/.gitignore index 6851198..8842667 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,12 @@ bin obj *.nupkg +packages # docs docs/_build + +# misc +.DS_Store +.idea +*.user diff --git a/KSPBuildTools.csproj b/KSPBuildTools.csproj index cbf382a..59be6b4 100644 --- a/KSPBuildTools.csproj +++ b/KSPBuildTools.csproj @@ -50,8 +50,4 @@ - - - - \ No newline at end of file diff --git a/KSPBuildTools.sln b/KSPBuildTools.sln new file mode 100644 index 0000000..5b01e79 --- /dev/null +++ b/KSPBuildTools.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KSPBuildTools", "KSPBuildTools.csproj", "{F5D90A2D-BF85-4849-9A1B-AD53EE814149}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "plugin-mod-legacy", "tests\plugin-mod-legacy\PluginModLegacy\plugin-mod-legacy.csproj", "{F19C7AB4-50C2-4378-9673-CC039CA12E10}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "plugin-mod-nuget", "tests\plugin-mod-nuget\plugin-mod-nuget.csproj", "{4F531716-DB82-4AD4-8270-DFB32EE18A41}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "plugin-mod", "tests\plugin-mod\plugin-mod.csproj", "{F0E30935-74A7-446F-A30C-5D1D0E525EC5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F5D90A2D-BF85-4849-9A1B-AD53EE814149}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F5D90A2D-BF85-4849-9A1B-AD53EE814149}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F5D90A2D-BF85-4849-9A1B-AD53EE814149}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F5D90A2D-BF85-4849-9A1B-AD53EE814149}.Release|Any CPU.Build.0 = Release|Any CPU + {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Release|Any CPU.Build.0 = Release|Any CPU + {4F531716-DB82-4AD4-8270-DFB32EE18A41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4F531716-DB82-4AD4-8270-DFB32EE18A41}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F531716-DB82-4AD4-8270-DFB32EE18A41}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F531716-DB82-4AD4-8270-DFB32EE18A41}.Release|Any CPU.Build.0 = Release|Any CPU + {F0E30935-74A7-446F-A30C-5D1D0E525EC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0E30935-74A7-446F-A30C-5D1D0E525EC5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0E30935-74A7-446F-A30C-5D1D0E525EC5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0E30935-74A7-446F-A30C-5D1D0E525EC5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/tests/plugin-mod-nuget/plugin-mod.csproj b/tests/plugin-mod-nuget/plugin-mod-nuget.csproj similarity index 97% rename from tests/plugin-mod-nuget/plugin-mod.csproj rename to tests/plugin-mod-nuget/plugin-mod-nuget.csproj index 6eead32..3d60b1d 100644 --- a/tests/plugin-mod-nuget/plugin-mod.csproj +++ b/tests/plugin-mod-nuget/plugin-mod-nuget.csproj @@ -3,6 +3,7 @@ *-* + plugin-mod From c68f3f12e39f188f29a19f6d7236bd4c0c16ae32 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sat, 19 Jul 2025 22:33:45 -0700 Subject: [PATCH 16/85] More property renames and additions --- .github/actions/compile/action.yml | 2 +- CHANGELOG.md | 18 +-- KSPBuildTools.csproj | 2 +- KSPCommon.props | 115 ++++++++--------- KSPCommon.targets | 118 +++++++++--------- .../{properties.md => configuration.md} | 37 +++--- docs/msbuild/dependencies.md | 18 +-- docs/msbuild/generating-version-files.md | 4 +- docs/msbuild/getting-started.md | 4 +- docs/msbuild/index.md | 2 +- .../plugin-mod-nuget/plugin-mod-nuget.csproj | 6 +- tests/plugin-mod/plugin-mod.csproj | 6 +- 12 files changed, 171 insertions(+), 161 deletions(-) rename docs/msbuild/{properties.md => configuration.md} (64%) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index 0acac95..54b33fe 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -76,5 +76,5 @@ runs: working-directory: ${{ inputs.working-directory }} run: | dotnet msbuild -p:Configuration=${{ inputs.build-configuration }} \ - -p:KSPBTManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} \ + -p:_KSPBT_ManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} \ ${{ runner.debug && '-v:detailed' }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c01fb6..117803f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,16 +6,16 @@ All notable changes to this project will be documented in this file ### Msbuild -- Renamed global msbuild properties to have the `KSPBT` prefix to avoid namespace collisions with other frameworks - - `KSPRoot` is now `KSPBTGameRoot`. It should no longer be referenced within a .csproj file - - `RepoRootPath` is now `KSPBTModRoot`, and should now point to the mod folder within GameData rather than the +- Renamed global msbuild properties to have the `KSPBT_` prefix to avoid namespace collisions with other frameworks + - `KSPRoot` is now `KSPBT_GameRoot`. It should no longer be referenced within a .csproj file + - `RepoRootPath` is now `KSPBT_ModRoot`, and should now point to the mod folder within GameData rather than the root of a git repo - - `BinariesOutputRelativePath` is now `KSPBTModPluginFolder` - - `GenerateKSPAssemblyAttribute` is now `KSPBTGenerateAssemblyAttribute` and defaults to true - - `GenerateKSPAssemblyDependencyAttributes` is now `KSPBTGenerateDependencyAttributes` and defaults to true - - `ReferenceUnityAssemblies` is now `KSPBTReferenceUnityAssemblies` - - `ReferenceKSPAssemblies` is now `KSPBTReferenceGameAssemblies` -- Added the `KSPBTReferenceSystemAssemblies` property to control referencing the mono system DLLs within the KSP + - `BinariesOutputRelativePath` is now `KSPBT_ModPluginFolder` + - `GenerateKSPAssemblyAttribute` is now `KSPBT_GenerateAssemblyAttribute` and defaults to true + - `GenerateKSPAssemblyDependencyAttributes` is now `KSPBT_GenerateDependencyAttributes` and defaults to true + - `ReferenceUnityAssemblies` is now `KSPBT_ReferenceUnityAssemblies` + - `ReferenceKSPAssemblies` is now `KSPBT_ReferenceGameAssemblies` +- Added the `KSPBT_ReferenceSystemAssemblies` property to control referencing the mono system DLLs within the KSP managed folder. Setting this property to false will load the implicit framework DLLs instead. - Mod dependencies should now be declared with `ModReference` items. This avoids the need for the KSP install path to be known at evaluation time. diff --git a/KSPBuildTools.csproj b/KSPBuildTools.csproj index 59be6b4..56d4565 100644 --- a/KSPBuildTools.csproj +++ b/KSPBuildTools.csproj @@ -24,7 +24,7 @@ 1701;1702;CS0649;CS1591;NU5128 2024 KSPModdingLibs Contributors KSPBuildTools - $(ProjectDir) + $(ProjectDir) KSPBuildTools README.md KSP Build Tools diff --git a/KSPCommon.props b/KSPCommon.props index d696f3a..9be20b8 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -4,55 +4,61 @@ true - + + + $(MSBuildProjectDirectory)/../GameData/$(MSBuildProjectName)/ + + + + + + 1.12 1.11 1.10 1.9 1.8 + - true - true - true + true + true + true + true - true + true + true - true + true - true + true - true - - 1.12 1.11 1.10 1.9 1.8 + true - - - - KSP_x64_Data/Managed - KSP.app/Contents/Resources/Data/Managed - KSP_Data/Managed - + + + + false + + - - KSP_x64.exe - KSP.app/Contents/MacOS/KSP - KSP.x86_64 - C:\Program Files (x86)\Steam\steamapps\common\Kerbal Space Program - $(HOME)/Library/Application Support/Steam/steamapps/common/Kerbal Space Program + + + <_KSPBT_ManagedRelativePath Condition=" $([MSBuild]::IsOsPlatform('Windows')) ">KSP_x64_Data/Managed + <_KSPBT_ManagedRelativePath Condition=" $([MSBuild]::IsOsPlatform('OSX')) ">KSP.app/Contents/Resources/Data/Managed + <_KSPBT_ManagedRelativePath Condition=" $([MSBuild]::IsOsPlatform('Linux')) ">KSP_Data/Managed - - - - $(MSBuildProjectDirectory)/../GameData/$(MSBuildProjectName)/ - - + <_KSPBT_GameExecutable Condition=" $([MSBuild]::IsOsPlatform('Windows')) ">KSP_x64.exe + <_KSPBT_GameExecutable Condition=" $([MSBuild]::IsOsPlatform('OSX')) ">KSP.app/Contents/MacOS/KSP + <_KSPBT_GameExecutable Condition=" $([MSBuild]::IsOsPlatform('Linux')) ">KSP.x86_64 + <_KSPBT_SteamGameRoot Condition=" $([MSBuild]::IsOsPlatform('Windows')) ">C:\Program Files (x86)\Steam\steamapps\common\Kerbal Space Program + <_KSPBT_SteamGameRoot Condition=" $([MSBuild]::IsOsPlatform('OSX')) ">$(HOME)/Library/Application Support/Steam/steamapps/common/Kerbal Space Program - + @@ -64,50 +70,45 @@ - $(KSPBTManagedRelativePath)/Assembly-CSharp.dll - property + $(_KSPBT_ManagedRelativePath)/Assembly-CSharp.dll + property - + - - $(KSP_ROOT) - environment variable + + $(KSP_ROOT) + environment variable - - - + + + - - $(SolutionDir)KSP - solution directory + + $(SolutionDir)KSP + solution directory - - $(ReferencePath) - reference path + + $(ReferencePath) + reference path - - $(KSPBTSteamGameRoot) - steam - - - - - $(KSPBTGameRoot)/$(KSPBTManagedRelativePath) + + $(_KSPBT_SteamGameRoot) + steam Program - $(KSPBTGameRoot)/$(KSPBTGameExecutable) - $(KSPBTGameRoot) + $(KSPBT_GameRoot)/$(_KSPBT_GameExecutable) + $(KSPBT_GameRoot) portable @@ -120,7 +121,7 @@ false - $(KSPBTManagedPath) + $(KSPBT_ManagedPath) true diff --git a/KSPCommon.targets b/KSPCommon.targets index 3652aca..f1eeeaf 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -2,37 +2,42 @@ + + + $(KSPBT_GameRoot)/$(_KSPBT_ManagedRelativePath) + + - - + + System (KSP/Mono) False - + System (KSP/Mono) False - + System.Core (KSP/Mono) False - + System.Xml (KSP/Mono) False - - + + UnityEngine False - - + + Assembly-CSharp False - + Assembly-CSharp-firstpass False @@ -40,42 +45,43 @@ - + + - - + + Condition="'$(KSPBT_GameRoot)' == ''"/> - <_GameRootMessage Include="KSPBTGameRoot Candidates:"/> - <_GameRootMessage Include="Candidate: %(KSPBTGameRootCandidate.source) from %(KSPBTGameRootCandidate.identity)"/> - <_GameRootMessage Include="Chosen KSPBTGameRoot: $(KSPBTGameRoot) in $(KSPBTGameRootSource)" Condition="'$(KSPBTGameRoot)' != ''"/> + <_GameRootMessage Include="KSPBT_GameRoot Candidates:"/> + <_GameRootMessage Include="Candidate: %(KSPBT_GameRootCandidate.source) from %(KSPBT_GameRootCandidate.identity)"/> + <_GameRootMessage Include="Chosen KSPBT_GameRoot: $(KSPBT_GameRoot) in $(KSPBT_GameRootSource)" Condition="'$(KSPBT_GameRoot)' != ''"/> - + <_BinariesToCopy Include="$(TargetDir)/**/*.dll"/> <_BinariesToCopy Include="$(TargetDir)/**/*.pdb" Condition="'$(Condition)' == 'Debug'"/> - - + + - + - $(BaseIntermediateOutputPath)ckancommands.cache + <_CKANScript>$(BaseIntermediateOutputPath)ckancommands.cache - + - <_CKANCompatibleVersionItems Include="$(CKANCompatibleVersions.Split(' '))"/> + <_CKANCompatibleVersionItems Include="$(KSPBT_KSPBT_CKANCompatibleVersions.Split(' '))"/> <_CKANDependency Include="%(Reference.CKANIdentifier)" Condition="'%(Reference.CKANVersion)' == ''"/> <_CKANDependency Include="%(Reference.CKANIdentifier)=%(Reference.CKANVersion)" Condition="'%(Reference.CKANVersion)' != ''"/> <_CKANDependency Include="@(CKANDependency)"/> @@ -85,59 +91,53 @@ - <_CKANCommands Include="compat add --gamedir "$(KSPBTGameRoot)" %(_CKANCompatibleVersionItems.Identity)" - Condition=" '$(CKANCompatibleVersions)' != '' "/> + <_CKANCommands Include="compat add --gamedir "$(KSPBT_GameRoot)" %(_CKANCompatibleVersionItems.Identity)" + Condition=" '$(KSPBT_CKANCompatibleVersions)' != '' "/> - <_CKANCommands Include="install --no-recommends --gamedir "$(KSPBTGameRoot)" $(_CKANDependencyList)" Condition="'$(CKANDependencyList)' != ''"/> + <_CKANCommands Include="install --no-recommends --gamedir "$(KSPBT_GameRoot)" $(_CKANDependencyList)" Condition="'$(CKANDependencyList)' != ''"/> - + - + - - - - - - - + + + + + - - + + - + + + + - + %(ModReference.identity) - - - - - - - - - - - + <_Parameter1>$(AssemblyName) @@ -160,8 +160,8 @@ Otherwise CKANVersion is used. Otherwise 0.0 is used (no minimum version) --> - + $([System.String]::Copy('%(Reference.identity)').Split(',')[0]) @@ -207,9 +207,9 @@ - + Condition=" '$(KSPBT_GenerateVersionFile)' == 'true' "> $(ProjectName) diff --git a/docs/msbuild/properties.md b/docs/msbuild/configuration.md similarity index 64% rename from docs/msbuild/properties.md rename to docs/msbuild/configuration.md index 02b3937..db02c9e 100644 --- a/docs/msbuild/properties.md +++ b/docs/msbuild/configuration.md @@ -1,10 +1,12 @@ -# MSBuild Properties +# MSBuild Items And Properties -```{confval} KSPBTGameRoot +## Properties + +```{confval} KSPBT_GameRoot This property should be set to the root directory of your KSP install. You should not set this in your csproj, see [Locating your KSP Install](getting-started.md/#locating-your-ksp-install) ``` -```{confval} KSPBTModRoot +```{confval} KSPBT_ModRoot --- default: `$(MSBuildProjectDir)/../GameData/$(MSBuildProjectName)/` --- @@ -12,15 +14,15 @@ default: `$(MSBuildProjectDir)/../GameData/$(MSBuildProjectName)/` specifies the root directory of your mod (the folder that gets placed into GameData). Generally you'll want to set this to be relative to the csproj file using `$(MSBuildThisFileDirectory)`. ``` -```{confval} KSPBTModPluginFolder +```{confval} KSPBT_ModPluginFolder --- -default: `Plugins` +default: `./` --- -the directory where compiled binaries should be copied. This is relative to the `KSPBTMosRoot`. The DLLs will be copied to this directory after each build. +the directory where compiled binaries should be copied. This is relative to the {confval}`KSPBT_ModRoot`. The DLLs will be copied to this directory after each build. ``` -```{confval} CKANCompatibleVersions +```{confval} KSPBT_CKANCompatibleVersions --- default: `1.12 1.11 1.10 1.9 1.8` --- @@ -28,37 +30,44 @@ default: `1.12 1.11 1.10 1.9 1.8` Used by the `CKANInstall` target to set additional KSP versions to treat as compatible when installing ``` -```{confval} KSPBTGenerateAssemblyAttribute +```{confval} KSPBT_GenerateAssemblyAttribute --- default: `true` --- If set to `true`, automatically generates the `KSPAssembly` for your assembly from the `Version` property. ``` -```{confval} KSPBTGenerateDependencyAttributes +```{confval} KSPBT_GenerateDependencyAttributes --- default: `true` --- If set to `true`, automatically generates `KSPAssemblyDependency` attributes for each dependency. Dependencies should have either the `CKANIdentifier` metadata or `KSPAssemblyName` metadata. Versions can be supplied with `CKANVersion` or `KSPAssemblyVersion`. ``` -```{confval} KSPBTReferenceSystemAssemblies +```{confval} KSPBT_ReferenceSystemAssemblies --- default: `true` --- If set to `true`, adds assembly references to Mono System DLLs. ``` -```{confval} KSPBTReferenceUnityAssemblies +```{confval} KSPBT_ReferenceUnityAssemblies +--- +default: `true` +--- +If set to `true`, adds assembly references to all UnityEngine assemblies in the KSP install. +``` + +```{confval} KSPBT_ReferenceGameAssemblies --- default: `true` --- -If set to `true`, adds assembly references to all UnityEngine assemblies in the KSP install. You can set this to `false` to opt out of this behavior if you want to create a pure C# assembly that does not depend on Unity. +If set to `true`, adds references to Assembly-CSharp and Assembly-CSharp-firstpass assemblies from the KSP install. ``` -```{confval} KSPBTReferenceGameAssemblies +```{confval} KSPBT_ReferenceModAssemblies --- default: `true` --- -If set to `true`, adds references to Assembly-CSharp and Assembly-CSharp-firstpass assemblies from the KSP install. You can set this to `false` to opt out of this behavior. +If set to `true`, adds references to the assemblies included in `ModReference` list. ``` diff --git a/docs/msbuild/dependencies.md b/docs/msbuild/dependencies.md index 3ff72a6..9a5abed 100644 --- a/docs/msbuild/dependencies.md +++ b/docs/msbuild/dependencies.md @@ -6,15 +6,15 @@ KSPBuildTools can help manage other mods that you depend on Mod DLLs should be referenced as with any other DLLs, like so. See [the Microsoft docs on Reference items](https://learn.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-items?view=vs-2022#reference) for more info. Make sure that `False`{l=xml} is set or the DLL will be copied to your output directory. -the {confval}`KSPBTGameRoot` property can be used to reference the KSP install wherever it is. +the {confval}`KSPBT_GameRoot` property can be used to reference the KSP install wherever it is. ```xml - + False - $(KSPBTGameRoot)/GameData/000_Harmony/0Harmony.dll + $(KSPBT_GameRoot)/GameData/000_Harmony/0Harmony.dll False @@ -27,7 +27,7 @@ KSPBuildTools can install CKAN mods automatically when built. This is useful for ```xml - + False ModuleManager @@ -42,7 +42,7 @@ You can also mark explicit versions to install. ```xml - + False ModuleManager 4.2.3 @@ -59,7 +59,7 @@ KSP mods should mark their dependency DLLs using the `KSPAssemblyDependency` att `[assembly: KSPAssemblyDependency("0Harmony", 0, 0, 0)]`{l=csharp} -If the {confval}`KSPBTGenerateDependencyAttributes` property is set to `true`, KSPBuildTools will generate these attributes automatically. It uses any `Reference` item that has a `` or `` metadata value. +If the {confval}`KSPBT_GenerateDependencyAttributes` property is set to `true`, KSPBuildTools will generate these attributes automatically. It uses any `Reference` item that has a `` or `` metadata value. The assembly name is set to the `` metadata value, and falls back to the `` metadata value. @@ -68,7 +68,7 @@ The version is taken from the `` metadata value, however lea ```xml - + False TweakScaleRescaled Scale @@ -78,7 +78,7 @@ The version is taken from the `` metadata value, however lea - true - true + true + true ``` \ No newline at end of file diff --git a/docs/msbuild/generating-version-files.md b/docs/msbuild/generating-version-files.md index d407402..27d7839 100644 --- a/docs/msbuild/generating-version-files.md +++ b/docs/msbuild/generating-version-files.md @@ -8,7 +8,7 @@ To use, add the following to your csproj, filling in the URLs and paths for your - $(KSPBTModRoot)/mymod.version + $(KSPBT_ModRoot)/mymod.version https://github.com/username/repo/releases/latest/download/mymod.version https://github.com/username.repo/releases/latest @@ -44,7 +44,7 @@ The `include` value can also be set to a json file including any other values yo - $(KSPBTModRoot)/mymod.version + $(KSPBT_ModRoot)/mymod.version ``` \ No newline at end of file diff --git a/docs/msbuild/getting-started.md b/docs/msbuild/getting-started.md index 3863937..31447d2 100644 --- a/docs/msbuild/getting-started.md +++ b/docs/msbuild/getting-started.md @@ -74,9 +74,9 @@ KSPBuildTools needs to know where you have KSP installed in order to reference t There are several options for this. KSPBuildTools will choose in the following order. Either [autodiscovery in the solution directory](#solution-directory) or [setting a reference path in a .user file](#environment-variable) are the recommended methods for most users. -### KSPBTGameRoot MSBuild Property +### KSPBT_GameRoot MSBuild Property -If the {confval}`KSPBTGameRoot` MSBuild property is already set, KSPBuildTools will use it as-is. This can be set in your .csproj.user file. +If the {confval}`KSPBT_GameRoot` MSBuild property is already set, KSPBuildTools will use it as-is. This can be set in your .csproj.user file. ### Environment Variable diff --git a/docs/msbuild/index.md b/docs/msbuild/index.md index 94911d4..04e5588 100644 --- a/docs/msbuild/index.md +++ b/docs/msbuild/index.md @@ -23,6 +23,6 @@ maxdepth: 1 getting-started generating-version-files dependencies -properties +configuration ``` diff --git a/tests/plugin-mod-nuget/plugin-mod-nuget.csproj b/tests/plugin-mod-nuget/plugin-mod-nuget.csproj index 3d60b1d..7290d4d 100644 --- a/tests/plugin-mod-nuget/plugin-mod-nuget.csproj +++ b/tests/plugin-mod-nuget/plugin-mod-nuget.csproj @@ -23,13 +23,13 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginModNuget - $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) + $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) - $(KSPBTGameRoot)/GameData/000_Harmony/0Harmony.dll + $(KSPBT_GameRoot)/GameData/000_Harmony/0Harmony.dll Harmony2 2.2.1.0 False @@ -39,7 +39,7 @@ - $(KSPBTModRoot)/plugin-mod-nuget.version + $(KSPBT_ModRoot)/plugin-mod-nuget.version diff --git a/tests/plugin-mod/plugin-mod.csproj b/tests/plugin-mod/plugin-mod.csproj index 57edfbc..6083f33 100644 --- a/tests/plugin-mod/plugin-mod.csproj +++ b/tests/plugin-mod/plugin-mod.csproj @@ -17,13 +17,13 @@ 1701;1702;CS0649;CS1591; 2024 KSPModdingLibs Contributors PluginMod - $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) + $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) - $(KSPBTGameRoot)/GameData/000_Harmony/0Harmony.dll + $(KSPBT_GameRoot)/GameData/000_Harmony/0Harmony.dll Harmony2 2.2.1.0 False @@ -33,7 +33,7 @@ - $(KSPBTModRoot)/plugin-mod.version + $(KSPBT_ModRoot)/plugin-mod.version From 81a8f408c9158cb42dae9456da65e993461052b0 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 20:50:17 -0700 Subject: [PATCH 17/85] fix ckan run target --- KSPCommon.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index f1eeeaf..dfbcedb 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -108,7 +108,7 @@ - + From 65e7e78489949252da5269a6f330b5880cc967d1 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 20:55:59 -0700 Subject: [PATCH 18/85] fix ckan compatibility list in command --- KSPCommon.targets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index dfbcedb..a4db8af 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -4,7 +4,7 @@ - $(KSPBT_GameRoot)/$(_KSPBT_ManagedRelativePath) + $(KSPBT_GameRoot)/$(KSPBT_ManagedRelativePath) @@ -81,7 +81,7 @@ - <_CKANCompatibleVersionItems Include="$(KSPBT_KSPBT_CKANCompatibleVersions.Split(' '))"/> + <_CKANCompatibleVersionItems Include="$(KSPBT_CKANCompatibleVersions.Split(' '))"/> <_CKANDependency Include="%(Reference.CKANIdentifier)" Condition="'%(Reference.CKANVersion)' == ''"/> <_CKANDependency Include="%(Reference.CKANIdentifier)=%(Reference.CKANVersion)" Condition="'%(Reference.CKANVersion)' != ''"/> <_CKANDependency Include="@(CKANDependency)"/> From 0898ecf8b30b312ffd3d7344fbd963561acd771a Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 21:10:46 -0700 Subject: [PATCH 19/85] oops --- KSPCommon.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index a4db8af..f539370 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -32,7 +32,7 @@ False - + Assembly-CSharp False From b29fd6cfd7b84689830914004c5bb2f7a47a92fd Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 21:20:51 -0700 Subject: [PATCH 20/85] oops 2 --- KSPCommon.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index f539370..1ee8fe5 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -4,7 +4,7 @@ - $(KSPBT_GameRoot)/$(KSPBT_ManagedRelativePath) + $(KSPBT_GameRoot)/$(_KSPBT_ManagedRelativePath) From 159ae132362711404b92823574a06b64bea80b4f Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 21:59:25 -0700 Subject: [PATCH 21/85] try something --- KSPCommon.props | 5 +++++ KSPCommon.targets | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index 9be20b8..7c78c23 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -104,6 +104,11 @@ steam + + + $(KSPBT_GameRoot)/$(_KSPBT_ManagedRelativePath) + + Program diff --git a/KSPCommon.targets b/KSPCommon.targets index 1ee8fe5..6667f48 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -2,11 +2,6 @@ - - - $(KSPBT_GameRoot)/$(_KSPBT_ManagedRelativePath) - - From 9935d48ae5f5a7c03e3e3fec8aff3d7abd84b2b7 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 22:02:47 -0700 Subject: [PATCH 22/85] Try another thing --- .github/actions/compile/action.yml | 2 +- KSPCommon.props | 17 ++++++----------- KSPCommon.targets | 5 +++++ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index 54b33fe..7d11847 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -76,5 +76,5 @@ runs: working-directory: ${{ inputs.working-directory }} run: | dotnet msbuild -p:Configuration=${{ inputs.build-configuration }} \ - -p:_KSPBT_ManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} \ + -p:KSPBT_ManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} \ ${{ runner.debug && '-v:detailed' }} diff --git a/KSPCommon.props b/KSPCommon.props index 7c78c23..2c903b2 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -42,10 +42,10 @@ - - <_KSPBT_ManagedRelativePath Condition=" $([MSBuild]::IsOsPlatform('Windows')) ">KSP_x64_Data/Managed - <_KSPBT_ManagedRelativePath Condition=" $([MSBuild]::IsOsPlatform('OSX')) ">KSP.app/Contents/Resources/Data/Managed - <_KSPBT_ManagedRelativePath Condition=" $([MSBuild]::IsOsPlatform('Linux')) ">KSP_Data/Managed + + KSP_x64_Data/Managed + KSP.app/Contents/Resources/Data/Managed + KSP_Data/Managed @@ -57,7 +57,7 @@ - @@ -70,7 +70,7 @@ - $(_KSPBT_ManagedRelativePath)/Assembly-CSharp.dll + $(KSPBT_ManagedRelativePath)/Assembly-CSharp.dll property @@ -104,11 +104,6 @@ steam - - - $(KSPBT_GameRoot)/$(_KSPBT_ManagedRelativePath) - - Program diff --git a/KSPCommon.targets b/KSPCommon.targets index 6667f48..f539370 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -2,6 +2,11 @@ + + + $(KSPBT_GameRoot)/$(KSPBT_ManagedRelativePath) + + From 899869e5b58e82dc0588795043272cc783e44ab2 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 22:10:53 -0700 Subject: [PATCH 23/85] WHY --- .github/actions/compile/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index 7d11847..b86da49 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -77,4 +77,4 @@ runs: run: | dotnet msbuild -p:Configuration=${{ inputs.build-configuration }} \ -p:KSPBT_ManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} \ - ${{ runner.debug && '-v:detailed' }} + ${{ runner.debug && '-v:diagnostic' }} From 13c65770e65711a33fc14dcbe06635a3930e8734 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 22:26:35 -0700 Subject: [PATCH 24/85] OH NO --- KSPCommon.props | 13 ------------- KSPCommon.targets | 13 +++++++++++++ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index 2c903b2..9073156 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -112,19 +112,6 @@ portable - - - - true - - true - - false - $(KSPBT_ManagedPath) - true - - diff --git a/KSPCommon.targets b/KSPCommon.targets index f539370..bb30073 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -7,6 +7,19 @@ $(KSPBT_GameRoot)/$(KSPBT_ManagedRelativePath) + + + + true + + true + + false + $(KSPBT_ManagedPath) + true + + From d809f3dee49a74078b9fbd882c6b8d248a5cb57a Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 22:32:48 -0700 Subject: [PATCH 25/85] starting to understand this... --- KSPCommon.props | 12 ++++++++++++ KSPCommon.targets | 8 -------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index 9073156..dd8f61e 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -112,6 +112,18 @@ portable + + + + true + + true + + false + true + + diff --git a/KSPCommon.targets b/KSPCommon.targets index bb30073..84370d7 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -9,15 +9,7 @@ - - true - - true - - false $(KSPBT_ManagedPath) - true From ede1af6c4488efe77f7b0411856ed662d2ed8b9e Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 22:56:27 -0700 Subject: [PATCH 26/85] ? --- KSPCommon.targets | 2 ++ 1 file changed, 2 insertions(+) diff --git a/KSPCommon.targets b/KSPCommon.targets index 84370d7..855e2f6 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -7,6 +7,8 @@ $(KSPBT_GameRoot)/$(KSPBT_ManagedRelativePath) + + $(KSPBT_ManagedPath) From 3d9007eb1358ade61024fe733e34442abc9d01a1 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 23:00:49 -0700 Subject: [PATCH 27/85] can I do this now? --- KSPCommon.props | 9 +-------- KSPCommon.targets | 8 ++++++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index dd8f61e..a3fafba 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -114,14 +114,7 @@ - - true - - true - - false - true + diff --git a/KSPCommon.targets b/KSPCommon.targets index 855e2f6..c710c8f 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -11,6 +11,14 @@ + + true + + true + + false + true $(KSPBT_ManagedPath) From 1a2a80b48e1385556f8342b3356efeb0099e58a8 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 23:17:44 -0700 Subject: [PATCH 28/85] this might be cleaner? --- KSPCommon.props | 5 ----- KSPCommon.targets | 4 ++-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index a3fafba..9073156 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -112,11 +112,6 @@ portable - - - - - diff --git a/KSPCommon.targets b/KSPCommon.targets index c710c8f..e57aa7d 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -7,8 +7,6 @@ $(KSPBT_GameRoot)/$(KSPBT_ManagedRelativePath) - - @@ -20,6 +18,8 @@ false true $(KSPBT_ManagedPath) + <_FullFrameworkReferenceAssemblyPaths>$(KSPBT_ManagedPath) + <_TargetFrameworkDirectories>$(KSPBT_ManagedPath) From 0b822698bb301bdcf5fc641124b2427b2efa40a4 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 20 Jul 2025 23:28:18 -0700 Subject: [PATCH 29/85] Try it out on more dotnet versions --- .github/workflows/internal-test-plugin-nuget.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/internal-test-plugin-nuget.yml b/.github/workflows/internal-test-plugin-nuget.yml index ffbedbc..d3dbbc5 100644 --- a/.github/workflows/internal-test-plugin-nuget.yml +++ b/.github/workflows/internal-test-plugin-nuget.yml @@ -13,7 +13,11 @@ env: NuGetDirectory: ${{ github.workspace}}/nuget jobs: + build: + strategy: + matrix: + dotnet-version: [ 5.x, 7.x, 9.x ] runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -40,10 +44,11 @@ jobs: ksp-zip-url: https://github.com/KSPModdingLibs/KSPLibs/raw/main/KSP-1.12.5.zip working-directory: ${{ env.TESTDIR }} solution-file-path: plugin-mod-nuget.csproj + dotnet-version: ${{ matrix.dotnet-version }} env: KSPBuildToolsVersion: ${{ inputs.package-version }} - uses: ./.github/actions/assemble-release with: artifacts: ${{ env.TESTDIR }}/GameData - output-file-name: plugin-mod-nuget + output-file-name: plugin-mod-nuget-${{ matrix.dotnet-version }} From cf333d246b0b33b8feae2b333a8363a40a855f69 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 21 Jul 2025 22:39:47 -0700 Subject: [PATCH 30/85] move the last of the GameRoot logic to targets This means that everything can be set in .csproj.user without hacks --- KSPCommon.props | 49 ----------------------------------------------- KSPCommon.targets | 45 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 49 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index 9073156..3df599f 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -56,11 +56,6 @@ <_KSPBT_SteamGameRoot Condition=" $([MSBuild]::IsOsPlatform('OSX')) ">$(HOME)/Library/Application Support/Steam/steamapps/common/Kerbal Space Program - - - - @@ -68,50 +63,6 @@ - - - $(KSPBT_ManagedRelativePath)/Assembly-CSharp.dll - property - - - - - - $(KSP_ROOT) - environment variable - - - - - - - - - - $(SolutionDir)KSP - solution directory - - - - - $(ReferencePath) - reference path - - - - - $(_KSPBT_SteamGameRoot) - steam - - - - - Program - $(KSPBT_GameRoot)/$(_KSPBT_GameExecutable) - $(KSPBT_GameRoot) - portable - - diff --git a/KSPCommon.targets b/KSPCommon.targets index e57aa7d..efdf8b2 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -2,6 +2,51 @@ + + + $(KSPBT_ManagedRelativePath)/Assembly-CSharp.dll + property + + + + + + $(KSP_ROOT) + environment variable + + + + + + + + + + $(SolutionDir)KSP + solution directory + + + + + $(ReferencePath) + reference path + + + + + $(_KSPBT_SteamGameRoot) + steam + + + + + Program + $(KSPBT_GameRoot)/$(_KSPBT_GameExecutable) + $(KSPBT_GameRoot) + portable + + + $(KSPBT_GameRoot)/$(KSPBT_ManagedRelativePath) From a58bf431541ddd1aab6fa5804d0de27e21b8b54b Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 21 Jul 2025 23:29:42 -0700 Subject: [PATCH 31/85] Fix target dependency chain --- KSPCommon.targets | 70 ++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index efdf8b2..258f6aa 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -103,12 +103,6 @@ - - - - - - - - + + + KSPBT_ReferenceModAssemblies;$(ResolveAssemblyReferencesDependsOn) + KSPBT_ReferenceModAssemblies;$(KSPBT_GenerateCKANScriptDependsOn) + + - <_BinariesToCopy Include="$(TargetDir)/**/*.dll"/> - <_BinariesToCopy Include="$(TargetDir)/**/*.pdb" Condition="'$(Condition)' == 'Debug'"/> + + %(ModReference.identity) + - - + + <_CKANScript>$(BaseIntermediateOutputPath)ckancommands.cache - + <_CKANCompatibleVersionItems Include="$(KSPBT_CKANCompatibleVersions.Split(' '))"/> <_CKANDependency Include="%(Reference.CKANIdentifier)" Condition="'%(Reference.CKANVersion)' == ''"/> @@ -162,9 +167,9 @@ - - - + + KSPBT_InstallCKANDependencies;$(ResolveAssemblyReferencesDependsOn) + @@ -175,26 +180,6 @@ - - - - - - - - %(ModReference.identity) - - - - @@ -309,4 +294,15 @@ + + + + + <_BinariesToCopy Include="$(TargetDir)/**/*.dll"/> + <_BinariesToCopy Include="$(TargetDir)/**/*.pdb" Condition="'$(Condition)' == 'Debug'"/> + + + + From 72e8819cbcb2176c0da8eab2e162056d1bf81594 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 21 Jul 2025 23:42:38 -0700 Subject: [PATCH 32/85] Move tests to ModReferences and recommend not using KSPBT_GameRoot in csproj --- docs/msbuild/configuration.md | 13 ++++++++----- tests/plugin-mod-nuget/plugin-mod-nuget.csproj | 6 +++--- tests/plugin-mod/plugin-mod.csproj | 11 +++++++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/docs/msbuild/configuration.md b/docs/msbuild/configuration.md index db02c9e..75b2fd9 100644 --- a/docs/msbuild/configuration.md +++ b/docs/msbuild/configuration.md @@ -1,11 +1,7 @@ -# MSBuild Items And Properties +# Configuration ## Properties -```{confval} KSPBT_GameRoot -This property should be set to the root directory of your KSP install. You should not set this in your csproj, see [Locating your KSP Install](getting-started.md/#locating-your-ksp-install) -``` - ```{confval} KSPBT_ModRoot --- default: `$(MSBuildProjectDir)/../GameData/$(MSBuildProjectName)/` @@ -71,3 +67,10 @@ default: `true` --- If set to `true`, adds references to the assemblies included in `ModReference` list. ``` + +````{confval} KSPBT_GameRoot +```{warning} +You should **not** set or use this property in your csproj file. +``` +This property should be set to the root directory of your KSP install. see [Locating your KSP Install](getting-started.md/#locating-your-ksp-install) +```` diff --git a/tests/plugin-mod-nuget/plugin-mod-nuget.csproj b/tests/plugin-mod-nuget/plugin-mod-nuget.csproj index 7290d4d..021b63b 100644 --- a/tests/plugin-mod-nuget/plugin-mod-nuget.csproj +++ b/tests/plugin-mod-nuget/plugin-mod-nuget.csproj @@ -28,12 +28,12 @@ - - $(KSPBT_GameRoot)/GameData/000_Harmony/0Harmony.dll + + GameData/000_Harmony/0Harmony.dll Harmony2 2.2.1.0 False - + diff --git a/tests/plugin-mod/plugin-mod.csproj b/tests/plugin-mod/plugin-mod.csproj index 6083f33..490ed3b 100644 --- a/tests/plugin-mod/plugin-mod.csproj +++ b/tests/plugin-mod/plugin-mod.csproj @@ -6,6 +6,10 @@ all runtime; build; native; contentfiles; analyzers + + all + runtime; build; native; contentfiles; analyzers + @@ -22,12 +26,11 @@ - - $(KSPBT_GameRoot)/GameData/000_Harmony/0Harmony.dll + + GameData/000_Harmony/0Harmony.dll Harmony2 2.2.1.0 - False - + From 105cc15d7baf65654a84ca62db0345a62e3c5253 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Wed, 23 Jul 2025 22:17:02 -0700 Subject: [PATCH 33/85] Make the stdlib avoidance thing conditional --- KSPCommon.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index 258f6aa..582ff86 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -53,7 +53,7 @@ - + true From b08da4ab8b1abe27cb3ecdfae7497d12ef4c7fe8 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Wed, 23 Jul 2025 23:43:33 -0700 Subject: [PATCH 34/85] Add default settings for the `Unity` configuration For building for use in the unity editor, handy for UIs! --- KSPCommon.props | 39 ++++++++++++++++++++++++++++++++------- KSPCommon.targets | 8 +------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index 3df599f..63d2051 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -4,7 +4,27 @@ true - + + + + false + false + + + false + + + false + false + + + false + + + false + + + $(MSBuildProjectDirectory)/../GameData/$(MSBuildProjectName)/ @@ -15,30 +35,35 @@ 1.12 1.11 1.10 1.9 1.8 - + true true true true - + true - true - + true - true + + true true - + false + + 1.12 + 1.8 + 1.12 + diff --git a/KSPCommon.targets b/KSPCommon.targets index 582ff86..62375cd 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -243,13 +243,7 @@ - - - 1.12 - 1.8 - 1.12 - - + Date: Wed, 23 Jul 2025 23:44:04 -0700 Subject: [PATCH 35/85] Write more docs All properties and most items are now documented. dependencies page now recommends using `ModReference` --- docs/msbuild/configuration.md | 131 +++++++++++++++++++++++++++++----- docs/msbuild/dependencies.md | 45 +++++------- 2 files changed, 133 insertions(+), 43 deletions(-) diff --git a/docs/msbuild/configuration.md b/docs/msbuild/configuration.md index 75b2fd9..9626663 100644 --- a/docs/msbuild/configuration.md +++ b/docs/msbuild/configuration.md @@ -26,20 +26,6 @@ default: `1.12 1.11 1.10 1.9 1.8` Used by the `CKANInstall` target to set additional KSP versions to treat as compatible when installing ``` -```{confval} KSPBT_GenerateAssemblyAttribute ---- -default: `true` ---- -If set to `true`, automatically generates the `KSPAssembly` for your assembly from the `Version` property. -``` - -```{confval} KSPBT_GenerateDependencyAttributes ---- -default: `true` ---- -If set to `true`, automatically generates `KSPAssemblyDependency` attributes for each dependency. Dependencies should have either the `CKANIdentifier` metadata or `KSPAssemblyName` metadata. Versions can be supplied with `CKANVersion` or `KSPAssemblyVersion`. -``` - ```{confval} KSPBT_ReferenceSystemAssemblies --- default: `true` @@ -56,21 +42,134 @@ If set to `true`, adds assembly references to all UnityEngine assemblies in the ```{confval} KSPBT_ReferenceGameAssemblies --- -default: `true` +default: `true`, except in the `Unity` configuration --- If set to `true`, adds references to Assembly-CSharp and Assembly-CSharp-firstpass assemblies from the KSP install. ``` ```{confval} KSPBT_ReferenceModAssemblies --- -default: `true` +default: `true`, except in the `Unity` configuration --- If set to `true`, adds references to the assemblies included in `ModReference` list. ``` +```{confval} KSPBT_GenerateAssemblyAttribute +--- +default: `true`, except in the `Unity` configuration +--- +If set to `true`, automatically generates the `KSPAssembly` for your assembly from the `Version` property. +``` + +```{confval} KSPBT_GenerateDependencyAttributes +--- +default: `true`, except in the `Unity` configuration +--- +If set to `true`, automatically generates `KSPAssemblyDependency` attributes for each dependency. Dependencies should have either the `CKANIdentifier` metadata or `KSPAssemblyName` metadata. Versions can be supplied with `CKANVersion` or `KSPAssemblyVersion`. +``` + +```{confval} KSPBT_CopyDLLsToPluginFolder +--- +default: `true`, except in the `Unity` configuration +--- +If set to `true`, automatically copies the compiled DLL to the {confval}`KSPBT_ModPluginFolder`. +``` + +```{confval} KSPBT_GenerateVersionFile +--- +default: `true`, except in the `Unity` configuration +--- +If set to `true`, automatically generates a version file using the information in any {confval}`KSPVersionFile` items. Without defining a {confval}`KSPVersionFile`, nothing will be generated. See [](generating-version-files.md/) for more details. +``` + ````{confval} KSPBT_GameRoot ```{warning} You should **not** set or use this property in your csproj file. ``` This property should be set to the root directory of your KSP install. see [Locating your KSP Install](getting-started.md/#locating-your-ksp-install) ```` + +## Items + +````{confval} ModReference +A reference to another mod that is a dependency. This mod will be automatically referenced in the build process and installed using CKAN if an identifier is given. See [](dependencies.md) for examples. + +```{rubric} Metadata +``` + +```{describe} Identity +The name of the mod you are referencing, as set in that mod's `KSPAssemblyAttribute` +``` + +```{describe} DLLPath +The path of the mod's assembly to reference when building, relative to {confval}`KSPBT_GameRoot`. +``` + +```{describe} CKANIdentifier +The name of the mod in CKAN to install before building. +``` + +```{describe} CKANVersion +The specific version to install from CKAN, if any. +``` + +Any additional metadata is copied to the resulting [`Reference`](https://learn.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-items?view=vs-2022#reference) item +```` + +````{confval} KSPVersionFile +Defines a version file to generate. See [](generating-version-files.md) for examples. + +```{rubric} Metadata +``` + +```{describe} Identity +To create a new version file from scratch, set to `.`. Otherwise set to a path to a json version file to use as a base +``` +```{describe} Destination +Path to where the generated json version file should be placed +``` + +```{confval} Name +--- +default: `$(ProjectName)` +--- +The mod name. Corresponds to the `NAME` value in json. +``` + +```{confval} Version +--- +default: `$(FileVersion)` +--- +The mod version. Corresponds with the `VERSION` value in json. +``` + +```{describe} URL +The URL of the remote version file. Corresponds with the `URL` value in json. +``` + +```{describe} Download +Where to link players to update your mod. Corresponds with the `DOWNLOAD` value in json. +``` + +```{confval} KSP_Version +--- +default: `1.12` +--- +The KSP version the mod is targeting. Corresponds with the `KSP_VERSION` value in json. +``` + +```{confval} KSP_Version_Min +--- +default: `1.8` +--- +The minimum supported KSP version. Corresponds with the `KSP_VERSION_MIN` value in json. +``` + +```{confval} KSP_Version_Max +--- +default: `1.12` +--- +The maximum supported KSP version. Corresponds with the `KSP_VERSION_MAX` value in json. +``` + +```` diff --git a/docs/msbuild/dependencies.md b/docs/msbuild/dependencies.md index 9a5abed..6241621 100644 --- a/docs/msbuild/dependencies.md +++ b/docs/msbuild/dependencies.md @@ -4,33 +4,31 @@ KSPBuildTools can help manage other mods that you depend on ## Referencing Dependency DLLs -Mod DLLs should be referenced as with any other DLLs, like so. See [the Microsoft docs on Reference items](https://learn.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-items?view=vs-2022#reference) for more info. Make sure that `False`{l=xml} is set or the DLL will be copied to your output directory. +Mod DLLs should be referenced with the {confval}`ModReference` item, like so. -the {confval}`KSPBT_GameRoot` property can be used to reference the KSP install wherever it is. ```xml - - False - - - $(KSPBT_GameRoot)/GameData/000_Harmony/0Harmony.dll - False - + + GameData/Modulemanager*.dll + + + GameData/000_Harmony/0Harmony.dll + ``` ## Installing Dependencies Automatically -KSPBuildTools can install CKAN mods automatically when built. This is useful for CI workflows such as those using the {gha:action}`compile` action, or to make it easier for others to compile your mod themselves. Either add the `` metadata to your `` items, or if the dependency mod doesn't have a dll you need to reference you can use the `` item. +KSPBuildTools can install CKAN mods automatically when built. This is useful for CI workflows such as those using the {gha:action}`compile` action, or to make it easier for others to compile your mod themselves. Either add the `` metadata to your `` items, or if the dependency mod doesn't have a dll you need to reference you can use the `` item. ```xml - - False + + GameData/Modulemanager*.dll ModuleManager - + @@ -42,11 +40,11 @@ You can also mark explicit versions to install. ```xml - - False + + GameData/Modulemanager*.dll ModuleManager 4.2.3 - + @@ -59,26 +57,19 @@ KSP mods should mark their dependency DLLs using the `KSPAssemblyDependency` att `[assembly: KSPAssemblyDependency("0Harmony", 0, 0, 0)]`{l=csharp} -If the {confval}`KSPBT_GenerateDependencyAttributes` property is set to `true`, KSPBuildTools will generate these attributes automatically. It uses any `Reference` item that has a `` or `` metadata value. +If the {confval}`KSPBT_GenerateDependencyAttributes` property is set to `true` (the default), KSPBuildTools will generate these attributes automatically. -The assembly name is set to the `` metadata value, and falls back to the `` metadata value. +The assembly name is taken from the value of the item. The version is taken from the `` metadata value, however leaving it at the default of 0.0.0 is usually acceptable ```xml - - False + + GameData/TweakScale/plugins/Scale.dll TweakScaleRescaled - Scale 3.2.0 - - - - true - true - ``` \ No newline at end of file From 7ec5f4dda75b5cef6af6ec1b37a6647f77439f17 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 5 Aug 2025 22:43:40 -0700 Subject: [PATCH 36/85] Allow per-dependency disabling of attribute generation --- KSPCommon.props | 1 + KSPCommon.targets | 4 ++-- docs/msbuild/dependencies.md | 17 +++++++++++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index 63d2051..4cbfe17 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -58,6 +58,7 @@ false + true 1.12 diff --git a/KSPCommon.targets b/KSPCommon.targets index 62375cd..257da3c 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -133,7 +133,7 @@ Condition=" '$(KSPBT_ReferenceModAssemblies)' == 'true' "> - %(ModReference.identity) + %(ModReference.identity) @@ -208,7 +208,7 @@ - + $([System.String]::Copy('%(Reference.identity)').Split(',')[0]) %(Reference.CKANVersion) 0.0 diff --git a/docs/msbuild/dependencies.md b/docs/msbuild/dependencies.md index 6241621..064c723 100644 --- a/docs/msbuild/dependencies.md +++ b/docs/msbuild/dependencies.md @@ -66,10 +66,23 @@ The version is taken from the `` metadata value, however lea ```xml - + GameData/TweakScale/plugins/Scale.dll TweakScaleRescaled 3.2.0 - + + +``` + +To disable generating the `KSPAssemblyDependency` attribute for a single dependency (for example, if it lacks the `KSPAssembly` attribute), you can set `GenerateDependencyAttribute` to false + +```xml + + + + GameData/TweakScale/plugins/Scale.dll + TweakScaleRescaled + false + ``` \ No newline at end of file From d7421b7514a42daf949ade4ed5a4fb68c81e4145 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 5 Aug 2025 23:10:24 -0700 Subject: [PATCH 37/85] Release 0.1.0-alpha.1 ### Msbuild - Renamed global msbuild properties to have the `KSPBT_` prefix to avoid namespace collisions with other frameworks - `KSPRoot` is now `KSPBT_GameRoot`. It should no longer be referenced within a .csproj file - `RepoRootPath` is now `KSPBT_ModRoot`, and should now point to the mod folder within GameData rather than the root of a git repo - `BinariesOutputRelativePath` is now `KSPBT_ModPluginFolder` - `GenerateKSPAssemblyAttribute` is now `KSPBT_GenerateAssemblyAttribute` and defaults to true - `GenerateKSPAssemblyDependencyAttributes` is now `KSPBT_GenerateDependencyAttributes` and defaults to true - `ReferenceUnityAssemblies` is now `KSPBT_ReferenceUnityAssemblies` - `ReferenceKSPAssemblies` is now `KSPBT_ReferenceGameAssemblies` - Added the `KSPBT_ReferenceSystemAssemblies` property to control referencing the mono system DLLs within the KSP managed folder. Setting this property to false will load the implicit framework DLLs instead. - Mod dependencies should now be declared with `ModReference` items. This avoids the need for the KSP install path to be known at evaluation time. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 117803f..474414c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file -## Unreleased +## 0.1.0-alpha.1 - 2025-08-06 ### Msbuild From 4147bc3d641bdd18082bad35aebeae602ffb991f Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 20:53:36 -0700 Subject: [PATCH 38/85] try this, see if it breaks anything --- .github/actions/compile/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index b86da49..e4c02a8 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -69,7 +69,7 @@ runs: - name: Restore Mod Solution shell: bash working-directory: ${{ inputs.working-directory }} - run: nuget restore ${{ inputs.solution-file-path }} -Verbosity detailed + run: dotnet restore ${{ inputs.solution-file-path }} -Verbosity detailed - name: Build Mod Solution shell: bash From 25a61cbacd61ae511526030dd787fbc156ebe9df Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 20:59:09 -0700 Subject: [PATCH 39/85] Fix verbosity setting --- .github/actions/compile/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index e4c02a8..f0d6f34 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -69,7 +69,7 @@ runs: - name: Restore Mod Solution shell: bash working-directory: ${{ inputs.working-directory }} - run: dotnet restore ${{ inputs.solution-file-path }} -Verbosity detailed + run: dotnet restore ${{ inputs.solution-file-path }} ${{ runner.debug && '-v:diagnostic' }} - name: Build Mod Solution shell: bash From 60b81678f0d7deb10c53beb1e2393afb64a7d008 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 20:59:16 -0700 Subject: [PATCH 40/85] Fix assetbundle test --- .github/workflows/internal-test-assetbundle.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/internal-test-assetbundle.yml b/.github/workflows/internal-test-assetbundle.yml index 097d440..6463d47 100644 --- a/.github/workflows/internal-test-assetbundle.yml +++ b/.github/workflows/internal-test-assetbundle.yml @@ -18,13 +18,14 @@ jobs: - uses: actions/checkout@v4 with: - repository: 'drewcassidy/Resurfaced' + repository: 'Tantares/Resurfaced' + ref: "v.1.3.1" path: 'Resurfaced' - uses: ./.github/actions/build-assetbundles with: assetbundle-name: foo.shab - asset-files: 'Resurfaced/*.shader Resurfaced/*.cginc' + asset-files: 'Resurfaced/Source/Shaders/*.shader Resurfaced/Source/Shaders/*.cginc' env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} From a81f67084d5ac0729aaa2eefc0e2eca9b5bd9738 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 21:07:59 -0700 Subject: [PATCH 41/85] use dotnet nuget add source --- .github/workflows/internal-test-plugin-nuget.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/internal-test-plugin-nuget.yml b/.github/workflows/internal-test-plugin-nuget.yml index d3dbbc5..b3a9229 100644 --- a/.github/workflows/internal-test-plugin-nuget.yml +++ b/.github/workflows/internal-test-plugin-nuget.yml @@ -30,7 +30,7 @@ jobs: - name: Setup Nuget Package Sources run: | mkdir -p ${{ env.NuGetDirectory }}/local - nuget sources add -Name local -Source ${{ env.NuGetDirectory }}/local + dotnet nuget add source ${{ env.NuGetDirectory }}/local -n local - uses: actions/download-artifact@v4 with: From 2778355f8287a16d880df1de0b4b2af36e75d4c4 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 21:10:48 -0700 Subject: [PATCH 42/85] try dotnet nuget restore --- .github/actions/compile/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index f0d6f34..d481a64 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -69,7 +69,7 @@ runs: - name: Restore Mod Solution shell: bash working-directory: ${{ inputs.working-directory }} - run: dotnet restore ${{ inputs.solution-file-path }} ${{ runner.debug && '-v:diagnostic' }} + run: dotnet nuget restore ${{ inputs.solution-file-path }} ${{ runner.debug && '-v:diagnostic' }} - name: Build Mod Solution shell: bash From 5d58022ab42bd38f8ba275d668cf6dbeac4245d9 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 21:13:43 -0700 Subject: [PATCH 43/85] Remove support for legacy csproj files It is too constraining to support both. At the moment the msbuild side still supports them, but the actions do not. they will not be tested any longer --- .github/actions/compile/action.yml | 2 +- .github/workflows/internal-ci.yml | 3 - .../workflows/internal-test-plugin-legacy.yml | 26 ------- tests/plugin-mod-legacy/.gitignore | 4 -- tests/plugin-mod-legacy/PluginModLegacy.sln | 22 ------ .../Properties/AssemblyInfo.cs | 10 --- .../PluginModLegacy/packages.config | 4 -- .../PluginModLegacy/plugin-mod-legacy.csproj | 70 ------------------- 8 files changed, 1 insertion(+), 140 deletions(-) delete mode 100644 .github/workflows/internal-test-plugin-legacy.yml delete mode 100644 tests/plugin-mod-legacy/.gitignore delete mode 100644 tests/plugin-mod-legacy/PluginModLegacy.sln delete mode 100644 tests/plugin-mod-legacy/PluginModLegacy/Properties/AssemblyInfo.cs delete mode 100644 tests/plugin-mod-legacy/PluginModLegacy/packages.config delete mode 100644 tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index d481a64..f0d6f34 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -69,7 +69,7 @@ runs: - name: Restore Mod Solution shell: bash working-directory: ${{ inputs.working-directory }} - run: dotnet nuget restore ${{ inputs.solution-file-path }} ${{ runner.debug && '-v:diagnostic' }} + run: dotnet restore ${{ inputs.solution-file-path }} ${{ runner.debug && '-v:diagnostic' }} - name: Build Mod Solution shell: bash diff --git a/.github/workflows/internal-ci.yml b/.github/workflows/internal-ci.yml index bdb7b71..ffab86d 100644 --- a/.github/workflows/internal-ci.yml +++ b/.github/workflows/internal-ci.yml @@ -60,9 +60,6 @@ jobs: with: package-version: ${{ needs.build.outputs.package-version }} - test-plugin-legacy: - uses: './.github/workflows/internal-test-plugin-legacy.yml' - test-assetbundle: uses: './.github/workflows/internal-test-assetbundle.yml' if: github.event_name != 'pull_request' diff --git a/.github/workflows/internal-test-plugin-legacy.yml b/.github/workflows/internal-test-plugin-legacy.yml deleted file mode 100644 index da7c4d1..0000000 --- a/.github/workflows/internal-test-plugin-legacy.yml +++ /dev/null @@ -1,26 +0,0 @@ -# This is an internal test for KSPBuildTools and not intended to be used by other projects -name: Test Plugin Mod (Legacy) - -on: - workflow_call: - -env: - TESTDIR: tests/plugin-mod-legacy - -jobs: - build: - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 - - - uses: ./.github/actions/setup-ckan - - - uses: ./.github/actions/compile - with: - ksp-zip-url: https://github.com/KSPModdingLibs/KSPLibs/raw/main/KSP-1.12.5.zip - working-directory: ${{ env.TESTDIR }} - - - uses: ./.github/actions/assemble-release - with: - artifacts: ${{ env.TESTDIR }}/GameData - output-file-name: plugin-mod-legacy diff --git a/tests/plugin-mod-legacy/.gitignore b/tests/plugin-mod-legacy/.gitignore deleted file mode 100644 index c29446b..0000000 --- a/tests/plugin-mod-legacy/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -packages -obj -bin -GameData \ No newline at end of file diff --git a/tests/plugin-mod-legacy/PluginModLegacy.sln b/tests/plugin-mod-legacy/PluginModLegacy.sln deleted file mode 100644 index 20a4cfd..0000000 --- a/tests/plugin-mod-legacy/PluginModLegacy.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "plugin-mod-legacy", "PluginModLegacy\plugin-mod-legacy.csproj", "{F19C7AB4-50C2-4378-9673-CC039CA12E10}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal diff --git a/tests/plugin-mod-legacy/PluginModLegacy/Properties/AssemblyInfo.cs b/tests/plugin-mod-legacy/PluginModLegacy/Properties/AssemblyInfo.cs deleted file mode 100644 index 9bf32e5..0000000 --- a/tests/plugin-mod-legacy/PluginModLegacy/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. -[assembly: AssemblyTitle ("PluginModLegacy")] -[assembly: AssemblyDescription ("Test mod using a legacy csproj")] - -// This supposedly helps avoid plugin depencency problems. -[assembly: KSPAssembly("plugin-mod-legacy", 1, 2, 3)] \ No newline at end of file diff --git a/tests/plugin-mod-legacy/PluginModLegacy/packages.config b/tests/plugin-mod-legacy/PluginModLegacy/packages.config deleted file mode 100644 index 20174bf..0000000 --- a/tests/plugin-mod-legacy/PluginModLegacy/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj b/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj deleted file mode 100644 index 72bb719..0000000 --- a/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj +++ /dev/null @@ -1,70 +0,0 @@ - - - - - Debug - AnyCPU - {F19C7AB4-50C2-4378-9673-CC039CA12E10} - Library - JSI - PluginModMono - v4.8 - 65001 - - - - - - true - portable - false - bin\Debug - DEBUG; - prompt - 4 - false - AnyCPU - false - - - true - bin\Release - prompt - 4 - false - AnyCPU - false - portable - true - - - Always - - - true - bin\Profile\ - ENABLE_PROFILER - true - portable - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - \ No newline at end of file From ed156a3e9a043009c6ed9fd5153bc19a2678d50e Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 21:15:00 -0700 Subject: [PATCH 44/85] fix CI job --- .github/workflows/internal-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/internal-ci.yml b/.github/workflows/internal-ci.yml index ffab86d..c27f38d 100644 --- a/.github/workflows/internal-ci.yml +++ b/.github/workflows/internal-ci.yml @@ -67,7 +67,7 @@ jobs: deploy: runs-on: ubuntu-22.04 - needs: [ build, test-plugin, test-plugin-nuget, test-plugin-legacy, test-assetbundle ] + needs: [ build, test-plugin, test-plugin-nuget, test-assetbundle ] environment: name: "NuGet" url: "https://www.nuget.org/packages/KSPBuildTools" From 69d9e3b04010dbb9d83787e5f454290c1f6acfd1 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 22:26:41 -0700 Subject: [PATCH 45/85] Bump all jobs to ubuntu 24 --- .github/workflows/internal-ci.yml | 2 +- .github/workflows/internal-test-assetbundle.yml | 2 +- .github/workflows/internal-test-plugin-nuget.yml | 2 +- .github/workflows/internal-test-plugin.yml | 2 +- .github/workflows/publish-to-spacedock.yml | 2 +- .github/workflows/validate.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/internal-ci.yml b/.github/workflows/internal-ci.yml index c27f38d..842929b 100644 --- a/.github/workflows/internal-ci.yml +++ b/.github/workflows/internal-ci.yml @@ -19,7 +19,7 @@ jobs: env: DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 DOTNET_NOLOGO: true - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 outputs: package-version: ${{ steps.get-version.outputs.version }} steps: diff --git a/.github/workflows/internal-test-assetbundle.yml b/.github/workflows/internal-test-assetbundle.yml index 6463d47..6078dd1 100644 --- a/.github/workflows/internal-test-assetbundle.yml +++ b/.github/workflows/internal-test-assetbundle.yml @@ -12,7 +12,7 @@ env: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/internal-test-plugin-nuget.yml b/.github/workflows/internal-test-plugin-nuget.yml index b3a9229..7d2e197 100644 --- a/.github/workflows/internal-test-plugin-nuget.yml +++ b/.github/workflows/internal-test-plugin-nuget.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: dotnet-version: [ 5.x, 7.x, 9.x ] - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/internal-test-plugin.yml b/.github/workflows/internal-test-plugin.yml index d21f075..df8547c 100644 --- a/.github/workflows/internal-test-plugin.yml +++ b/.github/workflows/internal-test-plugin.yml @@ -9,7 +9,7 @@ env: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/publish-to-spacedock.yml b/.github/workflows/publish-to-spacedock.yml index e7d6616..c9c2955 100644 --- a/.github/workflows/publish-to-spacedock.yml +++ b/.github/workflows/publish-to-spacedock.yml @@ -27,7 +27,7 @@ on: jobs: publish-to-spacedock: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: get-release-info id: get-release-info diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index f3c4e26..a5a148b 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -6,7 +6,7 @@ on: jobs: validate: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Checkout repo uses: actions/checkout@v4 From 5410ef10ee213848f4565d0cdc6fa29b2a071494 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 22:44:36 -0700 Subject: [PATCH 46/85] Fix wonky merge --- .github/actions/compile/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index 5583f49..a6609bd 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -76,5 +76,5 @@ runs: working-directory: ${{ inputs.working-directory }} run: > dotnet msbuild -m:1 -p:Configuration=${{ inputs.build-configuration }} - -p:ManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} + -p:KSPBT_ManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} ${{ runner.debug && '-v:diagnostic' }} From 364a50e0119265965390ecbaaaf6cc70d56e8e31 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 22:54:14 -0700 Subject: [PATCH 47/85] Update docs dependencies --- docs/requirements.txt | 62 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index d9f8631..291ac6d 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,16 +1,12 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --output-file=docs/requirements.txt --strip-extras docs/requirements.in -# +# This file was autogenerated by uv via the following command: +# uv pip compile --output-file=docs/requirements.txt --strip-extras docs/requirements.in alabaster==1.0.0 # via sphinx -babel==2.16.0 +babel==2.17.0 # via sphinx -certifi==2024.8.30 +certifi==2025.10.5 # via requests -charset-normalizer==3.4.0 +charset-normalizer==3.4.4 # via requests docutils==0.21.2 # via @@ -18,11 +14,11 @@ docutils==0.21.2 # sphinx # sphinx-jinja # sphinx-rtd-theme -gitdb==4.0.11 +gitdb==4.0.12 # via gitpython -gitpython==3.1.43 +gitpython==3.1.45 # via sphinx-gha -idna==3.10 +idna==3.11 # via requests imagesize==1.4.1 # via sphinx @@ -35,31 +31,33 @@ markdown-it-py==3.0.0 # via # mdit-py-plugins # myst-parser -markupsafe==3.0.2 +markupsafe==3.0.3 # via jinja2 -mdit-py-plugins==0.4.2 +mdit-py-plugins==0.5.0 # via myst-parser mdurl==0.1.2 # via markdown-it-py -myst-parser==4.0.0 +myst-parser==4.0.1 # via sphinx-gha -packaging==24.1 +packaging==25.0 # via sphinx -pygments==2.18.0 +pygments==2.19.2 # via sphinx -pyyaml==6.0.2 - # via - # myst-parser - # sphinx-gha -requests==2.32.4 +pyyaml==6.0.3 + # via myst-parser +requests==2.32.5 + # via sphinx +roman-numerals-py==3.1.0 # via sphinx -smmap==5.0.1 +ruamel-yaml==0.18.16 + # via sphinx-gha +smmap==5.0.2 # via gitdb -snowballstemmer==2.2.0 +snowballstemmer==3.0.1 # via sphinx -sphinx==8.1.3 +sphinx==8.2.3 # via - # -r requirements.in + # -r docs/requirements.in # myst-parser # sphinx-copybutton # sphinx-gha @@ -67,13 +65,13 @@ sphinx==8.1.3 # sphinx-rtd-theme # sphinxcontrib-jquery sphinx-copybutton==0.5.2 - # via -r requirements.in -sphinx-gha==0.1.0 - # via -r requirements.in + # via -r docs/requirements.in +sphinx-gha==1.0.0 + # via -r docs/requirements.in sphinx-jinja==2.0.2 - # via -r requirements.in -sphinx-rtd-theme==3.0.1 - # via -r requirements.in + # via -r docs/requirements.in +sphinx-rtd-theme==3.0.2 + # via -r docs/requirements.in sphinxcontrib-applehelp==2.0.0 # via sphinx sphinxcontrib-devhelp==2.0.0 From e4dc1f79a3537f40e7a29f653948f45caed4c6a5 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Mon, 27 Oct 2025 23:40:27 -0700 Subject: [PATCH 48/85] Only include Log.cs when `KSPBT_ReferenceUnityAssemblies` is `true` (#61) --- CHANGELOG.md | 1 + KSPCommon.props | 6 ++++-- include/{ => unity}/Log.cs | 0 3 files changed, 5 insertions(+), 2 deletions(-) rename include/{ => unity}/Log.cs (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c8ca1b..525a016 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file managed folder. Setting this property to false will load the implicit framework DLLs instead. - Mod dependencies should now be declared with `ModReference` items. This avoids the need for the KSP install path to be known at evaluation time. +- Only include Log.cs (or anything else in include/unity) when `KSPBT_ReferenceUnityAssemblies` is `true` (#61) ### Docs diff --git a/KSPCommon.props b/KSPCommon.props index 4cbfe17..542b1bb 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -89,7 +89,9 @@ - - + + diff --git a/include/Log.cs b/include/unity/Log.cs similarity index 100% rename from include/Log.cs rename to include/unity/Log.cs From 06871079ae789a8397165c459a5f1729e1e7c4bb Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 28 Oct 2025 00:00:42 -0700 Subject: [PATCH 49/85] Fix #64 --- CHANGELOG.md | 1 + KSPCommon.targets | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 525a016..e3bd860 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ All notable changes to this project will be documented in this file - Mod dependencies should now be declared with `ModReference` items. This avoids the need for the KSP install path to be known at evaluation time. - Only include Log.cs (or anything else in include/unity) when `KSPBT_ReferenceUnityAssemblies` is `true` (#61) +- Fix `KSP_VERSION_MAX` getting mangled when using an existing version file (#64) ### Docs diff --git a/KSPCommon.targets b/KSPCommon.targets index 661bffa..7d050cf 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -280,7 +280,7 @@ - + From c109fec9bc6dd3f0fe20852443021351a88beecd Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 28 Oct 2025 16:31:09 -0700 Subject: [PATCH 50/85] Speed up setup-ckan action --- .github/actions/setup-ckan/action.yml | 3 ++- CHANGELOG.md | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup-ckan/action.yml b/.github/actions/setup-ckan/action.yml index 346fa6e..d097c39 100644 --- a/.github/actions/setup-ckan/action.yml +++ b/.github/actions/setup-ckan/action.yml @@ -45,9 +45,10 @@ runs: - name: Install CKAN shell: bash run: | + rm -f /var/lib/man-db/auto-update # skip updating man pages, which takes a long time and makes no sense in a CI job gh release download ${{ inputs.ckan-version }} --repo ${{ inputs.ckan-repo }} --pattern 'ckan*.deb' -O ckan.deb ${{ env.ACT && 'sudo apt update --quiet' }} - sudo apt install --quiet ./ckan.deb ${{ runner.debug && '--verbose-versions' }} + sudo apt install --quiet --no-install-recommends --no-install-suggested ./ckan.deb ${{ runner.debug && '--verbose-versions' }} ckan version env: GH_TOKEN: ${{ github.token }} diff --git a/CHANGELOG.md b/CHANGELOG.md index e3bd860..d3fd0e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,10 @@ All notable changes to this project will be documented in this file - Fixed git submodule example to work even for tagged releases (#49) +### Actions + +- Sped up `setup-ckan` action by skipping recommended packages and man-db updates + ## 0.0.4 - 2025-06-15 From dc6a280eb971f98d168325cddd543bece6318073 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 28 Oct 2025 16:31:41 -0700 Subject: [PATCH 51/85] need sudo --- .github/actions/setup-ckan/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup-ckan/action.yml b/.github/actions/setup-ckan/action.yml index d097c39..73edcf4 100644 --- a/.github/actions/setup-ckan/action.yml +++ b/.github/actions/setup-ckan/action.yml @@ -45,7 +45,7 @@ runs: - name: Install CKAN shell: bash run: | - rm -f /var/lib/man-db/auto-update # skip updating man pages, which takes a long time and makes no sense in a CI job + sudo rm -f /var/lib/man-db/auto-update # skip updating man pages, which takes a long time and makes no sense in a CI job gh release download ${{ inputs.ckan-version }} --repo ${{ inputs.ckan-repo }} --pattern 'ckan*.deb' -O ckan.deb ${{ env.ACT && 'sudo apt update --quiet' }} sudo apt install --quiet --no-install-recommends --no-install-suggested ./ckan.deb ${{ runner.debug && '--verbose-versions' }} From d17f96108e13eba8d7683131d613db73452d8f03 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 28 Oct 2025 16:32:17 -0700 Subject: [PATCH 52/85] fix option name --- .github/actions/setup-ckan/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup-ckan/action.yml b/.github/actions/setup-ckan/action.yml index 73edcf4..3667096 100644 --- a/.github/actions/setup-ckan/action.yml +++ b/.github/actions/setup-ckan/action.yml @@ -48,7 +48,7 @@ runs: sudo rm -f /var/lib/man-db/auto-update # skip updating man pages, which takes a long time and makes no sense in a CI job gh release download ${{ inputs.ckan-version }} --repo ${{ inputs.ckan-repo }} --pattern 'ckan*.deb' -O ckan.deb ${{ env.ACT && 'sudo apt update --quiet' }} - sudo apt install --quiet --no-install-recommends --no-install-suggested ./ckan.deb ${{ runner.debug && '--verbose-versions' }} + sudo apt install --quiet --no-install-recommends --no-install-suggests ./ckan.deb ${{ runner.debug && '--verbose-versions' }} ckan version env: GH_TOKEN: ${{ github.token }} From 09427eded5914b22903051876fdecd1d3d6b3033 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 28 Oct 2025 17:54:33 -0700 Subject: [PATCH 53/85] Pin KSPBT actions within reusable workflows From now on, release with `just release {{args}}` with the usual yaclog version args like `--patch` or `--minor`. It will automatically run `yaclog release` alongside updating all reusable workflows to have the correct tags. Pinning workflows to a branch (or leaving them unpinned) should be avoided from here on, only pin to tags. The pin updating can be done on its own with `just pin-workflows {{ref}}` Makes #67 unnecessary commit 82828e90bd63b08f0f87c3daa1896096854dc7a0 Author: Andrew Cassidy Date: Tue Oct 28 17:49:32 2025 -0700 Add note to the docs commit f70929c4bdcdbc6ccda95edaed1f46cfdd70c4bb Author: Andrew Cassidy Date: Tue Oct 28 17:41:19 2025 -0700 Only run checks for tag events commit 108d8b86793a6917104af65bec0d2ded1fb51a5c Author: Andrew Cassidy Date: Tue Oct 28 17:39:05 2025 -0700 Check for mismatches this CI run should fail, I'll later restrict this check to only on tag pushes commit bf2a436b20dd2760aa991c181729781eaa706e75 Author: Andrew Cassidy Date: Tue Oct 28 17:37:59 2025 -0700 Fix regex commit adb4c779967c4b4b3c970d0136688f298a924e38 Author: Andrew Cassidy Date: Tue Oct 28 17:35:22 2025 -0700 Fix line endings commit 0c99c7fdb84969d338a30564bf699c181ffdc887 Author: Andrew Cassidy Date: Tue Oct 28 17:21:15 2025 -0700 run yaclog via uv this allows us to pin the version commit 814ba633d398568a01734be63426e9c5128965fa Author: Andrew Cassidy Date: Tue Oct 28 17:14:56 2025 -0700 Add tool to pin workflows while releasing a new version --- .github/workflows/.gitignore | 1 + .github/workflows/build.yml | 8 +- .github/workflows/create-release.yml | 10 +-- .github/workflows/internal-ci.yml | 5 ++ .github/workflows/publish-to-spacedock.yml | 94 +++++++++++----------- .gitignore | 1 + docs/workflows/index.md | 4 + justfile | 15 ++++ 8 files changed, 82 insertions(+), 56 deletions(-) create mode 100644 .github/workflows/.gitignore create mode 100644 justfile diff --git a/.github/workflows/.gitignore b/.github/workflows/.gitignore new file mode 100644 index 0000000..3c9c01a --- /dev/null +++ b/.github/workflows/.gitignore @@ -0,0 +1 @@ +*.backup \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 486ae2c..7646ad9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,17 +45,17 @@ jobs: submodules: true # Install CKAN and set up an instance - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@main + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@0.0.4 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} # Install any listed CKAN dependencies - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@main + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@0.0.4 if: ${{ inputs.dependency-identifiers }} with: dependency-identifiers: ${{ inputs.dependency-identifiers }} # Compile the mod - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@main + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@0.0.4 if: ${{ inputs.use-msbuild }} with: build-configuration: ${{ inputs.build-configuration }} @@ -64,7 +64,7 @@ jobs: solution-file-path: ${{ inputs.solution-file-path }} # Assemble the mod into a release package and upload it as an artifact - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@main + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@0.0.4 with: artifacts: ${{ inputs.artifacts }} output-file-name: ${{ github.event.repository.name }}-${{ inputs.build-configuration }} diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index cb50cb9..046c987 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -64,7 +64,7 @@ jobs: submodules: true - name: update-version - uses: KSPModdingLibs/KSPBuildTools/.github/actions/update-version@main + uses: KSPModdingLibs/KSPBuildTools/.github/actions/update-version@0.0.4 with: version-string: ${{ inputs.version-string }} template-extension: ${{ inputs.version-template-extension }} @@ -81,18 +81,18 @@ jobs: git tag -f -a "$VERSION_STRING" -m "$VERSION_STRING" # Install CKAN and set up an instance - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@main + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@0.0.4 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} # Install any listed CKAN dependencies - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@main + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@0.0.4 if: ${{ inputs.dependency-identifiers }} with: dependency-identifiers: ${{ inputs.dependency-identifiers }} - name: compile if: ${{ inputs.use-msbuild }} - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@main + uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@0.0.4 with: build-configuration: ${{ inputs.build-configuration }} ksp-zip-url: ${{ inputs.ksp-zip-url }} @@ -101,7 +101,7 @@ jobs: - name: assemble-release id: assemble-release - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@main + uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@0.0.4 with: artifacts: ${{ inputs.artifacts }} output-file-name: ${{ github.event.repository.name }}-${{ env.VERSION_STRING }} diff --git a/.github/workflows/internal-ci.yml b/.github/workflows/internal-ci.yml index 842929b..aba53ca 100644 --- a/.github/workflows/internal-ci.yml +++ b/.github/workflows/internal-ci.yml @@ -27,6 +27,11 @@ jobs: with: fetch-depth: 0 # get full history, not shallow clone + - name: Check for workflows with outdated action pins + if: startsWith(github.ref, 'refs/tags') + run: | + ! grep -P -i 'uses: KSPModdingLibs/KSPBuildTools/\.github/actions/.*@(?!${{ github.ref_name }}$)' .github/workflows/*.yml + - name: Setup .NET uses: actions/setup-dotnet@v4 with: diff --git a/.github/workflows/publish-to-spacedock.yml b/.github/workflows/publish-to-spacedock.yml index c9c2955..4901449 100644 --- a/.github/workflows/publish-to-spacedock.yml +++ b/.github/workflows/publish-to-spacedock.yml @@ -1,47 +1,47 @@ -name: publish-to-spacedock - -on: - workflow_call: - inputs: - spacedock-username: - type: string - required: true - description: Spacedock login username - mod-id: - type: string - required: true - description: ID of the mod we are deploying. Get this from the end of your mod's spacedock URL - release-tag: - type: string - required: false - description: The tag of the release. Will be the same as `inputs.release-tag` unless it was blank. - game-id: - type: string - required: false - default: '3102' # hardcoded to KSP1 gameid. retrieve from https://spacedock.info/api/games - description: ID of the game we are deploying for. This should probably be left as-is for KSP 1. - secrets: - spacedock-password: - required: true - description: Spacedock login password. Store this as a secret! - -jobs: - publish-to-spacedock: - runs-on: ubuntu-24.04 - steps: - - name: get-release-info - id: get-release-info - uses: KSPModdingLibs/KSPBuildTools/.github/actions/get-release-info@main - with: - release-tag: ${{ inputs.release-tag }} - - - name: upload-to-spacedock - uses: KSP2Community/spacedock-upload@v1.0.0 - with: - username: ${{ inputs.spacedock-username }} - password: ${{ secrets.spacedock-password }} - game_id: ${{ inputs.game-id }} - mod_id: ${{ inputs.mod-id }} - version: ${{ steps.get-release-info.outputs.version-string }} - zipball: ${{ steps.get-release-info.outputs.artifact-file }} - changelog: ${{ steps.get-release-info.outputs.changelog-file }} +name: publish-to-spacedock + +on: + workflow_call: + inputs: + spacedock-username: + type: string + required: true + description: Spacedock login username + mod-id: + type: string + required: true + description: ID of the mod we are deploying. Get this from the end of your mod's spacedock URL + release-tag: + type: string + required: false + description: The tag of the release. Will be the same as `inputs.release-tag` unless it was blank. + game-id: + type: string + required: false + default: '3102' # hardcoded to KSP1 gameid. retrieve from https://spacedock.info/api/games + description: ID of the game we are deploying for. This should probably be left as-is for KSP 1. + secrets: + spacedock-password: + required: true + description: Spacedock login password. Store this as a secret! + +jobs: + publish-to-spacedock: + runs-on: ubuntu-24.04 + steps: + - name: get-release-info + id: get-release-info + uses: KSPModdingLibs/KSPBuildTools/.github/actions/get-release-info@0.0.4 + with: + release-tag: ${{ inputs.release-tag }} + + - name: upload-to-spacedock + uses: KSP2Community/spacedock-upload@v1.0.0 + with: + username: ${{ inputs.spacedock-username }} + password: ${{ secrets.spacedock-password }} + game_id: ${{ inputs.game-id }} + mod_id: ${{ inputs.mod-id }} + version: ${{ steps.get-release-info.outputs.version-string }} + zipball: ${{ steps.get-release-info.outputs.artifact-file }} + changelog: ${{ steps.get-release-info.outputs.changelog-file }} diff --git a/.gitignore b/.gitignore index 8842667..b6d20ad 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ docs/_build .DS_Store .idea *.user +*.backup diff --git a/docs/workflows/index.md b/docs/workflows/index.md index bf9ed7e..c944af6 100644 --- a/docs/workflows/index.md +++ b/docs/workflows/index.md @@ -4,6 +4,10 @@ KSPBuildTools provides several reusable workflows for use with Github Actions. T For usage, see [Reusing Workflows](https://docs.github.com/en/actions/sharing-automations/reusing-workflows) in the Github docs. +```{warning} +Due to a limitation of Github actions, only *tagged releases* have reusable workflows with the correct action version. If you pin a workflow to a branch, or leave your workflow usage unpinned, it may run action versions incompatible with the workflow +``` + ```{toctree} --- caption: Contents diff --git a/justfile b/justfile new file mode 100644 index 0000000..2850ca5 --- /dev/null +++ b/justfile @@ -0,0 +1,15 @@ +set shell:= ['bash', '-c'] +yaclog:= "uv tool run yaclog@1.6.2" + +pin-workflows tag: + sed -E -H -i ".backup" "s|(uses: KSPModdingLibs/KSPBuildTools/\.github/actions/\S+@)\S+|\1{{tag}}|g" .github/workflows/*.yml + +release *args: + {{yaclog}} release {{args}} + @just pin-workflows $({{yaclog}} show --version) + git add .github/workflows/*.yml + {{yaclog}} release -c + +docs: + uv run --with-requirements docs/requirements.txt --no-project -m sphinx docs/ docs/_build + From 14edc673cf26b55ab1175e7d934b5d0dd6023d59 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Wed, 29 Oct 2025 09:38:29 -0700 Subject: [PATCH 54/85] Re-enable support for packages.config style projects in `next` (#68) This requires setting the `use-nuget-restore` option on the compile action/build workflow. --- .github/actions/compile/action.yml | 13 ++++ .github/workflows/build.yml | 9 ++- .github/workflows/internal-ci.yml | 5 +- .../workflows/internal-test-plugin-legacy.yml | 27 +++++++ CHANGELOG.md | 1 + docs/actions/compile.md | 4 +- tests/plugin-mod-legacy/.gitignore | 4 ++ tests/plugin-mod-legacy/PluginModLegacy.sln | 22 ++++++ .../Properties/AssemblyInfo.cs | 10 +++ .../PluginModLegacy/packages.config | 4 ++ .../PluginModLegacy/plugin-mod-legacy.csproj | 70 +++++++++++++++++++ 11 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/internal-test-plugin-legacy.yml create mode 100644 tests/plugin-mod-legacy/.gitignore create mode 100644 tests/plugin-mod-legacy/PluginModLegacy.sln create mode 100644 tests/plugin-mod-legacy/PluginModLegacy/Properties/AssemblyInfo.cs create mode 100644 tests/plugin-mod-legacy/PluginModLegacy/packages.config create mode 100644 tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index a6609bd..597051e 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -36,6 +36,12 @@ inputs: default: ${{ github.workspace }} description: the working directory to run in + use-nuget-restore: + default: 'false' + description: > + Set to true if your project uses a packages.config file instead of packagereferences. Ensure the environment has + nuget and mono installed, either installing them manually or by using the Github Ubuntu-22.04 images + runs: using: composite steps: @@ -68,9 +74,16 @@ runs: - name: Restore Mod Solution shell: bash + if: ${{ inputs.use-nuget-restore != 'true'}} # https://github.com/actions/runner/issues/1483 :sufferbeale: working-directory: ${{ inputs.working-directory }} run: dotnet restore ${{ inputs.solution-file-path }} ${{ runner.debug && '-v:diagnostic' }} + - name: Restore Mod Solution (NuGet) + shell: bash + if: ${{ inputs.use-nuget-restore == 'true'}} + working-directory: ${{ inputs.working-directory }} + run: nuget restore ${{ inputs.solution-file-path }} -Verbosity detailed + - name: Build Mod Solution shell: bash working-directory: ${{ inputs.working-directory }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7646ad9..748f8be 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,6 +22,12 @@ on: description: > If MSBuild should be used. If your mod has no msbuild project (e.g. a pure part mod) you should set this to false + use-nuget-restore: + type: boolean + default: false + description: > + Set to true if your project uses a packages.config file instead of packagereferences. This will cause the job + to run on the Ubuntu-22.04 image instead of Ubuntu-24.04 use-ckan: type: boolean default: false @@ -37,7 +43,7 @@ defaults: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ${{ inputs.use-nuget-restore && 'ubuntu-22.04' || 'ubuntu-24.04' }} steps: - name: Checkout Mod Repo uses: actions/checkout@v4 @@ -62,6 +68,7 @@ jobs: ksp-zip-url: ${{ inputs.ksp-zip-url }} ksp-zip-password: ${{ secrets.ksp-zip-password }} solution-file-path: ${{ inputs.solution-file-path }} + use-nuget-restore: ${{ inputs.use-nuget-restore }} # Assemble the mod into a release package and upload it as an artifact - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@0.0.4 diff --git a/.github/workflows/internal-ci.yml b/.github/workflows/internal-ci.yml index aba53ca..838a2b5 100644 --- a/.github/workflows/internal-ci.yml +++ b/.github/workflows/internal-ci.yml @@ -65,6 +65,9 @@ jobs: with: package-version: ${{ needs.build.outputs.package-version }} + test-plugin-legacy: + uses: './.github/workflows/internal-test-plugin-legacy.yml' + test-assetbundle: uses: './.github/workflows/internal-test-assetbundle.yml' if: github.event_name != 'pull_request' @@ -72,7 +75,7 @@ jobs: deploy: runs-on: ubuntu-22.04 - needs: [ build, test-plugin, test-plugin-nuget, test-assetbundle ] + needs: [ build, test-plugin, test-plugin-nuget, test-plugin-legacy, test-assetbundle ] environment: name: "NuGet" url: "https://www.nuget.org/packages/KSPBuildTools" diff --git a/.github/workflows/internal-test-plugin-legacy.yml b/.github/workflows/internal-test-plugin-legacy.yml new file mode 100644 index 0000000..aefd25b --- /dev/null +++ b/.github/workflows/internal-test-plugin-legacy.yml @@ -0,0 +1,27 @@ +# This is an internal test for KSPBuildTools and not intended to be used by other projects +name: Test Plugin Mod (Legacy) + +on: + workflow_call: + +env: + TESTDIR: tests/plugin-mod-legacy + +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/setup-ckan + + - uses: ./.github/actions/compile + with: + ksp-zip-url: https://github.com/KSPModdingLibs/KSPLibs/raw/main/KSP-1.12.5.zip + working-directory: ${{ env.TESTDIR }} + use-nuget-restore: true + + - uses: ./.github/actions/assemble-release + with: + artifacts: ${{ env.TESTDIR }}/GameData + output-file-name: plugin-mod-legacy diff --git a/CHANGELOG.md b/CHANGELOG.md index d3fd0e2..590dfbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ All notable changes to this project will be documented in this file ### Actions +- Added the `use-nuget-restore` option to the `compile` action to use the `nuget restore` command, for projects using packages.config files. This allows the `compile` action with default settings to work on any Ubuntu runner image - Sped up `setup-ckan` action by skipping recommended packages and man-db updates diff --git a/docs/actions/compile.md b/docs/actions/compile.md index 995d733..3b532d7 100644 --- a/docs/actions/compile.md +++ b/docs/actions/compile.md @@ -6,7 +6,9 @@ ```{warning} Due to the [handover of the Mono project](https://github.com/mono/mono/issues/21796), the `ubuntu-latest` github runner [does not currently include mono or nuget](https://github.com/actions/runner-images/issues/10636#issuecomment-2375010324). -Please use the `ubuntu-22.04` runner for this action. +Please use the `ubuntu-22.04` runner image or install nuget yourself when `use-nuget-restore` is not `'true'`. + +This does not affect projects that use `packagereference` ``` ```` \ No newline at end of file diff --git a/tests/plugin-mod-legacy/.gitignore b/tests/plugin-mod-legacy/.gitignore new file mode 100644 index 0000000..c29446b --- /dev/null +++ b/tests/plugin-mod-legacy/.gitignore @@ -0,0 +1,4 @@ +packages +obj +bin +GameData \ No newline at end of file diff --git a/tests/plugin-mod-legacy/PluginModLegacy.sln b/tests/plugin-mod-legacy/PluginModLegacy.sln new file mode 100644 index 0000000..20a4cfd --- /dev/null +++ b/tests/plugin-mod-legacy/PluginModLegacy.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "plugin-mod-legacy", "PluginModLegacy\plugin-mod-legacy.csproj", "{F19C7AB4-50C2-4378-9673-CC039CA12E10}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F19C7AB4-50C2-4378-9673-CC039CA12E10}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/tests/plugin-mod-legacy/PluginModLegacy/Properties/AssemblyInfo.cs b/tests/plugin-mod-legacy/PluginModLegacy/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9bf32e5 --- /dev/null +++ b/tests/plugin-mod-legacy/PluginModLegacy/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. +[assembly: AssemblyTitle ("PluginModLegacy")] +[assembly: AssemblyDescription ("Test mod using a legacy csproj")] + +// This supposedly helps avoid plugin depencency problems. +[assembly: KSPAssembly("plugin-mod-legacy", 1, 2, 3)] \ No newline at end of file diff --git a/tests/plugin-mod-legacy/PluginModLegacy/packages.config b/tests/plugin-mod-legacy/PluginModLegacy/packages.config new file mode 100644 index 0000000..20174bf --- /dev/null +++ b/tests/plugin-mod-legacy/PluginModLegacy/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj b/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj new file mode 100644 index 0000000..72bb719 --- /dev/null +++ b/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj @@ -0,0 +1,70 @@ + + + + + Debug + AnyCPU + {F19C7AB4-50C2-4378-9673-CC039CA12E10} + Library + JSI + PluginModMono + v4.8 + 65001 + + + + + + true + portable + false + bin\Debug + DEBUG; + prompt + 4 + false + AnyCPU + false + + + true + bin\Release + prompt + 4 + false + AnyCPU + false + portable + true + + + Always + + + true + bin\Profile\ + ENABLE_PROFILER + true + portable + AnyCPU + prompt + MinimumRecommendedRules.ruleset + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file From f2e1cac34572009d23e94aaa70f0f27a70172dc6 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Wed, 29 Oct 2025 22:52:16 -0700 Subject: [PATCH 55/85] Fix typo in docs --- docs/actions/compile.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/actions/compile.md b/docs/actions/compile.md index 3b532d7..649c957 100644 --- a/docs/actions/compile.md +++ b/docs/actions/compile.md @@ -6,7 +6,7 @@ ```{warning} Due to the [handover of the Mono project](https://github.com/mono/mono/issues/21796), the `ubuntu-latest` github runner [does not currently include mono or nuget](https://github.com/actions/runner-images/issues/10636#issuecomment-2375010324). -Please use the `ubuntu-22.04` runner image or install nuget yourself when `use-nuget-restore` is not `'true'`. +Please use the `ubuntu-22.04` runner image or install nuget yourself when `use-nuget-restore` is `'true'`. This does not affect projects that use `packagereference` ``` From af5d036c0a17910be1d377c9a0ea999969bb98ec Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Wed, 29 Oct 2025 23:15:16 -0700 Subject: [PATCH 56/85] Move setup-dotnet out of compile action and bump dotnet version to 8.0 nominal, with tests on 7 and 9 --- .github/actions/compile/action.yml | 9 --------- .github/workflows/build.yml | 9 +++++++++ .github/workflows/internal-test-plugin-legacy.yml | 5 +++++ .github/workflows/internal-test-plugin-nuget.yml | 5 ++--- .github/workflows/internal-test-plugin.yml | 5 +++++ 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index 597051e..fb281e1 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -10,10 +10,6 @@ inputs: default: Release description: The project configuration to build. - dotnet-version: - default: 5.x - description: Version of dotnet compiler to use. Defaults to 5.x. - ksp-zip-url: default: https://github.com/KSPModdingLibs/KSPLibs/raw/main/KSP-1.12.5.zip description: > @@ -61,11 +57,6 @@ runs: shell: bash run: echo 'KSP_ROOT=${{ '/tmp/ksp' }}' >> "$GITHUB_ENV" - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: ${{ inputs.dotnet-version }} - - name: Download KSP Libs shell: bash run: | diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 748f8be..2c06396 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,10 @@ on: description: > Set to true if your project uses a packages.config file instead of packagereferences. This will cause the job to run on the Ubuntu-22.04 image instead of Ubuntu-24.04 + dotnet-version: + type: string + default: 8.x + description: Version of dotnet compiler to use. use-ckan: type: boolean default: false @@ -50,6 +54,11 @@ jobs: with: submodules: true + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet-version }} + # Install CKAN and set up an instance - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@0.0.4 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} diff --git a/.github/workflows/internal-test-plugin-legacy.yml b/.github/workflows/internal-test-plugin-legacy.yml index aefd25b..b565700 100644 --- a/.github/workflows/internal-test-plugin-legacy.yml +++ b/.github/workflows/internal-test-plugin-legacy.yml @@ -12,6 +12,11 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.x' - uses: ./.github/actions/setup-ckan diff --git a/.github/workflows/internal-test-plugin-nuget.yml b/.github/workflows/internal-test-plugin-nuget.yml index 7d2e197..b405439 100644 --- a/.github/workflows/internal-test-plugin-nuget.yml +++ b/.github/workflows/internal-test-plugin-nuget.yml @@ -17,7 +17,7 @@ jobs: build: strategy: matrix: - dotnet-version: [ 5.x, 7.x, 9.x ] + dotnet-version: [ 7.x, 8.x, 9.x ] runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -25,7 +25,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.0.x + dotnet-version: ${{ matrix.dotnet-version }} - name: Setup Nuget Package Sources run: | @@ -44,7 +44,6 @@ jobs: ksp-zip-url: https://github.com/KSPModdingLibs/KSPLibs/raw/main/KSP-1.12.5.zip working-directory: ${{ env.TESTDIR }} solution-file-path: plugin-mod-nuget.csproj - dotnet-version: ${{ matrix.dotnet-version }} env: KSPBuildToolsVersion: ${{ inputs.package-version }} diff --git a/.github/workflows/internal-test-plugin.yml b/.github/workflows/internal-test-plugin.yml index df8547c..fa96929 100644 --- a/.github/workflows/internal-test-plugin.yml +++ b/.github/workflows/internal-test-plugin.yml @@ -12,6 +12,11 @@ jobs: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.x' - uses: ./.github/actions/setup-ckan From 6e879b7bbf47375b1ba1708a213c5baf5e385db5 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 30 Oct 2025 00:34:30 -0700 Subject: [PATCH 57/85] Fix KSPBT not installing CKAN dependencies automatically commit 2f23d91ad65d39ef228263e8d0fef25dbaaa59d5 Author: Andrew Cassidy Date: Thu Oct 30 00:26:49 2025 -0700 Fix typo preventing CKAN mod installation commit 538f615a27283ee0015b951b9f0cb0a159307cc8 Author: Andrew Cassidy Date: Thu Oct 30 00:08:50 2025 -0700 Try that again commit 221795f38a7b45058a82aa8c6880e25d4b39f852 Author: Andrew Cassidy Date: Thu Oct 30 00:05:02 2025 -0700 Treat warnings as errors during CI tests for some reason a *missing dependency dll* is treated as a *warning*??? --- KSPCommon.targets | 2 +- .../plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj | 1 + tests/plugin-mod-nuget/plugin-mod-nuget.csproj | 1 + tests/plugin-mod/plugin-mod.csproj | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index 7d050cf..dd3a80b 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -159,7 +159,7 @@ <_CKANCommands Include="compat add --gamedir "$(KSPBT_GameRoot)" %(_CKANCompatibleVersionItems.Identity)" Condition=" '$(KSPBT_CKANCompatibleVersions)' != '' "/> - <_CKANCommands Include="install --no-recommends --gamedir "$(KSPBT_GameRoot)" $(_CKANDependencyList)" Condition="'$(CKANDependencyList)' != ''"/> + <_CKANCommands Include="install --no-recommends --gamedir "$(KSPBT_GameRoot)" $(_CKANDependencyList)" Condition="'$(_CKANDependencyList)' != ''"/> diff --git a/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj b/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj index 72bb719..3f4a53a 100644 --- a/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj +++ b/tests/plugin-mod-legacy/PluginModLegacy/plugin-mod-legacy.csproj @@ -13,6 +13,7 @@ + true true diff --git a/tests/plugin-mod-nuget/plugin-mod-nuget.csproj b/tests/plugin-mod-nuget/plugin-mod-nuget.csproj index 021b63b..f7d0863 100644 --- a/tests/plugin-mod-nuget/plugin-mod-nuget.csproj +++ b/tests/plugin-mod-nuget/plugin-mod-nuget.csproj @@ -4,6 +4,7 @@ *-* plugin-mod + true diff --git a/tests/plugin-mod/plugin-mod.csproj b/tests/plugin-mod/plugin-mod.csproj index 490ed3b..e9e3c09 100644 --- a/tests/plugin-mod/plugin-mod.csproj +++ b/tests/plugin-mod/plugin-mod.csproj @@ -22,6 +22,7 @@ 2024 KSPModdingLibs Contributors PluginMod $(MSBuildThisFileDirectory)/GameData/$(MSBuildProjectName) + true From 90899f6e041dd3342dbe2dec30a4cc50c700de05 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 30 Oct 2025 22:25:28 -0700 Subject: [PATCH 58/85] Make KSPBT_ManagedRelativePath private and use an absolute path in the compile action. --- .github/actions/compile/action.yml | 2 +- KSPCommon.props | 8 ++++---- KSPCommon.targets | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml index fb281e1..6c04c58 100644 --- a/.github/actions/compile/action.yml +++ b/.github/actions/compile/action.yml @@ -80,5 +80,5 @@ runs: working-directory: ${{ inputs.working-directory }} run: > dotnet msbuild -m:1 -p:Configuration=${{ inputs.build-configuration }} - -p:KSPBT_ManagedRelativePath=KSP_x64_Data/Managed ${{ inputs.solution-file-path }} + -p:KSPBT_ManagedPath=${{ env.KSP_ROOT }}/KSP_x64_Data/Managed ${{ inputs.solution-file-path }} ${{ runner.debug && '-v:diagnostic' }} diff --git a/KSPCommon.props b/KSPCommon.props index 542b1bb..3e0012e 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -68,10 +68,10 @@ - - KSP_x64_Data/Managed - KSP.app/Contents/Resources/Data/Managed - KSP_Data/Managed + + <_KSPBT_ManagedRelativePath Condition=" $([MSBuild]::IsOsPlatform('Windows')) ">KSP_x64_Data/Managed + <_KSPBT_ManagedRelativePath Condition=" $([MSBuild]::IsOsPlatform('OSX')) ">KSP.app/Contents/Resources/Data/Managed + <_KSPBT_ManagedRelativePath Condition=" $([MSBuild]::IsOsPlatform('Linux')) ">KSP_Data/Managed diff --git a/KSPCommon.targets b/KSPCommon.targets index dd3a80b..9dfcac0 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -4,7 +4,7 @@ - $(KSPBT_ManagedRelativePath)/Assembly-CSharp.dll + $(_KSPBT_ManagedRelativePath)/Assembly-CSharp.dll property @@ -49,7 +49,7 @@ - $(KSPBT_GameRoot)/$(KSPBT_ManagedRelativePath) + $(KSPBT_GameRoot)/$(_KSPBT_ManagedRelativePath) From fd3c5f055087a9a65f6b02cfa252574aaa2c260a Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 30 Oct 2025 22:37:51 -0700 Subject: [PATCH 59/85] Add checks for SolutionDir not being empty in remaining uses Does anyone even use the .props and .props.user stuff or should we delete that? Fixes #50 --- KSPCommon.props | 4 ++-- KSPCommon.targets | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/KSPCommon.props b/KSPCommon.props index 3e0012e..d46e6b2 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -84,10 +84,10 @@ - + - + environment variable - + - + $(SolutionDir)KSP solution directory From 3a9f57b9cfabd2eff60befbfe382b80b3bfa04b0 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 30 Oct 2025 23:19:17 -0700 Subject: [PATCH 60/85] assemble-release action: include .zip extension in output path --- .github/actions/assemble-release/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/assemble-release/action.yml b/.github/actions/assemble-release/action.yml index 837453d..2632f61 100644 --- a/.github/actions/assemble-release/action.yml +++ b/.github/actions/assemble-release/action.yml @@ -14,7 +14,7 @@ inputs: default: "**/*.pdb" output-file-name: - description: Output artifact name used in the upload-artifact action. a zip file with this name will be created in the github workspace so that it can be immediately consumed by other actions in the workflow without having to download the artifact. + description: Output artifact name used in the upload-artifact action WITHOUT ".zip" extension. a zip file with this name will be created in the github workspace so that it can be immediately consumed by other actions in the workflow without having to download the artifact. default: ${{ github.event.repository.name || 'release'}} working-directory: @@ -61,7 +61,7 @@ runs: run: | zip -r ${{ github.workspace }}/${{ inputs.output-file-name }}.zip . echo 'ARTIFACT_FILENAME=${{ inputs.output-file-name }}' >> $GITHUB_ENV - echo 'artifact-path=${{ github.workspace }}/${{ inputs.output-file-name }}' >> $GITHUB_OUTPUT + echo 'artifact-path=${{ github.workspace }}/${{ inputs.output-file-name }}.zip' >> $GITHUB_OUTPUT - name: Upload Artifact id: upload-artifact From c6875d61f40d3dbb3f5a916c96516809f19d6166 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 30 Oct 2025 23:39:24 -0700 Subject: [PATCH 61/85] Update changelog --- CHANGELOG.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 590dfbb..58ae130 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ All notable changes to this project will be documented in this file `ModReference` items. This avoids the need for the KSP install path to be known at evaluation time. - Only include Log.cs (or anything else in include/unity) when `KSPBT_ReferenceUnityAssemblies` is `true` (#61) - Fix `KSP_VERSION_MAX` getting mangled when using an existing version file (#64) +- Fix incorrect behavior when building without a solution (#50) ### Docs @@ -28,8 +29,11 @@ All notable changes to this project will be documented in this file ### Actions -- Added the `use-nuget-restore` option to the `compile` action to use the `nuget restore` command, for projects using packages.config files. This allows the `compile` action with default settings to work on any Ubuntu runner image -- Sped up `setup-ckan` action by skipping recommended packages and man-db updates +- KSPBT actions used in reusable workflows are now pinned with each tag, instead of using actions from `main`. All calls to reusable workflows should be pinned to a tag to ensure the correct actions are being used. (#21) +- `compile` action: Use `dotnet restore` instead of `nuget restore` by default, allowing the action to work on any Ubuntu runner image. Added the `use-nuget-restore` option to restore the previous behavior for projects that use packages.config for dependencies. (#68) +- `compile` action: Removed call to`actions/setup-dotnet`. Setting up .NET should be done as a separate step. (#65) +- `setup-ckan` action: Sped up execution by skipping recommended packages and man-db updates +- `assemble-release` action: `outputs.artifact-path` now includes the `.zip` extension (#51) ## 0.0.4 - 2025-06-15 From 9f3fb56d25f5aaf8889302aae961f99221005c8b Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 30 Oct 2025 23:51:32 -0700 Subject: [PATCH 62/85] Release 1.0.0-alpha.1 ### Msbuild - Renamed global msbuild properties to have the `KSPBT_` prefix to avoid namespace collisions with other frameworks - `KSPRoot` is now `KSPBT_GameRoot`. It should no longer be referenced within a .csproj file - `RepoRootPath` is now `KSPBT_ModRoot`, and should now point to the mod folder within GameData rather than the root of a git repo - `BinariesOutputRelativePath` is now `KSPBT_ModPluginFolder` - `GenerateKSPAssemblyAttribute` is now `KSPBT_GenerateAssemblyAttribute` and defaults to true - `GenerateKSPAssemblyDependencyAttributes` is now `KSPBT_GenerateDependencyAttributes` and defaults to true - `ReferenceUnityAssemblies` is now `KSPBT_ReferenceUnityAssemblies` - `ReferenceKSPAssemblies` is now `KSPBT_ReferenceGameAssemblies` - Added the `KSPBT_ReferenceSystemAssemblies` property to control referencing the mono system DLLs within the KSP managed folder. Setting this property to false will load the implicit framework DLLs instead. - Mod dependencies should now be declared with `ModReference` items. This avoids the need for the KSP install path to be known at evaluation time. - Only include Log.cs (or anything else in include/unity) when `KSPBT_ReferenceUnityAssemblies` is `true` (#61) - Fix `KSP_VERSION_MAX` getting mangled when using an existing version file (#64) - Fix incorrect behavior when building without a solution (#50) ### Docs - Fixed git submodule example to work even for tagged releases (#49) ### Actions - KSPBT actions used in reusable workflows are now pinned with each tag, instead of using actions from `main`. All calls to reusable workflows should be pinned to a tag to ensure the correct actions are being used. (#21) - `compile` action: Use `dotnet restore` instead of `nuget restore` by default, allowing the action to work on any Ubuntu runner image. Added the `use-nuget-restore` option to restore the previous behavior for projects that use packages.config for dependencies. (#68) - `compile` action: Removed call to`actions/setup-dotnet`. Setting up .NET should be done as a separate step. (#65) - `setup-ckan` action: Sped up execution by skipping recommended packages and man-db updates - `assemble-release` action: `outputs.artifact-path` now includes the `.zip` extension (#51) --- .github/workflows/build.yml | 8 ++++---- .github/workflows/create-release.yml | 10 +++++----- .github/workflows/publish-to-spacedock.yml | 2 +- CHANGELOG.md | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2c06396..75c2a80 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,17 +60,17 @@ jobs: dotnet-version: ${{ inputs.dotnet-version }} # Install CKAN and set up an instance - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@0.0.4 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.1 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} # Install any listed CKAN dependencies - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@0.0.4 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.1 if: ${{ inputs.dependency-identifiers }} with: dependency-identifiers: ${{ inputs.dependency-identifiers }} # Compile the mod - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@0.0.4 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.1 if: ${{ inputs.use-msbuild }} with: build-configuration: ${{ inputs.build-configuration }} @@ -80,7 +80,7 @@ jobs: use-nuget-restore: ${{ inputs.use-nuget-restore }} # Assemble the mod into a release package and upload it as an artifact - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@0.0.4 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.1 with: artifacts: ${{ inputs.artifacts }} output-file-name: ${{ github.event.repository.name }}-${{ inputs.build-configuration }} diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 046c987..5359715 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -64,7 +64,7 @@ jobs: submodules: true - name: update-version - uses: KSPModdingLibs/KSPBuildTools/.github/actions/update-version@0.0.4 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/update-version@1.0.0-alpha.1 with: version-string: ${{ inputs.version-string }} template-extension: ${{ inputs.version-template-extension }} @@ -81,18 +81,18 @@ jobs: git tag -f -a "$VERSION_STRING" -m "$VERSION_STRING" # Install CKAN and set up an instance - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@0.0.4 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.1 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} # Install any listed CKAN dependencies - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@0.0.4 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.1 if: ${{ inputs.dependency-identifiers }} with: dependency-identifiers: ${{ inputs.dependency-identifiers }} - name: compile if: ${{ inputs.use-msbuild }} - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@0.0.4 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.1 with: build-configuration: ${{ inputs.build-configuration }} ksp-zip-url: ${{ inputs.ksp-zip-url }} @@ -101,7 +101,7 @@ jobs: - name: assemble-release id: assemble-release - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@0.0.4 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.1 with: artifacts: ${{ inputs.artifacts }} output-file-name: ${{ github.event.repository.name }}-${{ env.VERSION_STRING }} diff --git a/.github/workflows/publish-to-spacedock.yml b/.github/workflows/publish-to-spacedock.yml index 4901449..b0fddaf 100644 --- a/.github/workflows/publish-to-spacedock.yml +++ b/.github/workflows/publish-to-spacedock.yml @@ -31,7 +31,7 @@ jobs: steps: - name: get-release-info id: get-release-info - uses: KSPModdingLibs/KSPBuildTools/.github/actions/get-release-info@0.0.4 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/get-release-info@1.0.0-alpha.1 with: release-tag: ${{ inputs.release-tag }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 58ae130..576c85d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file -## 0.1.0-alpha.1 - 2025-08-06 +## 1.0.0-alpha.1 - 2025-10-31 ### Msbuild From 3eff5cea8d52b44d56b75b4402a61177f202b3bf Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Wed, 5 Nov 2025 23:09:48 -0800 Subject: [PATCH 63/85] Warn instead of error when running CKAN as root --- KSPCommon.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KSPCommon.targets b/KSPCommon.targets index 6d3c11e..f43cd24 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -173,7 +173,7 @@ - + From 434837702ffc242bdb6b2a2919f09401a4d811de Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 6 Nov 2025 21:33:20 -0800 Subject: [PATCH 64/85] re-include logging files in nuget package and add test --- KSPBuildTools.csproj | 2 +- tests/plugin-mod-nuget/pluginModNuget.cs | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 tests/plugin-mod-nuget/pluginModNuget.cs diff --git a/KSPBuildTools.csproj b/KSPBuildTools.csproj index 56d4565..79fd85f 100644 --- a/KSPBuildTools.csproj +++ b/KSPBuildTools.csproj @@ -38,7 +38,7 @@ - + diff --git a/tests/plugin-mod-nuget/pluginModNuget.cs b/tests/plugin-mod-nuget/pluginModNuget.cs new file mode 100644 index 0000000..6d97374 --- /dev/null +++ b/tests/plugin-mod-nuget/pluginModNuget.cs @@ -0,0 +1,6 @@ +using KSPBuildTools; +using UnityEngine; +using HarmonyLib; +using System.Collections.Generic; + +public class pluginModNuget { } \ No newline at end of file From 2fa2a8600e7b91159a3308288084d68bb96fe3a4 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 6 Nov 2025 21:39:47 -0800 Subject: [PATCH 65/85] Release 1.0.0-alpha.2 --- .github/workflows/build.yml | 8 ++++---- .github/workflows/create-release.yml | 10 +++++----- .github/workflows/publish-to-spacedock.yml | 2 +- CHANGELOG.md | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 75c2a80..490f291 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,17 +60,17 @@ jobs: dotnet-version: ${{ inputs.dotnet-version }} # Install CKAN and set up an instance - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.1 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.2 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} # Install any listed CKAN dependencies - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.1 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.2 if: ${{ inputs.dependency-identifiers }} with: dependency-identifiers: ${{ inputs.dependency-identifiers }} # Compile the mod - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.1 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.2 if: ${{ inputs.use-msbuild }} with: build-configuration: ${{ inputs.build-configuration }} @@ -80,7 +80,7 @@ jobs: use-nuget-restore: ${{ inputs.use-nuget-restore }} # Assemble the mod into a release package and upload it as an artifact - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.1 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.2 with: artifacts: ${{ inputs.artifacts }} output-file-name: ${{ github.event.repository.name }}-${{ inputs.build-configuration }} diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 5359715..64531e8 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -64,7 +64,7 @@ jobs: submodules: true - name: update-version - uses: KSPModdingLibs/KSPBuildTools/.github/actions/update-version@1.0.0-alpha.1 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/update-version@1.0.0-alpha.2 with: version-string: ${{ inputs.version-string }} template-extension: ${{ inputs.version-template-extension }} @@ -81,18 +81,18 @@ jobs: git tag -f -a "$VERSION_STRING" -m "$VERSION_STRING" # Install CKAN and set up an instance - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.1 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.2 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} # Install any listed CKAN dependencies - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.1 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.2 if: ${{ inputs.dependency-identifiers }} with: dependency-identifiers: ${{ inputs.dependency-identifiers }} - name: compile if: ${{ inputs.use-msbuild }} - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.1 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.2 with: build-configuration: ${{ inputs.build-configuration }} ksp-zip-url: ${{ inputs.ksp-zip-url }} @@ -101,7 +101,7 @@ jobs: - name: assemble-release id: assemble-release - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.1 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.2 with: artifacts: ${{ inputs.artifacts }} output-file-name: ${{ github.event.repository.name }}-${{ env.VERSION_STRING }} diff --git a/.github/workflows/publish-to-spacedock.yml b/.github/workflows/publish-to-spacedock.yml index b0fddaf..45d18a0 100644 --- a/.github/workflows/publish-to-spacedock.yml +++ b/.github/workflows/publish-to-spacedock.yml @@ -31,7 +31,7 @@ jobs: steps: - name: get-release-info id: get-release-info - uses: KSPModdingLibs/KSPBuildTools/.github/actions/get-release-info@1.0.0-alpha.1 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/get-release-info@1.0.0-alpha.2 with: release-tag: ${{ inputs.release-tag }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 576c85d..13f2ae8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file -## 1.0.0-alpha.1 - 2025-10-31 +## 1.0.0-alpha.2 - 2025-11-07 ### Msbuild From 28547cd43e71633ad677dd19b909dbdbd8e6940f Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 11 Nov 2025 00:11:36 -0800 Subject: [PATCH 66/85] Add option for how to install CKAN allows for skipping installation entirely, as well as supporting non-debian-based operating systems in the future. --- .github/actions/setup-ckan/action.yml | 13 +++++++++---- CHANGELOG.md | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/actions/setup-ckan/action.yml b/.github/actions/setup-ckan/action.yml index 3667096..d99ba10 100644 --- a/.github/actions/setup-ckan/action.yml +++ b/.github/actions/setup-ckan/action.yml @@ -6,6 +6,10 @@ x-env: description: The path to use as the root of a KSP instance for CKAN to set-up. If not set, `/tmp/ksp` is used instead. inputs: + ckan-install-method: + description: Method of installing CKAN. Can be set to 'apt' to install from the official .deb file, or 'skip' to skip installation if your runner already has CKAN installed. + default: 'apt' + ckan-version: description: CKAN tag to install. set to an empty string to always install the most recent version. See [the CKAN releases page](https://github.com/KSP-CKAN/CKAN/tags) for a list of available tags default: '' @@ -42,7 +46,8 @@ runs: shell: bash run: echo 'KSP_ROOT=${{ '/tmp/ksp' }}' >> "$GITHUB_ENV" - - name: Install CKAN + - name: Install CKAN via apt + if: ${{ inputs.ckan-install-method == 'apt' }} shell: bash run: | sudo rm -f /var/lib/man-db/auto-update # skip updating man pages, which takes a long time and makes no sense in a CI job @@ -53,14 +58,14 @@ runs: env: GH_TOKEN: ${{ github.token }} - - name: Setup CKAN Instance + - name: Setup fake KSP instance shell: bash run: | ${{ runner.debug && 'echo "$PATH"' }} ckan instance fake --set-default KSP ${{ env.KSP_ROOT }} 1.12.5 --game KSP --MakingHistory 1.9.1 --BreakingGround 1.7.1 ${{ runner.debug && '--verbose' }} ckan update - - name: Setup CKAN Compatible Versions + - name: Setup CKAN compatible versions shell: bash if: inputs.ckan-compatible-versions != '' run: | @@ -70,7 +75,7 @@ runs: env: VERSIONS: ${{ inputs.ckan-compatible-versions }} - - name: Setup CKAN Filter + - name: Setup CKAN filter shell: bash if: inputs.ckan-filters != '' run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fc67f5..8e1294c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ All notable changes to this project will be documented in this file - `compile` action: Use `dotnet restore` instead of `nuget restore` by default, allowing the action to work on any Ubuntu runner image. Added the `use-nuget-restore` option to restore the previous behavior for projects that use packages.config for dependencies. (#68) - `compile` action: Removed call to`actions/setup-dotnet`. Setting up .NET should be done as a separate step. (#65) - `setup-ckan` action: Sped up execution by skipping recommended packages and man-db updates +- `setup-ckan` action: Add `ckan-install-method` option for installation method. Currently supports `'apt'` for installation on Debian/Ubuntu, or `'skip'` to skip installation for runners that already have CKAN installed. - `assemble-release` action: `outputs.artifact-path` now includes the `.zip` extension (#51) From 27d56b3615bab3463d9557e7f8010903a06b88fc Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 13 Nov 2025 23:48:24 -0800 Subject: [PATCH 67/85] Change docs theme --- docs/conf.py | 6 +++--- docs/requirements.in | 2 +- docs/requirements.txt | 37 +++++++++++++++++++++++++++---------- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 3569d07..cf07543 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -9,8 +9,8 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -project = 'KSPBuildTools' -copyright = '2024, KSPModdingLibs Contributors' +project = 'KSP Build Tools' +copyright = '2025, KSPModdingLibs Contributors' author = 'KSPModdingLibs Contributors' # -- General configuration --------------------------------------------------- @@ -24,7 +24,7 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'sphinx_rtd_theme' +html_theme = 'sphinx_book_theme' html_static_path = ['_static'] # -- Options for myst-parser ------------------------------------------------- diff --git a/docs/requirements.in b/docs/requirements.in index 8995899..5f8e8fe 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,5 +1,5 @@ sphinx>=8 -sphinx-rtd-theme>=2.0.0 +sphinx-book-theme sphinx-copybutton sphinx-gha sphinx-jinja>=2 \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index 291ac6d..60c0f20 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,9 +1,15 @@ # This file was autogenerated by uv via the following command: # uv pip compile --output-file=docs/requirements.txt --strip-extras docs/requirements.in +accessible-pygments==0.0.5 + # via pydata-sphinx-theme alabaster==1.0.0 # via sphinx babel==2.17.0 - # via sphinx + # via + # pydata-sphinx-theme + # sphinx +beautifulsoup4==4.14.2 + # via pydata-sphinx-theme certifi==2025.10.5 # via requests charset-normalizer==3.4.4 @@ -11,9 +17,9 @@ charset-normalizer==3.4.4 docutils==0.21.2 # via # myst-parser + # pydata-sphinx-theme # sphinx # sphinx-jinja - # sphinx-rtd-theme gitdb==4.0.12 # via gitpython gitpython==3.1.45 @@ -40,9 +46,16 @@ mdurl==0.1.2 myst-parser==4.0.1 # via sphinx-gha packaging==25.0 - # via sphinx + # via + # pydata-sphinx-theme + # sphinx +pydata-sphinx-theme==0.15.4 + # via sphinx-book-theme pygments==2.19.2 - # via sphinx + # via + # accessible-pygments + # pydata-sphinx-theme + # sphinx pyyaml==6.0.3 # via myst-parser requests==2.32.5 @@ -55,36 +68,40 @@ smmap==5.0.2 # via gitdb snowballstemmer==3.0.1 # via sphinx +soupsieve==2.8 + # via beautifulsoup4 sphinx==8.2.3 # via # -r docs/requirements.in # myst-parser + # pydata-sphinx-theme + # sphinx-book-theme # sphinx-copybutton # sphinx-gha # sphinx-jinja - # sphinx-rtd-theme - # sphinxcontrib-jquery +sphinx-book-theme==1.1.4 + # via -r docs/requirements.in sphinx-copybutton==0.5.2 # via -r docs/requirements.in sphinx-gha==1.0.0 # via -r docs/requirements.in sphinx-jinja==2.0.2 # via -r docs/requirements.in -sphinx-rtd-theme==3.0.2 - # via -r docs/requirements.in sphinxcontrib-applehelp==2.0.0 # via sphinx sphinxcontrib-devhelp==2.0.0 # via sphinx sphinxcontrib-htmlhelp==2.1.0 # via sphinx -sphinxcontrib-jquery==4.1 - # via sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-qthelp==2.0.0 # via sphinx sphinxcontrib-serializinghtml==2.0.0 # via sphinx +typing-extensions==4.15.0 + # via + # beautifulsoup4 + # pydata-sphinx-theme urllib3==2.5.0 # via requests From f499ed247274c3aa5e51a8efc3de61212c3664da Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Thu, 13 Nov 2025 23:52:05 -0800 Subject: [PATCH 68/85] Release 1.0.0-alpha.3 ### Msbuild - Renamed global msbuild properties to have the `KSPBT_` prefix to avoid namespace collisions with other frameworks - `KSPRoot` is now `KSPBT_GameRoot`. It should no longer be referenced within a .csproj file - `RepoRootPath` is now `KSPBT_ModRoot`, and should now point to the mod folder within GameData rather than the root of a git repo - `BinariesOutputRelativePath` is now `KSPBT_ModPluginFolder` - `GenerateKSPAssemblyAttribute` is now `KSPBT_GenerateAssemblyAttribute` and defaults to true - `GenerateKSPAssemblyDependencyAttributes` is now `KSPBT_GenerateDependencyAttributes` and defaults to true - `ReferenceUnityAssemblies` is now `KSPBT_ReferenceUnityAssemblies` - `ReferenceKSPAssemblies` is now `KSPBT_ReferenceGameAssemblies` - Added the `KSPBT_ReferenceSystemAssemblies` property to control referencing the mono system DLLs within the KSP managed folder. Setting this property to false will load the implicit framework DLLs instead. - Mod dependencies should now be declared with `ModReference` items. This avoids the need for the KSP install path to be known at evaluation time. - Only include Log.cs (or anything else in include/unity) when `KSPBT_ReferenceUnityAssemblies` is `true` (#61) - Fix `KSP_VERSION_MAX` getting mangled when using an existing version file (#64) - Fix incorrect behavior when building without a solution (#50) ### Actions - KSPBT actions used in reusable workflows are now pinned with each tag, instead of using actions from `main`. All calls to reusable workflows should be pinned to a tag to ensure the correct actions are being used. (#21) - `compile` action: Use `dotnet restore` instead of `nuget restore` by default, allowing the action to work on any Ubuntu runner image. Added the `use-nuget-restore` option to restore the previous behavior for projects that use packages.config for dependencies. (#68) - `compile` action: Removed call to`actions/setup-dotnet`. Setting up .NET should be done as a separate step. (#65) - `setup-ckan` action: Sped up execution by skipping recommended packages and man-db updates - `setup-ckan` action: Add `ckan-install-method` option for installation method. Currently supports `'apt'` for installation on Debian/Ubuntu, or `'skip'` to skip installation for runners that already have CKAN installed. - `assemble-release` action: `outputs.artifact-path` now includes the `.zip` extension (#51) --- .github/workflows/build.yml | 8 ++++---- .github/workflows/create-release.yml | 10 +++++----- .github/workflows/publish-to-spacedock.yml | 2 +- CHANGELOG.md | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 490f291..00fdcf2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,17 +60,17 @@ jobs: dotnet-version: ${{ inputs.dotnet-version }} # Install CKAN and set up an instance - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.2 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.3 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} # Install any listed CKAN dependencies - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.2 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.3 if: ${{ inputs.dependency-identifiers }} with: dependency-identifiers: ${{ inputs.dependency-identifiers }} # Compile the mod - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.2 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.3 if: ${{ inputs.use-msbuild }} with: build-configuration: ${{ inputs.build-configuration }} @@ -80,7 +80,7 @@ jobs: use-nuget-restore: ${{ inputs.use-nuget-restore }} # Assemble the mod into a release package and upload it as an artifact - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.2 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.3 with: artifacts: ${{ inputs.artifacts }} output-file-name: ${{ github.event.repository.name }}-${{ inputs.build-configuration }} diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 64531e8..c316092 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -64,7 +64,7 @@ jobs: submodules: true - name: update-version - uses: KSPModdingLibs/KSPBuildTools/.github/actions/update-version@1.0.0-alpha.2 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/update-version@1.0.0-alpha.3 with: version-string: ${{ inputs.version-string }} template-extension: ${{ inputs.version-template-extension }} @@ -81,18 +81,18 @@ jobs: git tag -f -a "$VERSION_STRING" -m "$VERSION_STRING" # Install CKAN and set up an instance - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.2 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.3 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} # Install any listed CKAN dependencies - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.2 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.3 if: ${{ inputs.dependency-identifiers }} with: dependency-identifiers: ${{ inputs.dependency-identifiers }} - name: compile if: ${{ inputs.use-msbuild }} - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.2 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.3 with: build-configuration: ${{ inputs.build-configuration }} ksp-zip-url: ${{ inputs.ksp-zip-url }} @@ -101,7 +101,7 @@ jobs: - name: assemble-release id: assemble-release - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.2 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.3 with: artifacts: ${{ inputs.artifacts }} output-file-name: ${{ github.event.repository.name }}-${{ env.VERSION_STRING }} diff --git a/.github/workflows/publish-to-spacedock.yml b/.github/workflows/publish-to-spacedock.yml index 45d18a0..bfe82ca 100644 --- a/.github/workflows/publish-to-spacedock.yml +++ b/.github/workflows/publish-to-spacedock.yml @@ -31,7 +31,7 @@ jobs: steps: - name: get-release-info id: get-release-info - uses: KSPModdingLibs/KSPBuildTools/.github/actions/get-release-info@1.0.0-alpha.2 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/get-release-info@1.0.0-alpha.3 with: release-tag: ${{ inputs.release-tag }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e1294c..d7fd286 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file -## 1.0.0-alpha.2 - 2025-11-07 +## 1.0.0-alpha.3 - 2025-11-14 ### Msbuild From 5e00b197c9b958705c2df660045fdb7f2066ba92 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 16 Nov 2025 20:35:45 -0800 Subject: [PATCH 69/85] Also push to forgejo package repository --- .github/workflows/internal-ci.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/internal-ci.yml b/.github/workflows/internal-ci.yml index 838a2b5..554d9ee 100644 --- a/.github/workflows/internal-ci.yml +++ b/.github/workflows/internal-ci.yml @@ -112,6 +112,12 @@ jobs: run: | dotnet nuget push --source "github" ${{ env.NuGetDirectory }}/*.nupkg + - name: Publish Package to Forgejo + run: > + dotnet nuget push ${{ env.NuGetDirectory }}/*.nupkg + --api-key ${{ secrets.FORGEJO_DEPLOY_TOKEN }} + --source https://git.offworldcolonies.nexus/api/packages/KSPModdingLibs/nuget/index.json + - name: Publish to Github Releases run: > gh release create ${{ github.ref_name }} @@ -119,4 +125,5 @@ jobs: --title "${{ needs.build.outputs.package-version }}" ${{ env.NuGetDirectory }}/*.nupkg env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + From 823502cf593da3e17dbdf9e409e8ab5d3229ae1c Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 16 Nov 2025 20:36:03 -0800 Subject: [PATCH 70/85] Format conf.py --- docs/conf.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index cf07543..9ffc971 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -2,48 +2,48 @@ # # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html -import os import re from pathlib import Path # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -project = 'KSP Build Tools' -copyright = '2025, KSPModdingLibs Contributors' -author = 'KSPModdingLibs Contributors' +project = "KSP Build Tools" +copyright = "2025, KSPModdingLibs Contributors" +author = "KSPModdingLibs Contributors" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = ['sphinx_gha', 'myst_parser', 'sphinx_copybutton', 'sphinx_jinja'] +extensions = ["sphinx_gha", "myst_parser", "sphinx_copybutton", "sphinx_jinja"] -templates_path = ['_templates'] -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +templates_path = ["_templates"] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'sphinx_book_theme' -html_static_path = ['_static'] +html_theme = "sphinx_book_theme" +html_static_path = ["_static"] # -- Options for myst-parser ------------------------------------------------- myst_heading_anchors = 3 -myst_enable_extensions = ['attrs_inline'] +myst_enable_extensions = ["attrs_inline"] # -- Options for sphinx-gha -------------------------------------------------- sphinx_gha_repo_root = str(Path(__file__).parent.parent.absolute()) # docs/.. -sphinx_gha_repo_slug = 'KSPModdingLibs/KSPBuildTools' +sphinx_gha_repo_slug = "KSPModdingLibs/KSPBuildTools" # -- Detect version ---------------------------------------------------------- -nuget_version_regex = re.compile(r'(?:\.?[0-9]+){3,}(?:[-a-z]+)?') +nuget_version_regex = re.compile(r"(?:\.?[0-9]+){3,}(?:[-a-z]+)?") from sphinx_gha.git_ref import get_git_ref + git_ref = get_git_ref(sphinx_gha_repo_root) jinja_globals = { - 'git_ref': git_ref, - 'nuget_version': git_ref if nuget_version_regex.match(git_ref or "") else None, -} \ No newline at end of file + "git_ref": git_ref, + "nuget_version": git_ref if nuget_version_regex.match(git_ref or "") else None, +} From e02279da114b639f3d6678a82dc1255a0c10eec8 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 16 Nov 2025 20:38:18 -0800 Subject: [PATCH 71/85] Remove source includes Use https://git.offworldcolonies.nexus/KSPModdingLibs/KSPCommunityLib instead --- CHANGELOG.md | 4 ++ KSPCommon.props | 6 --- include/unity/Log.cs | 102 ------------------------------------------- 3 files changed, 4 insertions(+), 108 deletions(-) delete mode 100644 include/unity/Log.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index d7fd286..d9995ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,10 @@ All notable changes to this project will be documented in this file - `setup-ckan` action: Add `ckan-install-method` option for installation method. Currently supports `'apt'` for installation on Debian/Ubuntu, or `'skip'` to skip installation for runners that already have CKAN installed. - `assemble-release` action: `outputs.artifact-path` now includes the `.zip` extension (#51) +### Library + +- Removed Log.cs and the entire includes directory. Please use [KSPCommunityLib](https://git.offworldcolonies.nexus/KSPModdingLibs/KSPCommunityLib) instead. + ## 0.0.5 - 2025-11-07 diff --git a/KSPCommon.props b/KSPCommon.props index d46e6b2..4782115 100644 --- a/KSPCommon.props +++ b/KSPCommon.props @@ -88,10 +88,4 @@ - - - - diff --git a/include/unity/Log.cs b/include/unity/Log.cs deleted file mode 100644 index a9711bc..0000000 --- a/include/unity/Log.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; -using UnityEngine; - -namespace KSPBuildTools -{ - interface ILogContextProvider { - string context(); - } - internal static class Log - { - internal static string ModPrefix = "[" + Assembly.GetExecutingAssembly().GetName().Name + "]"; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static string ObjPrefix(this UnityEngine.Object obj) - { - return "[" + obj.name + "]"; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static string ObjPrefix(this ILogContextProvider obj) - { - return "[" + obj.context() + "]"; - } - - [System.Diagnostics.Conditional("DEBUG")] - internal static void Debug(string message, string prefix = "") { - UnityEngine.Debug.Log("[DEBUG]" + ModPrefix + prefix + " " + message); - } - - [System.Diagnostics.Conditional("DEBUG")] - internal static void LogDebug(this UnityEngine.Object obj, string message, string prefix = "") { - UnityEngine.Debug.Log( "[DEBUG]" + ModPrefix + obj.ObjPrefix() + prefix + " " + message, obj); - } - - [System.Diagnostics.Conditional("DEBUG")] - internal static void LogDebug(this ILogContextProvider obj, string message, string prefix = "") { - UnityEngine.Debug.Log("[DEBUG]" + ModPrefix + obj.ObjPrefix() + prefix + " " + message); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void Message(string message, string prefix = "") - { - UnityEngine.Debug.Log(ModPrefix + prefix + " " + message); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void LogMessage(this UnityEngine.Object obj, string message, string prefix = "") - { - UnityEngine.Debug.Log(ModPrefix + obj.ObjPrefix() + prefix + " " + message, obj); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void LogMessage(this ILogContextProvider obj, string message, string prefix = "") - { - UnityEngine.Debug.Log(ModPrefix + obj.ObjPrefix() + prefix + " " + message); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void Warning(string message, string prefix = "") - { - UnityEngine.Debug.LogWarning(ModPrefix + prefix + " " + message); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void LogWarning(this UnityEngine.Object obj, string message, string prefix = "") - { - UnityEngine.Debug.LogWarning(ModPrefix + obj.ObjPrefix() + prefix + " " + message, obj); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void LogWarning(this ILogContextProvider obj, string message, string prefix = "") - { - UnityEngine.Debug.LogWarning(ModPrefix + obj.ObjPrefix() + prefix + " " + message); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void Error(string message, string prefix = "") - { - UnityEngine.Debug.LogError(ModPrefix + prefix + " " + message); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void LogError(UnityEngine.Object obj, string message, string prefix = "") - { - UnityEngine.Debug.LogError(ModPrefix + obj.ObjPrefix() + prefix + " " + message, obj); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void LogError(this ILogContextProvider obj, string message, string prefix = "") - { - UnityEngine.Debug.LogError(ModPrefix + obj.ObjPrefix() + prefix + " " + message); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void Exception(Exception ex) - { - UnityEngine.Debug.LogException(ex); - } - } -} \ No newline at end of file From 13a20f13bf013bab4299323a4ed1679e589c53a8 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Sun, 16 Nov 2025 20:41:17 -0800 Subject: [PATCH 72/85] Remove remaining traces of Log.cs --- KSPBuildTools.csproj | 1 - tests/plugin-mod-nuget/pluginModNuget.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/KSPBuildTools.csproj b/KSPBuildTools.csproj index 79fd85f..fa4272f 100644 --- a/KSPBuildTools.csproj +++ b/KSPBuildTools.csproj @@ -38,7 +38,6 @@ - diff --git a/tests/plugin-mod-nuget/pluginModNuget.cs b/tests/plugin-mod-nuget/pluginModNuget.cs index 6d97374..ffa41aa 100644 --- a/tests/plugin-mod-nuget/pluginModNuget.cs +++ b/tests/plugin-mod-nuget/pluginModNuget.cs @@ -1,4 +1,3 @@ -using KSPBuildTools; using UnityEngine; using HarmonyLib; using System.Collections.Generic; From 4cad5a2cd45879dbef7d206ea471df224da5a7c4 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 18 Nov 2025 21:10:06 -0800 Subject: [PATCH 73/85] Overhaul docs and update readme --- KSPBuildTools.csproj | 5 +- LICENSE | 21 -- LICENSE.md | 25 ++ README.md | 59 +++- docs/changelog.md | 2 + docs/conf.py | 2 +- docs/index.md | 15 +- docs/license.md | 2 + docs/pyproject.toml | 19 ++ docs/requirements.in | 5 - docs/requirements.txt | 107 ------- docs/uv.lock | 704 ++++++++++++++++++++++++++++++++++++++++++ justfile | 23 +- 13 files changed, 841 insertions(+), 148 deletions(-) delete mode 100644 LICENSE create mode 100644 LICENSE.md create mode 100644 docs/changelog.md create mode 100644 docs/license.md create mode 100644 docs/pyproject.toml delete mode 100644 docs/requirements.in delete mode 100644 docs/requirements.txt create mode 100644 docs/uv.lock diff --git a/KSPBuildTools.csproj b/KSPBuildTools.csproj index fa4272f..6d6ba04 100644 --- a/KSPBuildTools.csproj +++ b/KSPBuildTools.csproj @@ -22,11 +22,11 @@ true x64 1701;1702;CS0649;CS1591;NU5128 - 2024 KSPModdingLibs Contributors + 2025 KSPModdingLibs Contributors KSPBuildTools - $(ProjectDir) KSPBuildTools README.md + MIT KSP Build Tools Tools for developing mods for Kerbal Space Program KSPModdingLibs Contributors @@ -38,6 +38,7 @@ + diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 6f0d84b..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 KSPModdingLibs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..364363c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,25 @@ +The MIT License (MIT) +===================== + +Copyright © 2025 KSPModdingLibs Contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the “Software”), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 3247d75..61b4409 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,63 @@ KSP Build Tools [![CI](https://github.com/KSPModdingLibs/KSPBuildTools/actions/workflows/internal-ci.yml/badge.svg)](https://github.com/KSPModdingLibs/KSPBuildTools/actions/workflows/internal-ci.yml) [![NuGet Version](https://img.shields.io/nuget/vpre/KSPBuildTools)](https://www.nuget.org/packages/KSPBuildTools) -This repository aims to provide a common set of tools for developing mods for Kerbal Space Program. Note that it's still in "alpha" stages so expect things to change or break. +This repository provides a common set of tools for developing mods for Kerbal Space Program. It integrates with MSBuild to simplify setting up plugins, and integrates with CKAN to easily reference other mods. it also includes a set of CI actions for automating builds. [Full Documentation](https://kspbuildtools.readthedocs.io/en/) + +## Installation + +Run `dotnet add package KSPBuildTools` on your project, or add + +```xml + + + +``` + +to the .csproj file. Pinning the version is highly recommended. + +## Usage + +Once you [have a KSP installation to link to](https://kspbuildtools.readthedocs.io/en/stable/msbuild/getting-started.html#locating-your-ksp-install), all the game DLLs will be automatically included in your project automatically. + +Configure your mod's location in GameData and where to put the output DLLs + +```xml + +$(MSBuildThisFileDirectory)/../GameData/$(MSBuildProjectName) +plugins +``` + +Reference dependency mods in your DLL by adding `ModReference` items to the project. They will be automatically installed using CKAN. + +```xml + + + + GameData/Modulemanager*.dll + ModuleManager + + + GameData/000_Harmony/0Harmony.dll + Harmony2 + + +``` + +Auto-generate version files from your project's `FileVersion`. This works well with [minver](https://github.com/adamralph/minver). + +```xml + + + + $(KSPBT_ModRoot)/mymod.version + https://github.com/username/repo/releases/latest/download/mymod.version + https://github.com/username.repo/releases/latest + + +``` + +From there you should be able to build your mod with just `dotnet build` + +For more details, see the [MSBuild section in the docs](https://kspbuildtools.readthedocs.io/en/stable/msbuild/index.html). diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 0000000..8261b35 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,2 @@ +```{include} ../CHANGELOG.md +``` \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 9ffc971..f9e2cdc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ extensions = ["sphinx_gha", "myst_parser", "sphinx_copybutton", "sphinx_jinja"] templates_path = ["_templates"] -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".venv"] # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output diff --git a/docs/index.md b/docs/index.md index 02968bc..df76184 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,5 +1,6 @@ -```{include} ../README.md -``` +# KSP Build Tools + +KSP Build Tools provide a common set of tools for developing mods for Kerbal Space Program. It integrates with MSBuild to simplify setting up plugins, and integrates with CKAN to easily reference other mods. it also includes a set of CI actions for automating builds. ```{toctree} --- @@ -10,5 +11,13 @@ msbuild/index actions/index workflows/index scripts +``` -``` \ No newline at end of file +```{toctree} +--- +maxdepth: 1 +--- +Source +Changelog +License +``` diff --git a/docs/license.md b/docs/license.md new file mode 100644 index 0000000..6d90b6a --- /dev/null +++ b/docs/license.md @@ -0,0 +1,2 @@ +```{include} ../LICENSE.md +``` \ No newline at end of file diff --git a/docs/pyproject.toml b/docs/pyproject.toml new file mode 100644 index 0000000..1ae425f --- /dev/null +++ b/docs/pyproject.toml @@ -0,0 +1,19 @@ +[project] +name = "docs" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "sphinx>=8", + "myst-parser>=4", + "sphinx-book-theme>=1.1.4", + "sphinx-copybutton>=0.5.2", + "sphinx-gha>=1", + "sphinx-jinja>=2" +] + +[[tool.uv.index]] +url = "https://git.offworldcolonies.nexus/api/packages/drewcassidy/pypi/simple/" +# not strictly required, everything here is also on PyPI + +[tool.uv] +package = false diff --git a/docs/requirements.in b/docs/requirements.in deleted file mode 100644 index 5f8e8fe..0000000 --- a/docs/requirements.in +++ /dev/null @@ -1,5 +0,0 @@ -sphinx>=8 -sphinx-book-theme -sphinx-copybutton -sphinx-gha -sphinx-jinja>=2 \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 60c0f20..0000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,107 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile --output-file=docs/requirements.txt --strip-extras docs/requirements.in -accessible-pygments==0.0.5 - # via pydata-sphinx-theme -alabaster==1.0.0 - # via sphinx -babel==2.17.0 - # via - # pydata-sphinx-theme - # sphinx -beautifulsoup4==4.14.2 - # via pydata-sphinx-theme -certifi==2025.10.5 - # via requests -charset-normalizer==3.4.4 - # via requests -docutils==0.21.2 - # via - # myst-parser - # pydata-sphinx-theme - # sphinx - # sphinx-jinja -gitdb==4.0.12 - # via gitpython -gitpython==3.1.45 - # via sphinx-gha -idna==3.11 - # via requests -imagesize==1.4.1 - # via sphinx -jinja2==3.1.6 - # via - # myst-parser - # sphinx - # sphinx-jinja -markdown-it-py==3.0.0 - # via - # mdit-py-plugins - # myst-parser -markupsafe==3.0.3 - # via jinja2 -mdit-py-plugins==0.5.0 - # via myst-parser -mdurl==0.1.2 - # via markdown-it-py -myst-parser==4.0.1 - # via sphinx-gha -packaging==25.0 - # via - # pydata-sphinx-theme - # sphinx -pydata-sphinx-theme==0.15.4 - # via sphinx-book-theme -pygments==2.19.2 - # via - # accessible-pygments - # pydata-sphinx-theme - # sphinx -pyyaml==6.0.3 - # via myst-parser -requests==2.32.5 - # via sphinx -roman-numerals-py==3.1.0 - # via sphinx -ruamel-yaml==0.18.16 - # via sphinx-gha -smmap==5.0.2 - # via gitdb -snowballstemmer==3.0.1 - # via sphinx -soupsieve==2.8 - # via beautifulsoup4 -sphinx==8.2.3 - # via - # -r docs/requirements.in - # myst-parser - # pydata-sphinx-theme - # sphinx-book-theme - # sphinx-copybutton - # sphinx-gha - # sphinx-jinja -sphinx-book-theme==1.1.4 - # via -r docs/requirements.in -sphinx-copybutton==0.5.2 - # via -r docs/requirements.in -sphinx-gha==1.0.0 - # via -r docs/requirements.in -sphinx-jinja==2.0.2 - # via -r docs/requirements.in -sphinxcontrib-applehelp==2.0.0 - # via sphinx -sphinxcontrib-devhelp==2.0.0 - # via sphinx -sphinxcontrib-htmlhelp==2.1.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==2.0.0 - # via sphinx -sphinxcontrib-serializinghtml==2.0.0 - # via sphinx -typing-extensions==4.15.0 - # via - # beautifulsoup4 - # pydata-sphinx-theme -urllib3==2.5.0 - # via requests diff --git a/docs/uv.lock b/docs/uv.lock new file mode 100644 index 0000000..444a5c9 --- /dev/null +++ b/docs/uv.lock @@ -0,0 +1,704 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "accessible-pygments" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899, upload-time = "2024-05-10T11:23:10.216Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903, upload-time = "2024-05-10T11:23:08.421Z" }, +] + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, +] + +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/e9/df2358efd7659577435e2177bfa69cba6c33216681af51a707193dec162a/beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e", size = 625822, upload-time = "2025-09-29T10:05:42.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515", size = 106392, upload-time = "2025-09-29T10:05:43.771Z" }, +] + +[[package]] +name = "certifi" +version = "2025.11.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "docs" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "myst-parser" }, + { name = "sphinx" }, + { name = "sphinx-book-theme" }, + { name = "sphinx-copybutton" }, + { name = "sphinx-gha" }, + { name = "sphinx-jinja" }, +] + +[package.metadata] +requires-dist = [ + { name = "myst-parser", specifier = ">=4" }, + { name = "sphinx", specifier = ">=8" }, + { name = "sphinx-book-theme", specifier = ">=1.1.4" }, + { name = "sphinx-copybutton", specifier = ">=0.5.2" }, + { name = "sphinx-gha", specifier = ">=1" }, + { name = "sphinx-jinja", specifier = ">=2" }, +] + +[[package]] +name = "docutils" +version = "0.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.45" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076, upload-time = "2025-07-24T03:45:54.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload-time = "2025-07-24T03:45:52.517Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "myst-parser" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jinja2" }, + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pydata-sphinx-theme" +version = "0.15.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accessible-pygments" }, + { name = "babel" }, + { name = "beautifulsoup4" }, + { name = "docutils" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "sphinx" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/ea/3ab478cccacc2e8ef69892c42c44ae547bae089f356c4b47caf61730958d/pydata_sphinx_theme-0.15.4.tar.gz", hash = "sha256:7762ec0ac59df3acecf49fd2f889e1b4565dbce8b88b2e29ee06fdd90645a06d", size = 2400673, upload-time = "2024-06-25T19:28:45.041Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl", hash = "sha256:2136ad0e9500d0949f96167e63f3e298620040aea8f9c74621959eda5d4cf8e6", size = 4640157, upload-time = "2024-06-25T19:28:42.383Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "roman-numerals-py" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/c7/ee630b29e04a672ecfc9b63227c87fd7a37eb67c1bf30fe95376437f897c/ruamel.yaml-0.18.16.tar.gz", hash = "sha256:a6e587512f3c998b2225d68aa1f35111c29fad14aed561a26e73fab729ec5e5a", size = 147269, upload-time = "2025-10-22T17:54:02.346Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/73/bb1bc2529f852e7bf64a2dec885e89ff9f5cc7bbf6c9340eed30ff2c69c5/ruamel.yaml-0.18.16-py3-none-any.whl", hash = "sha256:048f26d64245bae57a4f9ef6feb5b552a386830ef7a826f235ffb804c59efbba", size = 119858, upload-time = "2025-10-22T17:53:59.012Z" }, +] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/97/60fda20e2fb54b83a61ae14648b0817c8f5d84a3821e40bfbdae1437026a/ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600", size = 225794, upload-time = "2025-11-16T16:12:59.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/80/8ce7b9af532aa94dd83360f01ce4716264db73de6bc8efd22c32341f6658/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c583229f336682b7212a43d2fa32c30e643d3076178fb9f7a6a14dde85a2d8bd", size = 147998, upload-time = "2025-11-16T16:13:13.241Z" }, + { url = "https://files.pythonhosted.org/packages/53/09/de9d3f6b6701ced5f276d082ad0f980edf08ca67114523d1b9264cd5e2e0/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56ea19c157ed8c74b6be51b5fa1c3aff6e289a041575f0556f66e5fb848bb137", size = 132743, upload-time = "2025-11-16T16:13:14.265Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f7/73a9b517571e214fe5c246698ff3ed232f1ef863c8ae1667486625ec688a/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5fea0932358e18293407feb921d4f4457db837b67ec1837f87074667449f9401", size = 731459, upload-time = "2025-11-16T20:22:44.338Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a2/0dc0013169800f1c331a6f55b1282c1f4492a6d32660a0cf7b89e6684919/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71831bd61fbdb7aa0399d5c4da06bea37107ab5c79ff884cc07f2450910262", size = 749289, upload-time = "2025-11-16T16:13:15.633Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ed/3fb20a1a96b8dc645d88c4072df481fe06e0289e4d528ebbdcc044ebc8b3/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:617d35dc765715fa86f8c3ccdae1e4229055832c452d4ec20856136acc75053f", size = 777630, upload-time = "2025-11-16T16:13:16.898Z" }, + { url = "https://files.pythonhosted.org/packages/60/50/6842f4628bc98b7aa4733ab2378346e1441e150935ad3b9f3c3c429d9408/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b45498cc81a4724a2d42273d6cfc243c0547ad7c6b87b4f774cb7bcc131c98d", size = 744368, upload-time = "2025-11-16T16:13:18.117Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b0/128ae8e19a7d794c2e36130a72b3bb650ce1dd13fb7def6cf10656437dcf/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:def5663361f6771b18646620fca12968aae730132e104688766cf8a3b1d65922", size = 745233, upload-time = "2025-11-16T20:22:45.833Z" }, + { url = "https://files.pythonhosted.org/packages/75/05/91130633602d6ba7ce3e07f8fc865b40d2a09efd4751c740df89eed5caf9/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:014181cdec565c8745b7cbc4de3bf2cc8ced05183d986e6d1200168e5bb59490", size = 770963, upload-time = "2025-11-16T16:13:19.344Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4b/fd4542e7f33d7d1bc64cc9ac9ba574ce8cf145569d21f5f20133336cdc8c/ruamel_yaml_clib-0.2.15-cp311-cp311-win32.whl", hash = "sha256:d290eda8f6ada19e1771b54e5706b8f9807e6bb08e873900d5ba114ced13e02c", size = 102640, upload-time = "2025-11-16T16:13:20.498Z" }, + { url = "https://files.pythonhosted.org/packages/bb/eb/00ff6032c19c7537371e3119287999570867a0eafb0154fccc80e74bf57a/ruamel_yaml_clib-0.2.15-cp311-cp311-win_amd64.whl", hash = "sha256:bdc06ad71173b915167702f55d0f3f027fc61abd975bd308a0968c02db4a4c3e", size = 121996, upload-time = "2025-11-16T16:13:21.855Z" }, + { url = "https://files.pythonhosted.org/packages/72/4b/5fde11a0722d676e469d3d6f78c6a17591b9c7e0072ca359801c4bd17eee/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb15a2e2a90c8475df45c0949793af1ff413acfb0a716b8b94e488ea95ce7cff", size = 149088, upload-time = "2025-11-16T16:13:22.836Z" }, + { url = "https://files.pythonhosted.org/packages/85/82/4d08ac65ecf0ef3b046421985e66301a242804eb9a62c93ca3437dc94ee0/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64da03cbe93c1e91af133f5bec37fd24d0d4ba2418eaf970d7166b0a26a148a2", size = 134553, upload-time = "2025-11-16T16:13:24.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/cb/22366d68b280e281a932403b76da7a988108287adff2bfa5ce881200107a/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f6d3655e95a80325b84c4e14c080b2470fe4f33b6846f288379ce36154993fb1", size = 737468, upload-time = "2025-11-16T20:22:47.335Z" }, + { url = "https://files.pythonhosted.org/packages/71/73/81230babf8c9e33770d43ed9056f603f6f5f9665aea4177a2c30ae48e3f3/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71845d377c7a47afc6592aacfea738cc8a7e876d586dfba814501d8c53c1ba60", size = 753349, upload-time = "2025-11-16T16:13:26.269Z" }, + { url = "https://files.pythonhosted.org/packages/61/62/150c841f24cda9e30f588ef396ed83f64cfdc13b92d2f925bb96df337ba9/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e5499db1ccbc7f4b41f0565e4f799d863ea720e01d3e99fa0b7b5fcd7802c9", size = 788211, upload-time = "2025-11-16T16:13:27.441Z" }, + { url = "https://files.pythonhosted.org/packages/30/93/e79bd9cbecc3267499d9ead919bd61f7ddf55d793fb5ef2b1d7d92444f35/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b293a37dc97e2b1e8a1aec62792d1e52027087c8eea4fc7b5abd2bdafdd6642", size = 743203, upload-time = "2025-11-16T16:13:28.671Z" }, + { url = "https://files.pythonhosted.org/packages/8d/06/1eb640065c3a27ce92d76157f8efddb184bd484ed2639b712396a20d6dce/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:512571ad41bba04eac7268fe33f7f4742210ca26a81fe0c75357fa682636c690", size = 747292, upload-time = "2025-11-16T20:22:48.584Z" }, + { url = "https://files.pythonhosted.org/packages/a5/21/ee353e882350beab65fcc47a91b6bdc512cace4358ee327af2962892ff16/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5e9f630c73a490b758bf14d859a39f375e6999aea5ddd2e2e9da89b9953486a", size = 771624, upload-time = "2025-11-16T16:13:29.853Z" }, + { url = "https://files.pythonhosted.org/packages/57/34/cc1b94057aa867c963ecf9ea92ac59198ec2ee3a8d22a126af0b4d4be712/ruamel_yaml_clib-0.2.15-cp312-cp312-win32.whl", hash = "sha256:f4421ab780c37210a07d138e56dd4b51f8642187cdfb433eb687fe8c11de0144", size = 100342, upload-time = "2025-11-16T16:13:31.067Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e5/8925a4208f131b218f9a7e459c0d6fcac8324ae35da269cb437894576366/ruamel_yaml_clib-0.2.15-cp312-cp312-win_amd64.whl", hash = "sha256:2b216904750889133d9222b7b873c199d48ecbb12912aca78970f84a5aa1a4bc", size = 119013, upload-time = "2025-11-16T16:13:32.164Z" }, + { url = "https://files.pythonhosted.org/packages/17/5e/2f970ce4c573dc30c2f95825f2691c96d55560268ddc67603dc6ea2dd08e/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dcec721fddbb62e60c2801ba08c87010bd6b700054a09998c4d09c08147b8fb", size = 147450, upload-time = "2025-11-16T16:13:33.542Z" }, + { url = "https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471", size = 133139, upload-time = "2025-11-16T16:13:34.587Z" }, + { url = "https://files.pythonhosted.org/packages/dc/19/40d676802390f85784235a05788fd28940923382e3f8b943d25febbb98b7/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46895c17ead5e22bea5e576f1db7e41cb273e8d062c04a6a49013d9f60996c25", size = 731474, upload-time = "2025-11-16T20:22:49.934Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bb/6ef5abfa43b48dd55c30d53e997f8f978722f02add61efba31380d73e42e/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3eb199178b08956e5be6288ee0b05b2fb0b5c1f309725ad25d9c6ea7e27f962a", size = 748047, upload-time = "2025-11-16T16:13:35.633Z" }, + { url = "https://files.pythonhosted.org/packages/ff/5d/e4f84c9c448613e12bd62e90b23aa127ea4c46b697f3d760acc32cb94f25/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d1032919280ebc04a80e4fb1e93f7a738129857eaec9448310e638c8bccefcf", size = 782129, upload-time = "2025-11-16T16:13:36.781Z" }, + { url = "https://files.pythonhosted.org/packages/de/4b/e98086e88f76c00c88a6bcf15eae27a1454f661a9eb72b111e6bbb69024d/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab0df0648d86a7ecbd9c632e8f8d6b21bb21b5fc9d9e095c796cacf32a728d2d", size = 736848, upload-time = "2025-11-16T16:13:37.952Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5c/5964fcd1fd9acc53b7a3a5d9a05ea4f95ead9495d980003a557deb9769c7/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:331fb180858dd8534f0e61aa243b944f25e73a4dae9962bd44c46d1761126bbf", size = 741630, upload-time = "2025-11-16T20:22:51.718Z" }, + { url = "https://files.pythonhosted.org/packages/07/1e/99660f5a30fceb58494598e7d15df883a07292346ef5696f0c0ae5dee8c6/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd4c928ddf6bce586285daa6d90680b9c291cfd045fc40aad34e445d57b1bf51", size = 766619, upload-time = "2025-11-16T16:13:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/fa0344a9327b58b54970e56a27b32416ffbcfe4dcc0700605516708579b2/ruamel_yaml_clib-0.2.15-cp313-cp313-win32.whl", hash = "sha256:bf0846d629e160223805db9fe8cc7aec16aaa11a07310c50c8c7164efa440aec", size = 100171, upload-time = "2025-11-16T16:13:40.456Z" }, + { url = "https://files.pythonhosted.org/packages/06/c4/c124fbcef0684fcf3c9b72374c2a8c35c94464d8694c50f37eef27f5a145/ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl", hash = "sha256:45702dfbea1420ba3450bb3dd9a80b33f0badd57539c6aac09f42584303e0db6", size = 118845, upload-time = "2025-11-16T16:13:41.481Z" }, + { url = "https://files.pythonhosted.org/packages/3e/bd/ab8459c8bb759c14a146990bf07f632c1cbec0910d4853feeee4be2ab8bb/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:753faf20b3a5906faf1fc50e4ddb8c074cb9b251e00b14c18b28492f933ac8ef", size = 147248, upload-time = "2025-11-16T16:13:42.872Z" }, + { url = "https://files.pythonhosted.org/packages/69/f2/c4cec0a30f1955510fde498aac451d2e52b24afdbcb00204d3a951b772c3/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:480894aee0b29752560a9de46c0e5f84a82602f2bc5c6cde8db9a345319acfdf", size = 133764, upload-time = "2025-11-16T16:13:43.932Z" }, + { url = "https://files.pythonhosted.org/packages/82/c7/2480d062281385a2ea4f7cc9476712446e0c548cd74090bff92b4b49e898/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d3b58ab2454b4747442ac76fab66739c72b1e2bb9bd173d7694b9f9dbc9c000", size = 730537, upload-time = "2025-11-16T20:22:52.918Z" }, + { url = "https://files.pythonhosted.org/packages/75/08/e365ee305367559f57ba6179d836ecc3d31c7d3fdff2a40ebf6c32823a1f/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfd309b316228acecfa30670c3887dcedf9b7a44ea39e2101e75d2654522acd4", size = 746944, upload-time = "2025-11-16T16:13:45.338Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/8b56b08db91e569d0a4fbfa3e492ed2026081bdd7e892f63ba1c88a2f548/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2812ff359ec1f30129b62372e5f22a52936fac13d5d21e70373dbca5d64bb97c", size = 778249, upload-time = "2025-11-16T16:13:46.871Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1d/70dbda370bd0e1a92942754c873bd28f513da6198127d1736fa98bb2a16f/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7e74ea87307303ba91073b63e67f2c667e93f05a8c63079ee5b7a5c8d0d7b043", size = 737140, upload-time = "2025-11-16T16:13:48.349Z" }, + { url = "https://files.pythonhosted.org/packages/5b/87/822d95874216922e1120afb9d3fafa795a18fdd0c444f5c4c382f6dac761/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:713cd68af9dfbe0bb588e144a61aad8dcc00ef92a82d2e87183ca662d242f524", size = 741070, upload-time = "2025-11-16T20:22:54.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/17/4e01a602693b572149f92c983c1f25bd608df02c3f5cf50fd1f94e124a59/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:542d77b72786a35563f97069b9379ce762944e67055bea293480f7734b2c7e5e", size = 765882, upload-time = "2025-11-16T16:13:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/9f/17/7999399081d39ebb79e807314de6b611e1d1374458924eb2a489c01fc5ad/ruamel_yaml_clib-0.2.15-cp314-cp314-win32.whl", hash = "sha256:424ead8cef3939d690c4b5c85ef5b52155a231ff8b252961b6516ed7cf05f6aa", size = 102567, upload-time = "2025-11-16T16:13:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/67/be582a7370fdc9e6846c5be4888a530dcadd055eef5b932e0e85c33c7d73/ruamel_yaml_clib-0.2.15-cp314-cp314-win_amd64.whl", hash = "sha256:ac9b8d5fa4bb7fd2917ab5027f60d4234345fd366fe39aa711d5dca090aa1467", size = 122847, upload-time = "2025-11-16T16:13:51.807Z" }, +] + +[[package]] +name = "smmap" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, +] + +[[package]] +name = "snowballstemmer" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, +] + +[[package]] +name = "sphinx" +version = "8.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals-py" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, +] + +[[package]] +name = "sphinx-book-theme" +version = "1.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydata-sphinx-theme" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/19/d002ed96bdc7738c15847c730e1e88282d738263deac705d5713b4d8fa94/sphinx_book_theme-1.1.4.tar.gz", hash = "sha256:73efe28af871d0a89bd05856d300e61edce0d5b2fbb7984e84454be0fedfe9ed", size = 439188, upload-time = "2025-02-20T16:32:32.581Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl", hash = "sha256:843b3f5c8684640f4a2d01abd298beb66452d1b2394cd9ef5be5ebd5640ea0e1", size = 433952, upload-time = "2025-02-20T16:32:31.009Z" }, +] + +[[package]] +name = "sphinx-copybutton" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload-time = "2023-04-14T08:10:22.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343, upload-time = "2023-04-14T08:10:20.844Z" }, +] + +[[package]] +name = "sphinx-gha" +version = "1.0.0" +source = { registry = "https://git.offworldcolonies.nexus/api/packages/drewcassidy/pypi/simple/" } +dependencies = [ + { name = "gitpython" }, + { name = "myst-parser" }, + { name = "ruamel-yaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://git.offworldcolonies.nexus/api/packages/drewcassidy/pypi/files/sphinx-gha/1.0.0/sphinx_gha-1.0.0.tar.gz", hash = "sha256:224c945156f45fe92c36c8aae2df2dd36205e4c6d64173bc33303b89cfa16732" } +wheels = [ + { url = "https://git.offworldcolonies.nexus/api/packages/drewcassidy/pypi/files/sphinx-gha/1.0.0/sphinx_gha-1.0.0-py3-none-any.whl", hash = "sha256:01ca14c246b2ad000c5b634ebf58ce1bef694108b7dc79d15955b6c87be8061d" }, +] + +[[package]] +name = "sphinx-jinja" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jinja2" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/90/7cf0e91aadcb5b3ff4796acbaf2c7887a55434df360914af9fc067c753c1/sphinx-jinja-2.0.2.tar.gz", hash = "sha256:c6232b59a894139770be1dc6d0b00a379e4288ce78157904e1f8473dea3e0718", size = 4587, upload-time = "2022-07-05T11:57:49.579Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/9f/81fe50b1861bda8c02b4272a166d14455411e04865ddaf3616f25d12cd50/sphinx_jinja-2.0.2-py3-none-any.whl", hash = "sha256:705ebeb9b7a6018ca3f93724315a7c1effa6ba3db44d630e7eaaa15e4ac081a8", size = 4355, upload-time = "2022-07-05T11:57:47.861Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] diff --git a/justfile b/justfile index 2850ca5..dd54dfa 100644 --- a/justfile +++ b/justfile @@ -1,15 +1,22 @@ -set shell:= ['bash', '-c'] -yaclog:= "uv tool run yaclog@1.6.2" +set shell := ['bash', '-c'] + +yaclog := "uv tool run yaclog@1.6.2" +sphinx := "uv run --project docs -m sphinx" +sphinx_autobuild := "uv run --with sphinx-autobuild --project docs sphinx-autobuild" pin-workflows tag: - sed -E -H -i ".backup" "s|(uses: KSPModdingLibs/KSPBuildTools/\.github/actions/\S+@)\S+|\1{{tag}}|g" .github/workflows/*.yml + sed -E -H -i ".backup" "s|(uses: KSPModdingLibs/KSPBuildTools/\.github/actions/\S+@)\S+|\1{{ tag }}|g" .github/workflows/*.yml release *args: - {{yaclog}} release {{args}} - @just pin-workflows $({{yaclog}} show --version) - git add .github/workflows/*.yml - {{yaclog}} release -c + {{ yaclog }} release {{ args }} + @just pin-workflows $({{ yaclog }} show --version) + git add .github/workflows/*.yml + {{ yaclog }} release -c docs: - uv run --with-requirements docs/requirements.txt --no-project -m sphinx docs/ docs/_build + {{ sphinx }} docs/ docs/_build +livedocs: + {{ sphinx_autobuild }} docs/ docs/_build \ + --ignore docs/_build \ + --watch ".github" From 6fe6d831074ab6529a7f7366d87b1deb0b8e3732 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 18 Nov 2025 21:12:12 -0800 Subject: [PATCH 74/85] Update readthedocs config --- docs/.readthedocs.yaml | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/docs/.readthedocs.yaml b/docs/.readthedocs.yaml index 8ac0603..20516ee 100644 --- a/docs/.readthedocs.yaml +++ b/docs/.readthedocs.yaml @@ -1,4 +1,5 @@ -# Read the Docs configuration file for Sphinx projects +# .readthedocs.yaml +# Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required @@ -6,22 +7,24 @@ version: 2 # Set the OS, Python version and other tools you might need build: - os: ubuntu-22.04 + os: ubuntu-24.04 tools: python: "3.12" + jobs: + pre_create_environment: + - asdf plugin add uv + - asdf install uv latest + - asdf global uv latest + create_environment: + - UV_PROJECT=docs/ uv venv "${READTHEDOCS_VIRTUALENV_PATH}" + install: + - UV_PROJECT=docs/ UV_PROJECT_ENVIRONMENT="${READTHEDOCS_VIRTUALENV_PATH}" uv sync --frozen -# Build documentation in the "docs/" directory with Sphinx +# Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/conf.py -# Optionally build your docs in additional formats such as PDF and ePub -# formats: -# - pdf -# - epub - -# Optional but recommended, declare the Python requirements required -# to build your documentation -# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html -python: - install: - - requirements: docs/requirements.txt \ No newline at end of file +# Optionally build your docs in additional formats such as PDF +formats: + - pdf + - epub \ No newline at end of file From 825588f678185360326bc2aa3346e9f0456b6574 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 18 Nov 2025 21:46:10 -0800 Subject: [PATCH 75/85] Break out KSP install detection to its own page --- KSPCommon.targets | 2 +- README.md | 2 +- docs/msbuild/index.md | 3 ++- docs/msbuild/ksp-install.md | 25 +++++++++++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 docs/msbuild/ksp-install.md diff --git a/KSPCommon.targets b/KSPCommon.targets index f43cd24..1bba0a1 100644 --- a/KSPCommon.targets +++ b/KSPCommon.targets @@ -108,7 +108,7 @@ <_GameRootMessage Include="KSPBT_GameRoot Candidates:"/> diff --git a/README.md b/README.md index 61b4409..073a4fa 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ to the .csproj file. Pinning the version is highly recommended. ## Usage -Once you [have a KSP installation to link to](https://kspbuildtools.readthedocs.io/en/stable/msbuild/getting-started.html#locating-your-ksp-install), all the game DLLs will be automatically included in your project automatically. +Once you [have a KSP installation to link to](https://kspbuildtools.readthedocs.io/en/stable/msbuild/ksp-install.html), all the game DLLs will be automatically included in your project automatically. Configure your mod's location in GameData and where to put the output DLLs diff --git a/docs/msbuild/index.md b/docs/msbuild/index.md index 04e5588..b030a00 100644 --- a/docs/msbuild/index.md +++ b/docs/msbuild/index.md @@ -21,8 +21,9 @@ maxdepth: 1 --- getting-started -generating-version-files +ksp-install dependencies +generating-version-files configuration ``` diff --git a/docs/msbuild/ksp-install.md b/docs/msbuild/ksp-install.md new file mode 100644 index 0000000..03b79a5 --- /dev/null +++ b/docs/msbuild/ksp-install.md @@ -0,0 +1,25 @@ +# Locating your KSP Install + +KSPBuildTools needs to know where you have KSP installed in order to reference the game dlls. These are all specific to your own computer, and should not be included in your git repo. + +There are several options for this. KSPBuildTools will choose in the following order. Either [autodiscovery in the solution directory](#solution-directory) or [setting a reference path in a .user file](#environment-variable) are the recommended methods for most users. + +### KSPBT_GameRoot MSBuild Property + +If the {confval}`KSPBT_GameRoot` MSBuild property is already set, KSPBuildTools will use it as-is. This can be set in your .csproj.user file. + +### Environment Variable + +Set the {envvar}`KSP_ROOT` environment variable to the root of a KSP install. This is useful for CI workflows such as those using the {gha:action}`compile` action. + +### Solution Directory + +KSPBuildTools will look for a "KSP" directory in your solution directory and use it if it is a valid install. It identifies valid installs by looking for `assembly-csharp.dll` in the appropriate subdirectory for your operating system. + +### Reference Path + +KSPBuildTools will use the `ReferencePath` MSBuild property if it is a valid KSP install. This can be set in a user file located at `{csproj path}.user`. If you use Visual Studio, it can generate this file and property for you. + +### From Steam + +KSPBuildTools will use the default Steam install location if it is a valid install \ No newline at end of file From f39d92f6e59ee0cd364fd1efba111a1d8e53fe37 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 18 Nov 2025 21:48:57 -0800 Subject: [PATCH 76/85] Reorder some things --- docs/msbuild/configuration.md | 2 +- docs/msbuild/getting-started.md | 42 +++++++-------------------------- 2 files changed, 9 insertions(+), 35 deletions(-) diff --git a/docs/msbuild/configuration.md b/docs/msbuild/configuration.md index 9626663..a1c9558 100644 --- a/docs/msbuild/configuration.md +++ b/docs/msbuild/configuration.md @@ -1,4 +1,4 @@ -# Configuration +# Configuration Reference ## Properties diff --git a/docs/msbuild/getting-started.md b/docs/msbuild/getting-started.md index 66d6bbc..8670e7c 100644 --- a/docs/msbuild/getting-started.md +++ b/docs/msbuild/getting-started.md @@ -6,13 +6,6 @@ There are several ways to use the KSPBuildTools package in your mod. [KSPBuildT A detailed walkthrough for creating a new mod project using KSPBuildTools can be found [here](https://github.com/KSPModdingLibs/KSPModdingWiki/wiki/Creating-a-new-Plugin-Mod). -### Install with NuGet - Older Framework Style projects - -1. Right-click on your project file in Visual Studio and select "Manage NuGet Packages." -2. Search for KSPBuildTools -3. Optionally, check "Include prerelease" to get access to the bleeding edge of KSPBuildTools -4. Click "Install" - ### Install with NuGet - SDK Style projects either run the following command: @@ -33,6 +26,13 @@ or add the following to your csproj: ``` ```` +### Install with NuGet - Older Framework Style projects + +1. Right-click on your project file in Visual Studio and select "Manage NuGet Packages." +2. Search for KSPBuildTools +3. Optionally, check "Include prerelease" to get access to the bleeding edge of KSPBuildTools +4. Click "Install" + ### Including the Targets File Directly If you aren't able to use the NuGet option, you can include the targets file directly using a git submodule. @@ -61,7 +61,7 @@ Then include the targets file in your csproj. Make sure you use the correct path Or you can copy the files you want into your own repository and use them however you like - though that will make it harder to get updates -### Remove existing assembly references +## Remove existing assembly references If you're adding KSPBuildTools to an existing mod, or if you just started a blank project, you likely have some assembly dependencies already in your csproj file. You need to remove these. KSPBuildTools will automatically reference the KSP, Unity, and Mono assemblies that are part of your KSP install. There are a few small differences between those Mono libraries and the regular .net framework ones. @@ -69,29 +69,3 @@ If you're adding KSPBuildTools to an existing mod, or if you just started a blan 2. Right-click again and select "edit" 3. Remove ALL `` items 4. Right-click on your project and reload - -## Locating your KSP Install - -KSPBuildTools needs to know where you have KSP installed in order to reference the game dlls. These are all specific to your own computer, and should not be included in your git repo. - -There are several options for this. KSPBuildTools will choose in the following order. Either [autodiscovery in the solution directory](#solution-directory) or [setting a reference path in a .user file](#environment-variable) are the recommended methods for most users. - -### KSPBT_GameRoot MSBuild Property - -If the {confval}`KSPBT_GameRoot` MSBuild property is already set, KSPBuildTools will use it as-is. This can be set in your .csproj.user file. - -### Environment Variable - -Set the {envvar}`KSP_ROOT` environment variable to the root of a KSP install. This is useful for CI workflows such as those using the {gha:action}`compile` action. - -### Solution Directory - -KSPBuildTools will look for a "KSP" directory in your solution directory and use it if it is a valid install. It identifies valid installs by looking for `assembly-csharp.dll` in the appropriate subdirectory for your operating system. - -### Reference Path - -KSPBuildTools will use the `ReferencePath` MSBuild property if it is a valid KSP install. This can be set in a user file located at `{csproj path}.user`. If you use Visual Studio, it can generate this file and property for you. - -### From Steam - -KSPBuildTools will use the default Steam install location if it is a valid install From 317e748569615ccb0ecf1d538322e7a0930122eb Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 18 Nov 2025 22:07:22 -0800 Subject: [PATCH 77/85] Add migration guide --- docs/index.md | 1 + docs/migration.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 docs/migration.md diff --git a/docs/index.md b/docs/index.md index df76184..76aee98 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,6 +11,7 @@ msbuild/index actions/index workflows/index scripts +migration ``` ```{toctree} diff --git a/docs/migration.md b/docs/migration.md new file mode 100644 index 0000000..9fcb6ff --- /dev/null +++ b/docs/migration.md @@ -0,0 +1,58 @@ +# Migration Guide +If you are migrating a mod from a <1.0.0 version KSP Build Tools, follow the instructions below + +## MSBuild Properties + +- `KSPRoot` was renamed to {confval}`KSPBT_GameRoot`. It should no longer be referenced within a .csproj file +- `RepoRootPath` was renamed to {confval}`KSPBT_ModRoot`, and should now point to the mod folder within GameData rather than the root of a git repo +- `BinariesOutputRelativePath` was renamed to {confval}`KSPBT_ModPluginFolder` +- `GenerateKSPAssemblyAttribute` was renamed to {confval}`KSPBT_GenerateAssemblyAttribute` and defaults to true +- `GenerateKSPAssemblyDependencyAttributes` was renamed to {confval}`KSPBT_GenerateDependencyAttributes` and defaults to true +- `ReferenceUnityAssemblies` was renamed to {confval}`KSPBT_ReferenceUnityAssemblies` +- `ReferenceKSPAssemblies` was renamed to {confval}`KSPBT_ReferenceGameAssemblies` + +## MSBuild Items + +Dependency mods should now be specified with {confval}`ModReference` items. For example + +```xml + + + $(KSPRoot)/GameData/000_Harmony/0Harmony.dll + Harmony2 + False + + +``` + +would become + +```xml + + + GameData/000_Harmony/0Harmony.dll + Harmony2 + False + + +``` + +## CI Actions + +### {gha:action}`compile` + +The compile action no longer runs `setup-dotnet`. You need to run this step separately. + +If your mod uses a `packages.config` file, you need to specify `use-nuget-restore` like so + +```yaml +- uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0 + with: + use-nuget-restore: 'true' +``` + +If your mod *does not* use a `packages.config` file, you can migrate your workflows on Github runners to use Ubuntu 24.04 or later. + +## Library + +If you made use of the logging utilities under the `KSPBuildTools` namespace, you should migrate to [KSPCommunityLib](https://git.offworldcolonies.nexus/KSPModdingLibs/KSPCommunityLib) instead. From 36ffacce2b0f49650916533d6809ecfe647d1d72 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 18 Nov 2025 22:07:31 -0800 Subject: [PATCH 78/85] Remove outdated changelog line --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9995ea..579c354 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,6 @@ All notable changes to this project will be documented in this file managed folder. Setting this property to false will load the implicit framework DLLs instead. - Mod dependencies should now be declared with `ModReference` items. This avoids the need for the KSP install path to be known at evaluation time. -- Only include Log.cs (or anything else in include/unity) when `KSPBT_ReferenceUnityAssemblies` is `true` (#61) - Fix `KSP_VERSION_MAX` getting mangled when using an existing version file (#64) - Fix incorrect behavior when building without a solution (#50) From d6d7edc3942b88a05bee8157fc6dee7ae9d2441a Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 18 Nov 2025 22:08:40 -0800 Subject: [PATCH 79/85] not just github --- docs/actions/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/actions/index.md b/docs/actions/index.md index c892d85..f0264b3 100644 --- a/docs/actions/index.md +++ b/docs/actions/index.md @@ -1,6 +1,6 @@ # Github Actions -KSPBuildTools provides several composite actions for use with Github Actions. These are smaller units of tasks that can be combined in workflows to help automate testing, building, and releasing mods. +KSPBuildTools provides several composite actions for use with Github Actions and compatible platforms. These are smaller units of tasks that can be combined in workflows to help automate testing, building, and releasing mods. For usage, see [Actions](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/using-pre-written-building-blocks-in-your-workflow) in the Github docs. From 467267448c0aba75f79ff6ce9c49ea6ae9978bd7 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 18 Nov 2025 23:23:41 -0800 Subject: [PATCH 80/85] Change assemble-release to no longer upload anything as well as changing its outputs --- .github/actions/assemble-release/action.yml | 35 ++++++++----------- .github/workflows/build.yml | 14 ++++++-- .github/workflows/create-release.yml | 2 +- .../workflows/internal-test-plugin-legacy.yml | 8 +++++ .../workflows/internal-test-plugin-nuget.yml | 10 +++++- .github/workflows/internal-test-plugin.yml | 18 +++------- CHANGELOG.md | 3 +- docs/migration.md | 8 ++++- 8 files changed, 58 insertions(+), 40 deletions(-) diff --git a/.github/actions/assemble-release/action.yml b/.github/actions/assemble-release/action.yml index 2632f61..3d5e64e 100644 --- a/.github/actions/assemble-release/action.yml +++ b/.github/actions/assemble-release/action.yml @@ -2,7 +2,7 @@ name: Assemble Release x-env: RELEASE_STAGING: - description: The artifact files will be copied to this directory before being packaged in the zip file. This becomes the input for `upload-artifact`. If not set, `/tmp/release` is used instead + description: The artifact files will be copied to this directory before being packaged in the zip file. If not set, `/tmp/release` is used instead inputs: artifacts: @@ -30,9 +30,13 @@ outputs: value: ${{ steps.upload-artifact.outputs.artifact-url }} description: Artifact URL from the upload-artifact action - artifact-path: - value: ${{ steps.assemble-release.outputs.artifact-path }} - description: Local path to the produced zip file + artifact-zip-path: + value: ${{ steps.assemble-release.outputs.artifact-zip-path }} + description: Local path to the produced release zip file + + artifact-dir-path: + value: ${{ steps.assemble-release.outputs.artifact-dir-path }} + description: Local path to the produced release directory runs: using: composite @@ -40,7 +44,7 @@ runs: - name: Set RELEASE_STAGING if: ${{ !env.RELEASE_STAGING}} shell: bash - run: echo 'RELEASE_STAGING=${{ '/tmp/release' }}' >> "$GITHUB_ENV" + run: echo 'RELEASE_STAGING=/tmp/release/' >> "$GITHUB_ENV" - name: Copy Files to Staging shell: bash @@ -49,9 +53,9 @@ runs: shopt -s nocaseglob # so globs are case-insensitive shopt -s globstar shopt -s nullglob - mkdir -p ${{ env.RELEASE_STAGING }} - cp -r -v ${{ inputs.artifacts }} ${{ env.RELEASE_STAGING }} - cd ${{ env.RELEASE_STAGING }} + mkdir -p ${{ env.RELEASE_STAGING }}/${{ inputs.output-file-name}} + cp -r -v ${{ inputs.artifacts }} ${{ env.RELEASE_STAGING }}/${{ inputs.output-file-name}} + cd ${{ env.RELEASE_STAGING }}/${{ inputs.output-file-name}} rm -f ${{ inputs.artifacts-exclude }} - name: Assemble Release @@ -59,15 +63,6 @@ runs: shell: bash working-directory: ${{ env.RELEASE_STAGING }} run: | - zip -r ${{ github.workspace }}/${{ inputs.output-file-name }}.zip . - echo 'ARTIFACT_FILENAME=${{ inputs.output-file-name }}' >> $GITHUB_ENV - echo 'artifact-path=${{ github.workspace }}/${{ inputs.output-file-name }}.zip' >> $GITHUB_OUTPUT - - - name: Upload Artifact - id: upload-artifact - uses: actions/upload-artifact@v4 - with: - path: ${{ env.RELEASE_STAGING }} - name: ${{ inputs.output-file-name }} - if-no-files-found: error - include-hidden-files: 'true' # behavior changed in 4.4.0. Include hidden for matching the behavior of `zip` + zip -r ${{ inputs.output-file-name }}.zip ${{ inputs.output-file-name}} + echo 'artifact-zip-path=${{ env.RELEASE_STAGING }}/${{ inputs.output-file-name }}.zip' >> $GITHUB_OUTPUT + echo 'artifact-dir-path=${{ env.RELEASE_STAGING }}/${{ inputs.output-file-name}}' >> $GITHUB_OUTPUT \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 00fdcf2..ab0d4f5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -79,8 +79,18 @@ jobs: solution-file-path: ${{ inputs.solution-file-path }} use-nuget-restore: ${{ inputs.use-nuget-restore }} - # Assemble the mod into a release package and upload it as an artifact + # Assemble the mod into a release package - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.3 + id: assemble-release with: artifacts: ${{ inputs.artifacts }} - output-file-name: ${{ github.event.repository.name }}-${{ inputs.build-configuration }} + output-file-name: ${{ github.event.repository.name }} + + # Upload artifact + - uses: actions/upload-artifact@v4 + id: upload-artifact + with: + path: ${{ steps.assemble-release.outputs.artifact-dir-path }} + name: ${{ github.event.repository.name }}-${{ inputs.build-configuration }} + if-no-files-found: error + include-hidden-files: 'true' # behavior changed in 4.4.0. Include hidden for matching the behavior of `zip` diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index c316092..0307a6b 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -111,4 +111,4 @@ jobs: GH_TOKEN: ${{ github.token }} run: | git push - gh release create "$VERSION_STRING" --draft --target ${{ github.ref_name }} --title "$VERSION_STRING" "$ARTIFACT_FILENAME.zip" --notes-file "$RELEASE_NOTES_FILE" + gh release create "$VERSION_STRING" --draft --target ${{ github.ref_name }} --title "$VERSION_STRING" "${{ steps.assemble-release.outputs.artifact-zip-path }}" --notes-file "$RELEASE_NOTES_FILE" diff --git a/.github/workflows/internal-test-plugin-legacy.yml b/.github/workflows/internal-test-plugin-legacy.yml index b565700..de1b7aa 100644 --- a/.github/workflows/internal-test-plugin-legacy.yml +++ b/.github/workflows/internal-test-plugin-legacy.yml @@ -27,6 +27,14 @@ jobs: use-nuget-restore: true - uses: ./.github/actions/assemble-release + id: assemble-release with: artifacts: ${{ env.TESTDIR }}/GameData output-file-name: plugin-mod-legacy + + - uses: actions/upload-artifact@v4 + with: + path: ${{ steps.assemble-release.outputs.artifact-dir-path }} + name: plugin-mod-legacy + if-no-files-found: error + include-hidden-files: 'true' # behavior changed in 4.4.0. Include hidden for matching the behavior of `zip` \ No newline at end of file diff --git a/.github/workflows/internal-test-plugin-nuget.yml b/.github/workflows/internal-test-plugin-nuget.yml index b405439..09dbe25 100644 --- a/.github/workflows/internal-test-plugin-nuget.yml +++ b/.github/workflows/internal-test-plugin-nuget.yml @@ -48,6 +48,14 @@ jobs: KSPBuildToolsVersion: ${{ inputs.package-version }} - uses: ./.github/actions/assemble-release + id: assemble-release with: artifacts: ${{ env.TESTDIR }}/GameData - output-file-name: plugin-mod-nuget-${{ matrix.dotnet-version }} + output-file-name: plugin-mod-nuget + + - uses: actions/upload-artifact@v4 + with: + path: ${{ steps.assemble-release.outputs.artifact-dir-path }} + name: plugin-mod-nuget-${{ matrix.dotnet-version }} + if-no-files-found: error + include-hidden-files: 'true' # behavior changed in 4.4.0. Include hidden for matching the behavior of `zip` diff --git a/.github/workflows/internal-test-plugin.yml b/.github/workflows/internal-test-plugin.yml index fa96929..6c28875 100644 --- a/.github/workflows/internal-test-plugin.yml +++ b/.github/workflows/internal-test-plugin.yml @@ -32,19 +32,9 @@ jobs: working-directory: ${{ env.TESTDIR }} output-file-name: plugin-mod - - name: Get github artifact - uses: actions/download-artifact@v4 + - uses: actions/upload-artifact@v4 with: + path: ${{ steps.assemble-release.outputs.artifact-dir-path }} name: plugin-mod - path: github-artifact - - - name: Compare with zip artifact - run: | - unzip ${{ steps.assemble-release.outputs.artifact-path }} -d zip-artifact - - tree github-artifact - tree zip-artifact - - if [[ $(tree github-artifact/* | sed '1d') != $(tree zip-artifact/* | sed '1d') ]]; then echo "tree mismatch" && false; fi # fail if contents differ - if [[ ! -d github-artifact/GameData ]]; then echo "GameData not present" && false; fi # fail if GameData folder isnt present - if [[ -f github-artifact/GameData/plugin-mod/PluginMod.pdb ]]; then echo "pdb still present" && false; fi # fail if PDB is still present \ No newline at end of file + if-no-files-found: error + include-hidden-files: 'true' # behavior changed in 4.4.0. Include hidden for matching the behavior of `zip` \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 579c354..f3a4a95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,7 +29,8 @@ All notable changes to this project will be documented in this file - `compile` action: Removed call to`actions/setup-dotnet`. Setting up .NET should be done as a separate step. (#65) - `setup-ckan` action: Sped up execution by skipping recommended packages and man-db updates - `setup-ckan` action: Add `ckan-install-method` option for installation method. Currently supports `'apt'` for installation on Debian/Ubuntu, or `'skip'` to skip installation for runners that already have CKAN installed. -- `assemble-release` action: `outputs.artifact-path` now includes the `.zip` extension (#51) +- `assemble-release` action: `outputs.artifact-path` was split into `outputs.artifact-zip-path` and `outputs.artifact-dir-path` containing paths to a zip file and directory respectively. These are also now located under `$RELEASE_STAGING` instead of inside the workspace +- `assemble-release` action: Removed call to `actions/upload-artifact`. This should be done as a separate step. ### Library diff --git a/docs/migration.md b/docs/migration.md index 9fcb6ff..f999e1a 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -39,7 +39,7 @@ would become ## CI Actions -### {gha:action}`compile` +### {gha:action}`compile`: The compile action no longer runs `setup-dotnet`. You need to run this step separately. @@ -53,6 +53,12 @@ If your mod uses a `packages.config` file, you need to specify `use-nuget-restor If your mod *does not* use a `packages.config` file, you can migrate your workflows on Github runners to use Ubuntu 24.04 or later. +### {gha:action}`assemble-release`: + +The assemble release action no longer runs `upload-artifact`. You need to run this step separately. + +Additionally, the `artifact-path` output was split into `artifact-zip-path` and `artifact-dir-path` containing paths to a zip file and directory respectively. Use the correct one depending on if you want a directory or a zip. + ## Library If you made use of the logging utilities under the `KSPBuildTools` namespace, you should migrate to [KSPCommunityLib](https://git.offworldcolonies.nexus/KSPModdingLibs/KSPCommunityLib) instead. From aa363838a2a058fe3b3ac7766786df780b4593cd Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 18 Nov 2025 23:23:47 -0800 Subject: [PATCH 81/85] fix link --- docs/msbuild/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/msbuild/configuration.md b/docs/msbuild/configuration.md index a1c9558..95c14c7 100644 --- a/docs/msbuild/configuration.md +++ b/docs/msbuild/configuration.md @@ -86,7 +86,7 @@ If set to `true`, automatically generates a version file using the information i ```{warning} You should **not** set or use this property in your csproj file. ``` -This property should be set to the root directory of your KSP install. see [Locating your KSP Install](getting-started.md/#locating-your-ksp-install) +This property should be set to the root directory of your KSP install. see [Locating your KSP Install](ksp-install) ```` ## Items From 8e3dd0e25b72c008ea4a0b99a00b1aaec1c729b9 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Tue, 18 Nov 2025 23:32:08 -0800 Subject: [PATCH 82/85] Use sd because trying to make anything work with GNU sed is an exercise in futility FSF Delende Est --- justfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/justfile b/justfile index dd54dfa..24b5bda 100644 --- a/justfile +++ b/justfile @@ -5,7 +5,7 @@ sphinx := "uv run --project docs -m sphinx" sphinx_autobuild := "uv run --with sphinx-autobuild --project docs sphinx-autobuild" pin-workflows tag: - sed -E -H -i ".backup" "s|(uses: KSPModdingLibs/KSPBuildTools/\.github/actions/\S+@)\S+|\1{{ tag }}|g" .github/workflows/*.yml + sd '(uses: KSPModdingLibs/KSPBuildTools/\.github/actions/\S+@)\S+$' '${1}{{ tag }}' .github/workflows/*.yml release *args: {{ yaclog }} release {{ args }} From f29fbbf6f740474a0f3a9aa91d8b9bef9beb0ec6 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Wed, 19 Nov 2025 00:15:03 -0800 Subject: [PATCH 83/85] Release 1.0.0-rc.1 --- .github/workflows/build.yml | 8 ++++---- .github/workflows/create-release.yml | 10 +++++----- .github/workflows/publish-to-spacedock.yml | 2 +- CHANGELOG.md | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ab0d4f5..325c189 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,17 +60,17 @@ jobs: dotnet-version: ${{ inputs.dotnet-version }} # Install CKAN and set up an instance - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.3 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-rc.1 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} # Install any listed CKAN dependencies - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.3 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-rc.1 if: ${{ inputs.dependency-identifiers }} with: dependency-identifiers: ${{ inputs.dependency-identifiers }} # Compile the mod - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.3 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-rc.1 if: ${{ inputs.use-msbuild }} with: build-configuration: ${{ inputs.build-configuration }} @@ -80,7 +80,7 @@ jobs: use-nuget-restore: ${{ inputs.use-nuget-restore }} # Assemble the mod into a release package - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.3 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-rc.1 id: assemble-release with: artifacts: ${{ inputs.artifacts }} diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 0307a6b..698cb53 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -64,7 +64,7 @@ jobs: submodules: true - name: update-version - uses: KSPModdingLibs/KSPBuildTools/.github/actions/update-version@1.0.0-alpha.3 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/update-version@1.0.0-rc.1 with: version-string: ${{ inputs.version-string }} template-extension: ${{ inputs.version-template-extension }} @@ -81,18 +81,18 @@ jobs: git tag -f -a "$VERSION_STRING" -m "$VERSION_STRING" # Install CKAN and set up an instance - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-alpha.3 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/setup-ckan@1.0.0-rc.1 if: ${{ (inputs.use-ckan && inputs.use-msbuild) || inputs.dependency-identifiers }} # Install any listed CKAN dependencies - - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-alpha.3 + - uses: KSPModdingLibs/KSPBuildTools/.github/actions/install-dependencies@1.0.0-rc.1 if: ${{ inputs.dependency-identifiers }} with: dependency-identifiers: ${{ inputs.dependency-identifiers }} - name: compile if: ${{ inputs.use-msbuild }} - uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-alpha.3 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/compile@1.0.0-rc.1 with: build-configuration: ${{ inputs.build-configuration }} ksp-zip-url: ${{ inputs.ksp-zip-url }} @@ -101,7 +101,7 @@ jobs: - name: assemble-release id: assemble-release - uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-alpha.3 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/assemble-release@1.0.0-rc.1 with: artifacts: ${{ inputs.artifacts }} output-file-name: ${{ github.event.repository.name }}-${{ env.VERSION_STRING }} diff --git a/.github/workflows/publish-to-spacedock.yml b/.github/workflows/publish-to-spacedock.yml index bfe82ca..77a61b0 100644 --- a/.github/workflows/publish-to-spacedock.yml +++ b/.github/workflows/publish-to-spacedock.yml @@ -31,7 +31,7 @@ jobs: steps: - name: get-release-info id: get-release-info - uses: KSPModdingLibs/KSPBuildTools/.github/actions/get-release-info@1.0.0-alpha.3 + uses: KSPModdingLibs/KSPBuildTools/.github/actions/get-release-info@1.0.0-rc.1 with: release-tag: ${{ inputs.release-tag }} diff --git a/CHANGELOG.md b/CHANGELOG.md index f3a4a95..311fade 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file -## 1.0.0-alpha.3 - 2025-11-14 +## 1.0.0-rc.1 - 2025-11-19 ### Msbuild From 31d28d53157b9bffa91ce7f6c2e8c592a2cd7cbe Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Wed, 19 Nov 2025 00:58:41 -0800 Subject: [PATCH 84/85] fix link --- docs/msbuild/ksp-install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/msbuild/ksp-install.md b/docs/msbuild/ksp-install.md index 03b79a5..0e9c2f0 100644 --- a/docs/msbuild/ksp-install.md +++ b/docs/msbuild/ksp-install.md @@ -2,7 +2,7 @@ KSPBuildTools needs to know where you have KSP installed in order to reference the game dlls. These are all specific to your own computer, and should not be included in your git repo. -There are several options for this. KSPBuildTools will choose in the following order. Either [autodiscovery in the solution directory](#solution-directory) or [setting a reference path in a .user file](#environment-variable) are the recommended methods for most users. +There are several options for this. KSPBuildTools will choose in the following order. Either [autodiscovery in the solution directory](#solution-directory) or [setting a reference path in a .user file](#kspbt-gameroot-msbuild-property) are the recommended methods for most users. ### KSPBT_GameRoot MSBuild Property From 71216db67ace532fb00d3a2ddbcf3ce79e2afe95 Mon Sep 17 00:00:00 2001 From: Andrew Cassidy Date: Wed, 19 Nov 2025 21:59:52 -0800 Subject: [PATCH 85/85] This was bugging me --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 073a4fa..0912a6e 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,8 @@ Configure your mod's location in GameData and where to put the output DLLs Reference dependency mods in your DLL by adding `ModReference` items to the project. They will be automatically installed using CKAN. ```xml + - GameData/Modulemanager*.dll ModuleManager