diff --git a/src/ClaudeDo.Worker/Planning/PlanningSessionManager.cs b/src/ClaudeDo.Worker/Planning/PlanningSessionManager.cs index c312873..61de7c0 100644 --- a/src/ClaudeDo.Worker/Planning/PlanningSessionManager.cs +++ b/src/ClaudeDo.Worker/Planning/PlanningSessionManager.cs @@ -53,6 +53,9 @@ public sealed class PlanningSessionManager return new PlanningSessionStartContext(taskId, list.WorkingDir, files); } + public Task FinalizeAsync(string taskId, bool queueAgentTasks, CancellationToken ct) + => _tasks.FinalizePlanningAsync(taskId, queueAgentTasks, ct); + public async Task DiscardAsync(string taskId, CancellationToken ct) { var ok = await _tasks.DiscardPlanningAsync(taskId, ct); diff --git a/tests/ClaudeDo.Worker.Tests/Planning/PlanningSessionManagerTests.cs b/tests/ClaudeDo.Worker.Tests/Planning/PlanningSessionManagerTests.cs index daf1712..6d6e4bc 100644 --- a/tests/ClaudeDo.Worker.Tests/Planning/PlanningSessionManagerTests.cs +++ b/tests/ClaudeDo.Worker.Tests/Planning/PlanningSessionManagerTests.cs @@ -160,6 +160,22 @@ public sealed class PlanningSessionManagerTests : IDisposable _sut.ResumeAsync(parent.Id, CancellationToken.None)); } + [Fact] + public async Task FinalizeAsync_PromotesDraftsAndMarksPlanned() + { + var (listId, _) = await SeedListAsync(); + var parent = await SeedManualTaskAsync(listId); + await _sut.StartAsync(parent.Id, CancellationToken.None); + await _tasks.CreateChildAsync(parent.Id, "c1", null, null, null); + await _tasks.CreateChildAsync(parent.Id, "c2", null, null, null); + + var count = await _sut.FinalizeAsync(parent.Id, queueAgentTasks: true, CancellationToken.None); + + Assert.Equal(2, count); + var loaded = await _tasks.GetByIdAsync(parent.Id); + Assert.Equal(TaskStatus.Planned, loaded!.Status); + } + [Fact] public async Task DiscardAsync_DeletesSessionDirAndResetsTask() {