diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..d3eeffe
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,61 @@
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 4
+
+[*.{json,yml,yaml,nix,csproj,props,targets,slnx,xml}]
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.cs]
+# Namespaces and usings
+csharp_style_namespace_declarations = file_scoped:warning
+csharp_using_directive_placement = outside_namespace:warning
+dotnet_sort_system_directives_first = true
+
+# Language preferences
+dotnet_style_qualification_for_field = false:warning
+dotnet_style_qualification_for_property = false:warning
+dotnet_style_qualification_for_method = false:warning
+dotnet_style_predefined_type_for_locals_parameters_members = true:warning
+csharp_style_var_for_built_in_types = false:suggestion
+csharp_style_var_when_type_is_apparent = true:suggestion
+csharp_style_var_elsewhere = false:suggestion
+csharp_prefer_braces = true:warning
+csharp_style_expression_bodied_methods = when_on_single_line:suggestion
+csharp_style_prefer_primary_constructors = true:suggestion
+dotnet_style_readonly_field = true:warning
+
+# Formatting
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+
+# Naming: interfaces start with I, private fields start with _
+dotnet_naming_rule.interfaces_begin_with_i.symbols = interfaces
+dotnet_naming_rule.interfaces_begin_with_i.style = begins_with_i
+dotnet_naming_rule.interfaces_begin_with_i.severity = warning
+dotnet_naming_symbols.interfaces.applicable_kinds = interface
+dotnet_naming_style.begins_with_i.required_prefix = I
+dotnet_naming_style.begins_with_i.capitalization = pascal_case
+
+dotnet_naming_rule.private_fields_underscore.symbols = private_fields
+dotnet_naming_rule.private_fields_underscore.style = underscore_camel
+dotnet_naming_rule.private_fields_underscore.severity = warning
+dotnet_naming_symbols.private_fields.applicable_kinds = field
+dotnet_naming_symbols.private_fields.applicable_accessibilities = private
+dotnet_naming_style.underscore_camel.required_prefix = _
+dotnet_naming_style.underscore_camel.capitalization = camel_case
+
+# Tests: allow underscores in method names (Method_Scenario_Expected)
+[tests/**/*.cs]
+dotnet_diagnostic.CA1707.severity = none
diff --git a/.gitignore b/.gitignore
index 858f26f..b9aaecd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,5 @@
.direnv/
.envrc
-compile_commands.json
-
-build/
-
+bin/
+obj/
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..a56ae80
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,27 @@
+
+
+
+ net10.0
+ latest
+ enable
+ enable
+ true
+
+
+
+ true
+ latest-recommended
+ true
+
+
+
+ true
+ true
+
+
+
+ true
+ true
+
+
+
diff --git a/Directory.Packages.props b/Directory.Packages.props
new file mode 100644
index 0000000..6a5efed
--- /dev/null
+++ b/Directory.Packages.props
@@ -0,0 +1,15 @@
+
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
diff --git a/flake.nix b/flake.nix
index db05232..ad51710 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,5 +1,5 @@
{
- description = "VSSM dev environment";
+ description = "vssm - dev environment";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
@@ -11,32 +11,18 @@
in
{
devShells = forAllSystems (pkgs: {
- default = pkgs.mkShell.override { stdenv = pkgs.clangStdenv; } {
- nativeBuildInputs = with pkgs; [
- cmake
- ninja
- pkg-config
- clang-tools
- gdb
- valgrind
+ default = pkgs.mkShell {
+ packages = with pkgs; [
+ dotnetCorePackages.sdk_10_0
+ netcoredbg
+ omnisharp-roslyn
+ git
];
- buildInputs = with pkgs; [
- boost
- curl
- libarchive
- openssl
- zlib
- zstd
- nlohmann_json
- spdlog
- cli11
- # dotnet-runtime_8
- ];
-
- shellHook = ''
- export CMAKE_EXPORT_COMPILE_COMMANDS=1
- '';
+ # disable telemetry, banner, and dev HTTPS cert generation
+ DOTNET_CLI_TELEMETRY_OPTOUT = "1";
+ DOTNET_NOLOGO = "1";
+ DOTNET_GENERATE_ASPNET_CERTIFICATE = "false";
};
});
};
diff --git a/global.json b/global.json
new file mode 100644
index 0000000..d46d21e
--- /dev/null
+++ b/global.json
@@ -0,0 +1,7 @@
+{
+ "sdk": {
+ "version": "10.0.100",
+ "rollForward": "latestFeature",
+ "allowPrerelease": false
+ }
+}
diff --git a/omnisharp.json b/omnisharp.json
new file mode 100644
index 0000000..362974f
--- /dev/null
+++ b/omnisharp.json
@@ -0,0 +1,14 @@
+{
+ "FormattingOptions": {
+ "EnableEditorConfigSupport": true,
+ "OrganizeImports": true
+ },
+ "RoslynExtensionsOptions": {
+ "EnableAnalyzersSupport": true,
+ "EnableImportCompletion": true,
+ "AnalyzeOpenDocumentsOnly": false
+ },
+ "Sdk": {
+ "IncludePrereleases": false
+ }
+}
diff --git a/src/Vssm.Api/Vssm.Api.csproj b/src/Vssm.Api/Vssm.Api.csproj
new file mode 100644
index 0000000..3d51fd0
--- /dev/null
+++ b/src/Vssm.Api/Vssm.Api.csproj
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/Vssm.Api/packages.lock.json b/src/Vssm.Api/packages.lock.json
new file mode 100644
index 0000000..6afd678
--- /dev/null
+++ b/src/Vssm.Api/packages.lock.json
@@ -0,0 +1,6 @@
+{
+ "version": 2,
+ "dependencies": {
+ "net10.0": {}
+ }
+}
\ No newline at end of file
diff --git a/src/Vssm.Cli/Program.cs b/src/Vssm.Cli/Program.cs
new file mode 100644
index 0000000..1bc52a6
--- /dev/null
+++ b/src/Vssm.Cli/Program.cs
@@ -0,0 +1 @@
+Console.WriteLine("Hello, World!");
diff --git a/src/Vssm.Cli/Vssm.Cli.csproj b/src/Vssm.Cli/Vssm.Cli.csproj
new file mode 100644
index 0000000..52e6553
--- /dev/null
+++ b/src/Vssm.Cli/Vssm.Cli.csproj
@@ -0,0 +1,7 @@
+
+
+
+ Exe
+
+
+
diff --git a/src/Vssm.Cli/packages.lock.json b/src/Vssm.Cli/packages.lock.json
new file mode 100644
index 0000000..6afd678
--- /dev/null
+++ b/src/Vssm.Cli/packages.lock.json
@@ -0,0 +1,6 @@
+{
+ "version": 2,
+ "dependencies": {
+ "net10.0": {}
+ }
+}
\ No newline at end of file
diff --git a/src/Vssm.Contracts/Vssm.Contracts.csproj b/src/Vssm.Contracts/Vssm.Contracts.csproj
new file mode 100644
index 0000000..a68f5a0
--- /dev/null
+++ b/src/Vssm.Contracts/Vssm.Contracts.csproj
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/Vssm.Contracts/packages.lock.json b/src/Vssm.Contracts/packages.lock.json
new file mode 100644
index 0000000..6afd678
--- /dev/null
+++ b/src/Vssm.Contracts/packages.lock.json
@@ -0,0 +1,6 @@
+{
+ "version": 2,
+ "dependencies": {
+ "net10.0": {}
+ }
+}
\ No newline at end of file
diff --git a/src/Vssm.Core/Vssm.Core.csproj b/src/Vssm.Core/Vssm.Core.csproj
new file mode 100644
index 0000000..a68f5a0
--- /dev/null
+++ b/src/Vssm.Core/Vssm.Core.csproj
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/Vssm.Core/packages.lock.json b/src/Vssm.Core/packages.lock.json
new file mode 100644
index 0000000..6afd678
--- /dev/null
+++ b/src/Vssm.Core/packages.lock.json
@@ -0,0 +1,6 @@
+{
+ "version": 2,
+ "dependencies": {
+ "net10.0": {}
+ }
+}
\ No newline at end of file
diff --git a/src/Vssm.Daemon/Program.cs b/src/Vssm.Daemon/Program.cs
new file mode 100644
index 0000000..1bc52a6
--- /dev/null
+++ b/src/Vssm.Daemon/Program.cs
@@ -0,0 +1 @@
+Console.WriteLine("Hello, World!");
diff --git a/src/Vssm.Daemon/Vssm.Daemon.csproj b/src/Vssm.Daemon/Vssm.Daemon.csproj
new file mode 100644
index 0000000..52e6553
--- /dev/null
+++ b/src/Vssm.Daemon/Vssm.Daemon.csproj
@@ -0,0 +1,7 @@
+
+
+
+ Exe
+
+
+
diff --git a/src/Vssm.Daemon/packages.lock.json b/src/Vssm.Daemon/packages.lock.json
new file mode 100644
index 0000000..6afd678
--- /dev/null
+++ b/src/Vssm.Daemon/packages.lock.json
@@ -0,0 +1,6 @@
+{
+ "version": 2,
+ "dependencies": {
+ "net10.0": {}
+ }
+}
\ No newline at end of file
diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props
new file mode 100644
index 0000000..8b2aef5
--- /dev/null
+++ b/tests/Directory.Build.props
@@ -0,0 +1,10 @@
+
+
+
+
+
+ false
+ true
+
+
+
diff --git a/tests/FakeGameServer/FakeGameServer.csproj b/tests/FakeGameServer/FakeGameServer.csproj
new file mode 100644
index 0000000..6648491
--- /dev/null
+++ b/tests/FakeGameServer/FakeGameServer.csproj
@@ -0,0 +1,8 @@
+
+
+
+ Exe
+ false
+
+
+
diff --git a/tests/FakeGameServer/Program.cs b/tests/FakeGameServer/Program.cs
new file mode 100644
index 0000000..1bc52a6
--- /dev/null
+++ b/tests/FakeGameServer/Program.cs
@@ -0,0 +1 @@
+Console.WriteLine("Hello, World!");
diff --git a/tests/FakeGameServer/packages.lock.json b/tests/FakeGameServer/packages.lock.json
new file mode 100644
index 0000000..6afd678
--- /dev/null
+++ b/tests/FakeGameServer/packages.lock.json
@@ -0,0 +1,6 @@
+{
+ "version": 2,
+ "dependencies": {
+ "net10.0": {}
+ }
+}
\ No newline at end of file
diff --git a/tests/Vssm.Api.Tests/Vssm.Api.Tests.csproj b/tests/Vssm.Api.Tests/Vssm.Api.Tests.csproj
new file mode 100644
index 0000000..c66a624
--- /dev/null
+++ b/tests/Vssm.Api.Tests/Vssm.Api.Tests.csproj
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/Vssm.Api.Tests/packages.lock.json b/tests/Vssm.Api.Tests/packages.lock.json
new file mode 100644
index 0000000..837371f
--- /dev/null
+++ b/tests/Vssm.Api.Tests/packages.lock.json
@@ -0,0 +1,107 @@
+{
+ "version": 2,
+ "dependencies": {
+ "net10.0": {
+ "coverlet.collector": {
+ "type": "Direct",
+ "requested": "[6.0.4, )",
+ "resolved": "6.0.4",
+ "contentHash": "lkhqpF8Pu2Y7IiN7OntbsTtdbpR1syMsm2F3IgX6ootA4ffRqWL5jF7XipHuZQTdVuWG/gVAAcf8mjk8Tz0xPg=="
+ },
+ "Microsoft.NET.Test.Sdk": {
+ "type": "Direct",
+ "requested": "[17.14.1, )",
+ "resolved": "17.14.1",
+ "contentHash": "HJKqKOE+vshXra2aEHpi2TlxYX7Z9VFYkr+E5rwEvHC8eIXiyO+K9kNm8vmNom3e2rA56WqxU+/N9NJlLGXsJQ==",
+ "dependencies": {
+ "Microsoft.CodeCoverage": "17.14.1",
+ "Microsoft.TestPlatform.TestHost": "17.14.1"
+ }
+ },
+ "xunit": {
+ "type": "Direct",
+ "requested": "[2.9.3, )",
+ "resolved": "2.9.3",
+ "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==",
+ "dependencies": {
+ "xunit.analyzers": "1.18.0",
+ "xunit.assert": "2.9.3",
+ "xunit.core": "[2.9.3]"
+ }
+ },
+ "xunit.runner.visualstudio": {
+ "type": "Direct",
+ "requested": "[3.1.4, )",
+ "resolved": "3.1.4",
+ "contentHash": "5mj99LvCqrq3CNi06xYdyIAXOEh+5b33F2nErCzI5zWiDdLHXiPXEWFSUAF8zlIv0ZWqjZNCwHTQeAPYbF3pCg=="
+ },
+ "Microsoft.CodeCoverage": {
+ "type": "Transitive",
+ "resolved": "17.14.1",
+ "contentHash": "pmTrhfFIoplzFVbhVwUquT+77CbGH+h4/3mBpdmIlYtBi9nAB+kKI6dN3A/nV4DFi3wLLx/BlHIPK+MkbQ6Tpg=="
+ },
+ "Microsoft.TestPlatform.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "17.14.1",
+ "contentHash": "xTP1W6Mi6SWmuxd3a+jj9G9UoC850WGwZUps1Wah9r1ZxgXhdJfj1QqDLJkFjHDCvN42qDL2Ps5KjQYWUU0zcQ=="
+ },
+ "Microsoft.TestPlatform.TestHost": {
+ "type": "Transitive",
+ "resolved": "17.14.1",
+ "contentHash": "d78LPzGKkJwsJXAQwsbJJ7LE7D1wB+rAyhHHAaODF+RDSQ0NgMjDFkSA1Djw18VrxO76GlKAjRUhl+H8NL8Z+Q==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "17.14.1",
+ "Newtonsoft.Json": "13.0.3"
+ }
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "13.0.3",
+ "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
+ },
+ "xunit.abstractions": {
+ "type": "Transitive",
+ "resolved": "2.0.3",
+ "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg=="
+ },
+ "xunit.analyzers": {
+ "type": "Transitive",
+ "resolved": "1.18.0",
+ "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ=="
+ },
+ "xunit.assert": {
+ "type": "Transitive",
+ "resolved": "2.9.3",
+ "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
+ },
+ "xunit.core": {
+ "type": "Transitive",
+ "resolved": "2.9.3",
+ "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==",
+ "dependencies": {
+ "xunit.extensibility.core": "[2.9.3]",
+ "xunit.extensibility.execution": "[2.9.3]"
+ }
+ },
+ "xunit.extensibility.core": {
+ "type": "Transitive",
+ "resolved": "2.9.3",
+ "contentHash": "kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==",
+ "dependencies": {
+ "xunit.abstractions": "2.0.3"
+ }
+ },
+ "xunit.extensibility.execution": {
+ "type": "Transitive",
+ "resolved": "2.9.3",
+ "contentHash": "yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==",
+ "dependencies": {
+ "xunit.extensibility.core": "[2.9.3]"
+ }
+ },
+ "vssm.core": {
+ "type": "Project"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/Vssm.Core.Tests/Vssm.Core.Tests.csproj b/tests/Vssm.Core.Tests/Vssm.Core.Tests.csproj
new file mode 100644
index 0000000..c66a624
--- /dev/null
+++ b/tests/Vssm.Core.Tests/Vssm.Core.Tests.csproj
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/Vssm.Core.Tests/packages.lock.json b/tests/Vssm.Core.Tests/packages.lock.json
new file mode 100644
index 0000000..837371f
--- /dev/null
+++ b/tests/Vssm.Core.Tests/packages.lock.json
@@ -0,0 +1,107 @@
+{
+ "version": 2,
+ "dependencies": {
+ "net10.0": {
+ "coverlet.collector": {
+ "type": "Direct",
+ "requested": "[6.0.4, )",
+ "resolved": "6.0.4",
+ "contentHash": "lkhqpF8Pu2Y7IiN7OntbsTtdbpR1syMsm2F3IgX6ootA4ffRqWL5jF7XipHuZQTdVuWG/gVAAcf8mjk8Tz0xPg=="
+ },
+ "Microsoft.NET.Test.Sdk": {
+ "type": "Direct",
+ "requested": "[17.14.1, )",
+ "resolved": "17.14.1",
+ "contentHash": "HJKqKOE+vshXra2aEHpi2TlxYX7Z9VFYkr+E5rwEvHC8eIXiyO+K9kNm8vmNom3e2rA56WqxU+/N9NJlLGXsJQ==",
+ "dependencies": {
+ "Microsoft.CodeCoverage": "17.14.1",
+ "Microsoft.TestPlatform.TestHost": "17.14.1"
+ }
+ },
+ "xunit": {
+ "type": "Direct",
+ "requested": "[2.9.3, )",
+ "resolved": "2.9.3",
+ "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==",
+ "dependencies": {
+ "xunit.analyzers": "1.18.0",
+ "xunit.assert": "2.9.3",
+ "xunit.core": "[2.9.3]"
+ }
+ },
+ "xunit.runner.visualstudio": {
+ "type": "Direct",
+ "requested": "[3.1.4, )",
+ "resolved": "3.1.4",
+ "contentHash": "5mj99LvCqrq3CNi06xYdyIAXOEh+5b33F2nErCzI5zWiDdLHXiPXEWFSUAF8zlIv0ZWqjZNCwHTQeAPYbF3pCg=="
+ },
+ "Microsoft.CodeCoverage": {
+ "type": "Transitive",
+ "resolved": "17.14.1",
+ "contentHash": "pmTrhfFIoplzFVbhVwUquT+77CbGH+h4/3mBpdmIlYtBi9nAB+kKI6dN3A/nV4DFi3wLLx/BlHIPK+MkbQ6Tpg=="
+ },
+ "Microsoft.TestPlatform.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "17.14.1",
+ "contentHash": "xTP1W6Mi6SWmuxd3a+jj9G9UoC850WGwZUps1Wah9r1ZxgXhdJfj1QqDLJkFjHDCvN42qDL2Ps5KjQYWUU0zcQ=="
+ },
+ "Microsoft.TestPlatform.TestHost": {
+ "type": "Transitive",
+ "resolved": "17.14.1",
+ "contentHash": "d78LPzGKkJwsJXAQwsbJJ7LE7D1wB+rAyhHHAaODF+RDSQ0NgMjDFkSA1Djw18VrxO76GlKAjRUhl+H8NL8Z+Q==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "17.14.1",
+ "Newtonsoft.Json": "13.0.3"
+ }
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "13.0.3",
+ "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
+ },
+ "xunit.abstractions": {
+ "type": "Transitive",
+ "resolved": "2.0.3",
+ "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg=="
+ },
+ "xunit.analyzers": {
+ "type": "Transitive",
+ "resolved": "1.18.0",
+ "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ=="
+ },
+ "xunit.assert": {
+ "type": "Transitive",
+ "resolved": "2.9.3",
+ "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
+ },
+ "xunit.core": {
+ "type": "Transitive",
+ "resolved": "2.9.3",
+ "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==",
+ "dependencies": {
+ "xunit.extensibility.core": "[2.9.3]",
+ "xunit.extensibility.execution": "[2.9.3]"
+ }
+ },
+ "xunit.extensibility.core": {
+ "type": "Transitive",
+ "resolved": "2.9.3",
+ "contentHash": "kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==",
+ "dependencies": {
+ "xunit.abstractions": "2.0.3"
+ }
+ },
+ "xunit.extensibility.execution": {
+ "type": "Transitive",
+ "resolved": "2.9.3",
+ "contentHash": "yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==",
+ "dependencies": {
+ "xunit.extensibility.core": "[2.9.3]"
+ }
+ },
+ "vssm.core": {
+ "type": "Project"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/vssm.slnx b/vssm.slnx
new file mode 100644
index 0000000..c087b1a
--- /dev/null
+++ b/vssm.slnx
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+