Files
ClaudeDo/src/ClaudeDo.Worker/Runner/ClaudeArgsBuilder.cs
T

99 lines
2.6 KiB
C#

using System.Text.Json;
namespace ClaudeDo.Worker.Runner;
public sealed record ClaudeRunConfig(
string? Model,
string? SystemPrompt,
string? AgentPath,
string? ResumeSessionId,
int? MaxTurns = null,
string? PermissionMode = null,
string? McpConfigPath = null,
string? AllowedTools = null,
IReadOnlyList<string>? SkillNames = null
)
{
public IReadOnlyList<string> SkillNames { get; init; } = SkillNames ?? Array.Empty<string>();
}
public sealed class ClaudeArgsBuilder
{
private static readonly string ResultSchema = JsonSerializer.Serialize(new
{
type = "object",
properties = new
{
summary = new { type = "string" },
files_changed = new { type = "array", items = new { type = "string" } },
commit_type = new { type = "string" },
},
required = new[] { "summary" },
});
public IReadOnlyList<string> Build(ClaudeRunConfig config)
{
var args = new List<string>
{
"-p",
"--output-format", "stream-json",
"--verbose",
};
var permissionMode = string.IsNullOrWhiteSpace(config.PermissionMode)
|| config.PermissionMode.Equals("bypassPermissions", StringComparison.OrdinalIgnoreCase)
? "auto"
: config.PermissionMode;
args.Add("--permission-mode");
args.Add(permissionMode);
if (config.Model is not null)
{
args.Add("--model");
args.Add(config.Model);
}
if (config.MaxTurns is int turns && turns > 0)
{
args.Add("--max-turns");
args.Add(turns.ToString());
}
if (config.SystemPrompt is not null)
{
args.Add("--append-system-prompt");
args.Add(config.SystemPrompt);
}
if (config.AgentPath is not null)
{
var agentJson = JsonSerializer.Serialize(new[] { new { file = config.AgentPath } });
args.Add("--agents");
args.Add(agentJson);
}
args.Add("--json-schema");
args.Add(ResultSchema);
if (config.McpConfigPath is not null)
{
args.Add("--mcp-config");
args.Add(config.McpConfigPath);
}
if (config.AllowedTools is not null)
{
args.Add("--allowedTools");
args.Add(config.AllowedTools);
}
if (config.ResumeSessionId is not null)
{
args.Add("--resume");
args.Add(config.ResumeSessionId);
}
return args;
}
}