Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions ClaudeCodeSharpSDK.Tests/Unit/ClaudeExecTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public class ClaudeExecTests
private const string HealthCheckInput = "Health check";
private const string HooksKey = "hooks";
private const string InputFormatFlag = "--input-format";
private const string NameFlag = "--name";
private const string SessionNameValue = "my-session";
private const string MaxBudgetFlag = "--max-budget-usd";
private const string MaxBudgetValue = "0.25";
private const string McpConfigFlag = "--mcp-config";
Expand Down Expand Up @@ -206,6 +208,33 @@ public async Task BuildCommandArgs_WithReservedAdditionalCliFlag_Throws()
await Assert.That(exception!.Message).Contains(ReservedOutputFormatFlag);
}

[Test]
public async Task BuildCommandArgs_WithSessionName_IncludesNameFlag()
{
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);

var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
{
Input = SummarizeInput,
SessionName = SessionNameValue,
});

await Assert.That(GetRequiredFlagValue(commandArgs, NameFlag)).IsEqualTo(SessionNameValue);
}

[Test]
public async Task BuildCommandArgs_WithoutSessionName_DoesNotIncludeNameFlag()
{
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);

var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
{
Input = SummarizeInput,
});

await Assert.That(FindFlagIndex(commandArgs, NameFlag)).IsEqualTo(-1);
}

private static JsonObject CreateBaseSettings()
{
return new JsonObject
Expand Down
7 changes: 7 additions & 0 deletions ClaudeCodeSharpSDK/Execution/ClaudeExec.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public sealed class ClaudeExec
private const string ContinueFlag = "--continue";
private const string ResumeFlag = "--resume";
private const string SessionIdFlag = "--session-id";
private const string NameFlag = "--name";
private const string ForkSessionFlag = "--fork-session";
private const string NoSessionPersistenceFlag = "--no-session-persistence";
private const string MaxBudgetUsdFlag = "--max-budget-usd";
Expand Down Expand Up @@ -227,6 +228,12 @@ internal IReadOnlyList<string> BuildCommandArgs(ClaudeExecArgs args)
commandArgs.Add(args.SessionId);
}

if (!string.IsNullOrWhiteSpace(args.SessionName))
{
commandArgs.Add(NameFlag);
commandArgs.Add(args.SessionName);
}

if (args.ForkSession)
{
commandArgs.Add(ForkSessionFlag);
Expand Down
2 changes: 2 additions & 0 deletions ClaudeCodeSharpSDK/Execution/ClaudeExecArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ public sealed record ClaudeExecArgs

public string? SessionId { get; init; }

public string? SessionName { get; init; }

public bool ForkSession { get; init; }

public bool NoSessionPersistence { get; init; }
Expand Down
6 changes: 6 additions & 0 deletions ClaudeCodeSharpSDK/Models/ClaudeModels.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ public static class ClaudeModels
private const string ClaudeHaiku35DisplayName = "Claude Haiku 3.5";
private const string ClaudeHaiku35SnapshotDisplayName = "Claude Haiku 3.5 (2024-10-22)";
private const string ClaudeHaiku3DisplayName = "Claude Haiku 3";
private const string ClaudeOpus46AliasDisplayName = "Claude Opus 4.6";
private const string ClaudeOpus45AliasDisplayName = "Claude Opus 4.5";
private const string ClaudeOpus45SnapshotDisplayName = "Claude Opus 4.5 (2025-11-01)";
private const string ClaudeOpus41AliasDisplayName = "Claude Opus 4.1";
private const string ClaudeOpus41SnapshotDisplayName = "Claude Opus 4.1 (2025-08-05)";
private const string ClaudeOpus40DisplayName = "Claude Opus 4";
private const string ClaudeSonnet46AliasDisplayName = "Claude Sonnet 4.6";
private const string ClaudeSonnet45DisplayName = "Claude Sonnet 4.5";
private const string ClaudeSonnet45SnapshotDisplayName = "Claude Sonnet 4.5 (2025-09-29)";
private const string ClaudeSonnet40DisplayName = "Claude Sonnet 4";
Expand All @@ -34,6 +36,8 @@ public static class ClaudeModels
public const string ClaudeSonnet45 = "claude-sonnet-4-5-20250929";
public const string ClaudeHaiku45Alias = "claude-haiku-4-5";
public const string ClaudeHaiku45 = "claude-haiku-4-5-20251001";
public const string ClaudeOpus46Alias = "claude-opus-4-6";
public const string ClaudeSonnet46Alias = "claude-sonnet-4-6";
public const string ClaudeOpus45Alias = "claude-opus-4-5";
public const string ClaudeOpus45 = "claude-opus-4-5-20251101";
public const string ClaudeOpus41Alias = "claude-opus-4-1";
Expand All @@ -56,6 +60,8 @@ public static class ClaudeModels
new(Sonnet, Sonnet, LatestSonnetDescription, true),
new(Opus, Opus, LatestOpusDescription, true),
new(Haiku, Haiku, LatestHaikuDescription, true),
new(ClaudeOpus46Alias, ClaudeOpus46AliasDisplayName, null, true),
new(ClaudeSonnet46Alias, ClaudeSonnet46AliasDisplayName, null, true),
new(ClaudeSonnet45Alias, ClaudeSonnet45DisplayName, null, true),
new(ClaudeSonnet45, ClaudeSonnet45SnapshotDisplayName, null, true),
new(ClaudeHaiku45Alias, ClaudeHaiku45DisplayName, null, true),
Expand Down