Forge
csharp3407750f
1using AgentForge.Plugin.Ci.Data;
2using AgentForge.Plugin.Ci.Ir;
3using AgentForge.Plugin.View;
4
5namespace AgentForge.Plugin.Ci.Pages;
6
7internal static class ForgeCiDesignerPage
8{
9 internal static string Render(
10 string repoName,
11 ForgeCiDefinitionRecord record,
12 ForgeCiDocument document,
13 string? error = null)
14 {
15 var parts = new List<string>
16 {
17 ForgeHtml.H2($"Pipeline: {record.Name}"),
18 ForgeHtml.P("meta", ForgeHtml.Text($"schema {document.Schema} · {document.Triggers.Count} trigger(s)")),
19 };
20
21 if (error is not null)
22 parts.Add(ForgeHtml.P("error", ForgeHtml.Text(error)));
23
24 parts.Add(ForgeHtml.H2("Phases & tasks", "subheading"));
25 var phases = ForgeCiDocumentEditor.ListPhaseTasks(document);
26 if (phases.Count == 0)
27 {
28 parts.Add(ForgeHtml.P("meta", ForgeHtml.Text("No phases in this definition.")));
29 }
30 else
31 {
32 foreach (var (phase, tasks) in phases)
33 {
34 parts.Add(ForgeHtml.H2(phase.Name ?? phase.Id, "subheading"));
35 if (tasks.Count == 0)
36 {
37 parts.Add(ForgeHtml.P("meta", ForgeHtml.Text("No tasks yet.")));
38 continue;
39 }
40
41 var taskItems = tasks.Select(t =>
42 ForgeHtml.Li(null,
43 ForgeHtml.Code(t.Task ?? "?"),
44 ForgeHtml.Text(" "),
45 ForgeHtml.Span("meta", ForgeHtml.Text(t.Id)))).ToArray();
46 parts.Add(ForgeHtml.Ul("plain", taskItems));
47 }
48 }
49
50 parts.Add(ForgeHtml.H2("Add task", "subheading"));
51 var action = $"/view/repos/{ForgeRepoNames.ToUrlPath(repoName)}/ci/definitions/{Uri.EscapeDataString(record.Name)}/add-task";
52 var options = ForgeCiTaskCatalog.All
53 .Select(t => ForgeHtml.Option(t.Id, $"{t.DisplayName} ({t.Id})", selected: false))
54 .ToArray();
55 parts.Add(ForgeHtml.Form(
56 "post",
57 action,
58 "field",
59 ForgeHtml.Label("taskId", "Task"),
60 ForgeHtml.Select("taskId", required: true, options),
61 ForgeHtml.FieldSubmit(null, ForgeHtml.Button("submit", "Add to pipeline"))));
62
63 parts.Add(ForgeHtml.H2("IR (JSON)", "subheading"));
64 parts.Add(ForgeHtml.P(null, ForgeHtml.Code(document.ToJson())));
65
66 return ForgeHtml.Fragment([.. parts]);
67 }
68}
69
View only · write via MCP/CIDE