Forge
csharp3407750f
1namespace AgentForge.Models;
2
3[Flags]
4public enum ForgeScope
5{
6 None = 0,
7 Read = 1 << 0,
8 Write = 1 << 1,
9 AcceptMerge = 1 << 2,
10}
11
12public static class ForgeScopeExtensions
13{
14 public static ForgeScope DefaultAgent => ForgeScope.Read | ForgeScope.Write | ForgeScope.AcceptMerge;
15
16 public static bool HasScope(this ForgeScope granted, ForgeScope required) =>
17 (granted & required) == required;
18
19 public static string ToStorage(this ForgeScope scopes) =>
20 string.Join(',', EnumerateSlugs(scopes));
21
22 public static ForgeScope ParseStorage(string? storage)
23 {
24 if (string.IsNullOrWhiteSpace(storage))
25 return DefaultAgent;
26
27 ForgeScope value = ForgeScope.None;
28 foreach (var part in storage.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
29 {
30 if (TryParseSlug(part, out var scope))
31 value |= scope;
32 }
33
34 return value == ForgeScope.None ? DefaultAgent : value;
35 }
36
37 public static bool TryParseSlug(string? slug, out ForgeScope scope)
38 {
39 switch (slug?.Trim().ToLowerInvariant())
40 {
41 case "read":
42 scope = ForgeScope.Read;
43 return true;
44 case "write":
45 scope = ForgeScope.Write;
46 return true;
47 case "accept_merge":
48 case "accept-merge":
49 scope = ForgeScope.AcceptMerge;
50 return true;
51 default:
52 scope = ForgeScope.None;
53 return false;
54 }
55 }
56
57 private static IEnumerable<string> EnumerateSlugs(ForgeScope scopes)
58 {
59 if (scopes.HasScope(ForgeScope.Read))
60 yield return "read";
61 if (scopes.HasScope(ForgeScope.Write))
62 yield return "write";
63 if (scopes.HasScope(ForgeScope.AcceptMerge))
64 yield return "accept_merge";
65 }
66}
67
View only · write via MCP/CIDE