in src/extensions/template_extension/TemplateFactory.cs [68:157]
public static object? GenerateTemplateFiles(string templateName, string language, string instructions, string outputDirectory, INamedValues values)
{
var list = new DevNewTemplateGroupList();
var filterApplied = list.ApplyFilter(templateName, null, null)
|| list.ApplyFilter(null, templateName, null);
if (!filterApplied) return null;
var groupFound = list.Groups.FirstOrDefault();
if (groupFound == null) return null;
var templateFound = !string.IsNullOrEmpty(language)
? groupFound.Items.Where(x => x.Language == language).FirstOrDefault()
: groupFound.Items.Count != 1
? groupFound.Items.Where(x => x.Language == string.Empty).FirstOrDefault()
: groupFound.Items.FirstOrDefault();
if (templateFound == null) return groupFound;
var normalizedTemplateName = templateFound.UniqueName.Replace('-', '_');
var files = FileHelpers.FindFilesInTemplatePath($"{normalizedTemplateName}/*", null).ToList();
files.Sort();
files.RemoveAll(x => x.EndsWith("_.json"));
if (files.Count() == 0) return null;
var parameters = new Dictionary<string, string>(templateFound.Parameters);
parameters["AICLIExtensionReferencePath"] = FileHelpers.GetAssemblyFileInfo(typeof(TemplateFactory)).DirectoryName!;
outputDirectory = PathHelpers.NormalizePath(outputDirectory);
var message = templateName != outputDirectory
? $"Generating '{templateName}' in '{outputDirectory}' ({files.Count()} files)..."
: $"Generating '{templateName}' ({files.Count()} files)...";
var quiet = values.GetOrDefault("quiet", false);
if (!quiet) Console.WriteLine($"{message}\n");
var addendum = string.Empty;
var addendumFileName = "DEV-NEW-DID-YOU-KNOW.md";
var generated = ProcessTemplates(normalizedTemplateName, files, parameters, outputDirectory, values);
foreach (var item in generated)
{
if (item.EndsWith(addendumFileName))
{
addendum = FileHelpers.ReadAllText(item, new UTF8Encoding(false));
File.Delete(item);
continue;
}
var file = item.Replace(outputDirectory, string.Empty).Trim('\\', '/');
if (!quiet) Console.WriteLine($" {file}");
}
if (!quiet)
{
Console.WriteLine();
Console.WriteLine($"\r{message} DONE!\n");
}
var instructionsOk = !string.IsNullOrEmpty(instructions);
var promptsOk = File.Exists($"{outputDirectory}/.ai/system.md") && File.Exists($"{outputDirectory}/.ai/prompt.md");
if (instructionsOk && promptsOk)
{
var saved = Directory.GetCurrentDirectory();
Directory.SetCurrentDirectory(outputDirectory);
Console.WriteLine("Applying instructions...\n");
var exitCode = Program.RunInternal("chat",
"--quiet", "true",
"--built-in-functions", "true",
"--index", "@none",
"--system", "@system.md",
"--user", "@prompt.md",
"--var", "instructions", instructions
);
Directory.SetCurrentDirectory(saved);
if (exitCode != 0)
{
Console.WriteLine($"ERROR: chat failed with exit code {exitCode}");
return false;
}
}
if (!quiet && !string.IsNullOrEmpty(addendum))
{
ConsoleHelpers.WriteLineWithHighlight(addendum);
}
return true;
}