diff --git a/src/ClaudeDo.Worker/External/BatchMcpTools.cs b/src/ClaudeDo.Worker/External/BatchMcpTools.cs index 5bb0c16c..766c6724 100644 --- a/src/ClaudeDo.Worker/External/BatchMcpTools.cs +++ b/src/ClaudeDo.Worker/External/BatchMcpTools.cs @@ -79,7 +79,7 @@ public sealed class BatchMcpTools private static readonly string[] KnownDetailFields = { - "listId", "title", "description", "status", "result", "createdBy", "createdAt", + "id", "number", "listId", "title", "description", "status", "result", "createdBy", "createdAt", "startedAt", "finishedAt", "isMyDay", "sortOrder", "roadblockCount", "roadblockText", "failureReason", }; diff --git a/tests/ClaudeDo.Worker.Tests/External/BatchMcpToolsTests.cs b/tests/ClaudeDo.Worker.Tests/External/BatchMcpToolsTests.cs index 5d6a680d..2657c01d 100644 --- a/tests/ClaudeDo.Worker.Tests/External/BatchMcpToolsTests.cs +++ b/tests/ClaudeDo.Worker.Tests/External/BatchMcpToolsTests.cs @@ -324,6 +324,26 @@ public sealed class BatchMcpToolsTests : IDisposable Assert.Contains("notAField", ex.Message); } + [Fact] + public async Task BatchGetTasks_NumberAndIdFields_AcceptedAndReturned() + { + var listId = await SeedListAsync(); + var task = await SeedTaskAsync(listId); + task.Description = "full description not requested"; + await _tasks.UpdateAsync(task); + var sut = BuildSut(); + + var results = await sut.BatchGetTasks( + new[] { task.Id }, includeDescription: true, fields: new[] { "number", "title" }, + cancellationToken: CancellationToken.None); + + var found = results.Single(r => r.Id == task.Id).TaskFull!; + Assert.Equal(task.Number, found.Number); + Assert.Equal(task.Id, found.Id); + Assert.Equal(task.Title, found.Title); + Assert.Null(found.Description); // Not requested + } + [Fact] public async Task BatchGetTasks_RoadblockTextField_ExtractsTailOfResult_WithoutFullResult() {