public static object? GenerateTemplateFiles()

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;
        }