feat(mcp/external): AddTask accepts tags on creation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -87,13 +87,14 @@ public sealed class ExternalMcpService
|
|||||||
return ToDto(task);
|
return ToDto(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
[McpServerTool, Description("Create a new task in the given list. Set queueImmediately=true to enqueue it for agent execution.")]
|
[McpServerTool, Description("Create a new task in the given list. Set queueImmediately=true to enqueue it for agent execution. Optional tags are attached on creation; missing tag names auto-create.")]
|
||||||
public async Task<TaskDto> AddTask(
|
public async Task<TaskDto> AddTask(
|
||||||
string listId,
|
string listId,
|
||||||
string title,
|
string title,
|
||||||
string? description,
|
string? description,
|
||||||
string createdBy,
|
string createdBy,
|
||||||
bool queueImmediately,
|
bool queueImmediately,
|
||||||
|
IReadOnlyList<string>? tags,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(listId))
|
if (string.IsNullOrWhiteSpace(listId))
|
||||||
@@ -119,6 +120,9 @@ public sealed class ExternalMcpService
|
|||||||
};
|
};
|
||||||
await _tasks.AddAsync(entity, cancellationToken);
|
await _tasks.AddAsync(entity, cancellationToken);
|
||||||
|
|
||||||
|
if (tags is not null && tags.Count > 0)
|
||||||
|
await _tasks.SetTagsAsync(entity.Id, tags, cancellationToken);
|
||||||
|
|
||||||
if (queueImmediately)
|
if (queueImmediately)
|
||||||
_queue.WakeQueue();
|
_queue.WakeQueue();
|
||||||
|
|
||||||
|
|||||||
@@ -140,4 +140,36 @@ public sealed class ExternalMcpServiceTests : IDisposable
|
|||||||
Assert.Contains(tags, t => t.Name == "agent");
|
Assert.Contains(tags, t => t.Name == "agent");
|
||||||
Assert.Contains(tags, t => t.Name == "custom-tag");
|
Assert.Contains(tags, t => t.Name == "custom-tag");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task AddTask_WithTags_AttachesTags()
|
||||||
|
{
|
||||||
|
var listId = await SeedListAsync();
|
||||||
|
var queue = CreateQueue();
|
||||||
|
var sut = BuildSut(queue);
|
||||||
|
|
||||||
|
var dto = await sut.AddTask(
|
||||||
|
listId, "scope-creep handoff", "desc", "claude-cli",
|
||||||
|
queueImmediately: false,
|
||||||
|
tags: new[] { "agent", "custom" },
|
||||||
|
CancellationToken.None);
|
||||||
|
|
||||||
|
var tags = await _tasks.GetTagsAsync(dto.Id);
|
||||||
|
Assert.Contains(tags, t => t.Name == "agent");
|
||||||
|
Assert.Contains(tags, t => t.Name == "custom");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task AddTask_NullTags_BehavesAsBefore()
|
||||||
|
{
|
||||||
|
var listId = await SeedListAsync();
|
||||||
|
var queue = CreateQueue();
|
||||||
|
var sut = BuildSut(queue);
|
||||||
|
|
||||||
|
var dto = await sut.AddTask(
|
||||||
|
listId, "no tags", null, "claude-cli",
|
||||||
|
queueImmediately: false, tags: null, CancellationToken.None);
|
||||||
|
|
||||||
|
Assert.Empty(await _tasks.GetTagsAsync(dto.Id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user