diff --git a/src/ClaudeDo.Data/Repositories/TaskRepository.cs b/src/ClaudeDo.Data/Repositories/TaskRepository.cs index 96fee59..3fd2ad2 100644 --- a/src/ClaudeDo.Data/Repositories/TaskRepository.cs +++ b/src/ClaudeDo.Data/Repositories/TaskRepository.cs @@ -282,6 +282,17 @@ public sealed class TaskRepository return await _context.Tasks.AsNoTracking().FirstOrDefaultAsync(t => t.Id == taskId, ct); } + public async Task UpdatePlanningSessionIdAsync( + string parentId, + string sessionId, + CancellationToken ct = default) + { + await _context.Tasks + .Where(t => t.Id == parentId) + .ExecuteUpdateAsync(s => s + .SetProperty(t => t.PlanningSessionId, sessionId), ct); + } + #endregion #region Queue selection diff --git a/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryPlanningTests.cs b/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryPlanningTests.cs index e47b09c..3ba9c2a 100644 --- a/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryPlanningTests.cs +++ b/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryPlanningTests.cs @@ -152,4 +152,18 @@ public sealed class TaskRepositoryPlanningTests : IDisposable Assert.Equal(TaskStatus.Queued, loaded!.Status); Assert.Null(loaded.PlanningSessionToken); } + + [Fact] + public async Task UpdatePlanningSessionIdAsync_StoresClaudeSessionId() + { + var listId = await CreateListAsync(); + var task = MakeTask(listId, TaskStatus.Manual); + await _tasks.AddAsync(task); + await _tasks.SetPlanningStartedAsync(task.Id, "tok"); + + await _tasks.UpdatePlanningSessionIdAsync(task.Id, "claude-session-42"); + + var loaded = await _tasks.GetByIdAsync(task.Id); + Assert.Equal("claude-session-42", loaded!.PlanningSessionId); + } }