Forge
csharp3407750f
1using AgentForge.Plugin.Ci.Data;
2using AgentForge.Plugin.Ci.Ir;
3using AgentForge.Plugin.View;
4using Microsoft.Extensions.DependencyInjection;
5
6namespace AgentForge.Plugin.Ci.Pages;
7
8internal static class ForgeCiRepoTabPage
9{
10 internal static string RenderHome(string repoName, IServiceProvider services)
11 {
12 var store = services.GetRequiredService<ForgeCiDefinitionStore>();
13 var repository = services.GetRequiredService<AgentForge.Data.ForgeRepository>();
14 var repo = repository.GetRepoByName(repoName);
15 if (repo is null)
16 return ForgeHtml.P("meta", ForgeHtml.Text("Repository not found."));
17
18 var definitions = store.List(repo.Id);
19 var parts = new List<string>
20 {
21 ForgeHtml.H2("Pipelines"),
22 ForgeHtml.P(null, ForgeHtml.ARaw(
23 $"/view/repos/{ForgeRepoNames.ToUrlPath(repoName)}/ci/new",
24 ForgeHtml.Text("+ New pipeline"))),
25 };
26
27 if (definitions.Count == 0)
28 {
29 parts.Add(ForgeHtml.P("meta", ForgeHtml.Text("No pipelines yet. Create one to get started.")));
30 return ForgeHtml.Fragment([.. parts]);
31 }
32
33 var items = new List<string>(definitions.Count);
34 foreach (var definition in definitions)
35 {
36 var href = $"/view/repos/{ForgeRepoNames.ToUrlPath(repoName)}/ci/definitions/{Uri.EscapeDataString(definition.Name)}/designer";
37 items.Add(ForgeHtml.Li(null,
38 ForgeHtml.ARaw(href, ForgeHtml.Text(definition.Name)),
39 ForgeHtml.Text(" "),
40 ForgeHtml.Span("meta", ForgeHtml.Text($"updated {definition.UpdatedAt:u}"))));
41 }
42
43 parts.Add(ForgeHtml.Ul("plain", [.. items]));
44 return ForgeHtml.Fragment([.. parts]);
45 }
46
47 internal static string RenderCreateForm(string repoName, string? error = null)
48 {
49 var action = $"/view/repos/{ForgeRepoNames.ToUrlPath(repoName)}/ci/new";
50 var errorHtml = error is null
51 ? ""
52 : ForgeHtml.P("error", ForgeHtml.Text(error));
53 return ForgeHtml.Fragment(
54 ForgeHtml.H2("New pipeline"),
55 errorHtml,
56 ForgeHtml.Form(
57 "post",
58 action,
59 "field",
60 ForgeHtml.Label("name", "Pipeline name"),
61 ForgeHtml.Input(new ForgeInputSpec("name", Value: "default", Placeholder: "default", Required: true)),
62 ForgeHtml.FieldSubmit(null, ForgeHtml.Button("submit", "Create with default template"))),
63 ForgeHtml.P("meta", ForgeHtml.Text("Creates forge.ci/v1 IR with Build phase and dotnet restore/build/test tasks.")));
64 }
65}
66
View only · write via MCP/CIDE