Forge
csharp3407750f
1using AgentForge.Plugin.Ci.Ir;
2
3namespace AgentForge.Plugin.Ci.Ir;
4
5public static class ForgeCiDocumentEditor
6{
7 public static ForgeCiDocument AddTask(
8 ForgeCiDocument document,
9 string taskId,
10 string? phaseId = null)
11 {
12 if (!ForgeCiTaskCatalog.IsKnown(taskId))
13 throw new ForgeCiValidationException($"unknown task '{taskId}'.");
14
15 phaseId ??= document.Nodes.FirstOrDefault(n => n.Kind == "phase")?.Id
16 ?? throw new ForgeCiValidationException("no phase container found; create a phase first.");
17
18 var phase = document.Nodes.FirstOrDefault(n => n.Id == phaseId && n.Kind == "phase")
19 ?? throw new ForgeCiValidationException($"phase '{phaseId}' not found.");
20
21 var slug = taskId.Replace(".", "-", StringComparison.Ordinal);
22 var nodeId = slug;
23 var suffix = 2;
24 var ids = document.Nodes.Select(n => n.Id).ToHashSet(StringComparer.Ordinal);
25 while (ids.Contains(nodeId))
26 {
27 nodeId = $"{slug}-{suffix}";
28 suffix++;
29 }
30
31 var lastTask = document.Edges
32 .Where(e => e.Kind == "contains" && e.From == phase.Id && document.Nodes.Any(n => n.Id == e.To && n.Kind == "task"))
33 .Select(e => e.To)
34 .LastOrDefault();
35
36 document.Nodes.Add(new ForgeCiNode
37 {
38 Id = nodeId,
39 Kind = "task",
40 Task = taskId,
41 Inputs = new Dictionary<string, string>(StringComparer.Ordinal),
42 });
43 document.Edges.Add(new ForgeCiEdge { Kind = "contains", From = phase.Id, To = nodeId });
44
45 if (lastTask is not null)
46 document.Edges.Add(new ForgeCiEdge { Kind = "dependsOn", From = lastTask, To = nodeId });
47
48 return document;
49 }
50
51 public static IReadOnlyList<(ForgeCiNode Phase, IReadOnlyList<ForgeCiNode> Tasks)> ListPhaseTasks(ForgeCiDocument document)
52 {
53 var result = new List<(ForgeCiNode, IReadOnlyList<ForgeCiNode>)>();
54 foreach (var phase in document.Nodes.Where(n => n.Kind == "phase"))
55 {
56 var taskIds = document.Edges
57 .Where(e => e.Kind == "contains" && e.From == phase.Id)
58 .Select(e => e.To)
59 .ToHashSet(StringComparer.Ordinal);
60 var tasks = document.Nodes.Where(n => n.Kind == "task" && taskIds.Contains(n.Id)).ToList();
61 result.Add((phase, tasks));
62 }
63
64 return result;
65 }
66}
67
View only · write via MCP/CIDE