diff --git a/Generators/KitX.Sdk.Generators.CSharp/KitX.Sdk.Generators.CSharp.csproj b/Generators/KitX.Sdk.Generators.CSharp/KitX.Sdk.Generators.CSharp.csproj
new file mode 100644
index 0000000..1f0dcf8
--- /dev/null
+++ b/Generators/KitX.Sdk.Generators.CSharp/KitX.Sdk.Generators.CSharp.csproj
@@ -0,0 +1,33 @@
+
+
+
+ netstandard2.0
+ preview
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(GetTargetPathDependsOn);GetDependencyTargetPaths
+
+
+
+
+
+
+
+
+
+
diff --git a/Generators/KitX.Sdk.Generators.CSharp/PluginFunctionsGenerator.cs b/Generators/KitX.Sdk.Generators.CSharp/PluginFunctionsGenerator.cs
new file mode 100644
index 0000000..55bb934
--- /dev/null
+++ b/Generators/KitX.Sdk.Generators.CSharp/PluginFunctionsGenerator.cs
@@ -0,0 +1,104 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using KitX.Contract.CSharp.Attributes;
+using KitX.Shared.CSharp.Plugin;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.Text;
+using Newtonsoft.Json;
+
+namespace KitX.Sdk.Generators.CSharp;
+
+[Generator]
+public class PluginFunctionsGenerator : ISourceGenerator
+{
+ public void Initialize(GeneratorInitializationContext context)
+ {
+
+ }
+
+ //public Dictionary GetTranslations(string field, IEnumerable translations)
+ //{
+ // var result = new Dictionary();
+
+ // foreach (var item in translations.Where(t => t.Field.Equals(field)))
+ // result.Add(item.Language, item.Value);
+
+ // return result;
+ //}
+
+ public void Execute(GeneratorExecutionContext context)
+ {
+ var entryAttrType = typeof(EntryClassAttribute);
+ var funcAttrType = typeof(FunctionAttribute);
+
+ //var functions = context.Compilation.Assembly.GetAttributes()
+ // .Where(x => x.AttributeClass?.GetType().Equals(entryAttrType) ?? false)
+ // .SelectMany(x => x.GetType().GetMethods())
+ // .Where(f => f.CustomAttributes.Any(
+ // x => x.AttributeType.Equals(funcAttrType)
+ // ))
+ // ;
+
+ //var result = functions.Select(func =>
+ //{
+ // var parameters = func.GetParameters().Select(param =>
+ // {
+ // var paramAttr = param.GetCustomAttribute()!;
+
+ // return new Parameter
+ // {
+ // Name = paramAttr.Name,
+ // DisplayNames = GetTranslations("DisplayName", param.GetCustomAttributes()),
+ // Type = param.ParameterType.Name,
+ // IsOptional = param.IsOptional,
+ // };
+ // });
+
+ // var funcAttr = func.GetCustomAttribute()!;
+
+ // return new Function
+ // {
+ // Name = funcAttr.Name,
+ // DisplayNames = GetTranslations("DisplayName", func.GetCustomAttributes()),
+ // ReturnValueType = func.ReturnType.Name,
+ // Parameters = parameters.ToList(),
+ // };
+ //});
+
+ //var sourceText = JsonConvert.SerializeObject(result);
+
+ //context.AddSource("PluginFunctions.json", SourceText.From(sourceText, Encoding.UTF8));
+
+ context.AddSource("Test.json", SourceText.From("", Encoding.UTF8));
+
+ context.ReportDiagnostic(
+ Diagnostic.Create(
+ new DiagnosticDescriptor(
+ "KSDK0001",
+ "Plugin Info Generated",
+ "PluginFunctions.json generated successfully.",
+ "Plugin",
+ DiagnosticSeverity.Info,
+ true
+ ),
+ Location.None)
+ );
+
+ context.ReportDiagnostic(
+ Diagnostic.Create(
+ new DiagnosticDescriptor(
+ "KSDK0000",
+ "Your location",
+ $"You are at {Path.GetFullPath(".")}",
+ "Plugin",
+ DiagnosticSeverity.Warning,
+ true
+ ),
+ Location.None)
+ );
+ }
+}
diff --git a/KitX Plugins b/KitX Plugins
index 2c2a210..2fd3d44 160000
--- a/KitX Plugins
+++ b/KitX Plugins
@@ -1 +1 @@
-Subproject commit 2c2a2102d4826765f6f9806ff1e1ddf3bc3f1b3e
+Subproject commit 2fd3d442b9b2d18f8571aec4d3de64000091c341