AtomiCloud

writing-plugin-dotnet

Write or modify CyanPrint plugin code in C#. Use when the user asks to add validation rules, change plugin behavior, modify the entry point, run commands from a plugin, or mutate files. Covers entry point (CyanEngine.StartPlugin), native filesystem I/O (System.IO), and command execution (System.Diagnostics.Process). Plugins receive { Directory, Config } and use native OS operations.

AtomiCloud 0 Updated 5mo ago
GitHub

Install

npx skillscat add atomicloud/ketone-new-cyanprint/writing-plugin-dotnet

Install via the SkillsCat registry.

SKILL.md

Writing this Plugin (C#)

Entry Point

Plugins use CyanEngine.StartPlugin with a function that receives PluginInput and returns PluginOutput:

using sulfone_helium;

PluginOutput PluginFn(PluginInput input)
{
    // Plugin logic here
    return new PluginOutput { Directory = input.Directory };
}

CyanEngine.StartPlugin(PluginFn);

PluginInput

public class PluginInput
{
    public string Directory { get; set; }  // Absolute path to the generated output directory
    public object Config { get; set; }     // Configuration from template's cyan.yaml
}

Important: PluginInput has NO SDK file helpers. There are no ReadDir, ReadFile, or FileExists methods. Plugins use native OS operations for all file I/O.

PluginOutput

public class PluginOutput
{
    public string Directory { get; set; }  // Return the directory path (typically input.Directory)
}

Native File I/O Patterns

using System.IO;

var dir = input.Directory;

// Read a file
var content = File.ReadAllText(Path.Combine(dir, "src", "Program.cs"));

// Check if file exists
var exists = File.Exists(Path.Combine(dir, "README.md"));

// List directory
var files = Directory.GetFiles(Path.Combine(dir, "src"));

// Write a file
File.WriteAllText(Path.Combine(dir, "src", "Program.cs"), modified);

Command Execution Patterns

using System.Diagnostics;

var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "prettier",
        Arguments = "--write .",
        WorkingDirectory = input.Directory,
        RedirectStandardOutput = true,
        UseShellExecute = false,
    }
};
process.Start();
var output = process.StandardOutput.ReadToEnd();
process.WaitForExit();

File Mutation Workflow

Read files from input.Directory, modify content, write back:

using System.IO;

var filePath = Path.Combine(input.Directory, "src", "Program.cs");
var content = File.ReadAllText(filePath);
var modified = content.Replace("old", "new");
File.WriteAllText(filePath, modified);

Entry Point Skeleton

using sulfone_helium;
using System.IO;
using System.Diagnostics;

PluginOutput PluginFn(PluginInput input)
{
    var dir = input.Directory;
    var config = input.Config;

    // Use System.IO for file I/O
    // Use System.Diagnostics.Process for command execution

    return new PluginOutput { Directory = input.Directory };
}

CyanEngine.StartPlugin(PluginFn);

Advanced Patterns

Walk directory recursively

using System.IO;

var allFiles = Directory.GetFiles(input.Directory, "*", SearchOption.AllDirectories);
var csFiles = Directory.GetFiles(input.Directory, "*.cs", SearchOption.AllDirectories);

Read, modify, and write a file

using System.IO;

var filePath = Path.Combine(input.Directory, "src", "Program.cs");
var content = File.ReadAllText(filePath);
var modified = content.Replace("Console.WriteLine", "Logger.Info");
File.WriteAllText(filePath, modified);