fix(mcp): register ticket import tools in the external MCP container
The external MCP server has its own DI container; TicketMcpTools could not resolve TicketImportService there, so both tools failed at runtime. Also surface a skipped import in the prime outcome and treat a sweep where every project board fails as an error instead of an empty backlog.
This commit is contained in:
@@ -63,7 +63,11 @@ public sealed class PrimeRunner : IPrimeRunner
|
||||
private Task<PrimeRunOutcome> RunImportTicketsAsync(PrimeScheduleDto schedule, CancellationToken ct)
|
||||
{
|
||||
if (!_tickets.IsConfigured)
|
||||
return RunPrepAsync("Daily prep", log => FillMyDayStepAsync(schedule, log, ct));
|
||||
return RunPrepAsync("Daily prep", async log =>
|
||||
{
|
||||
var day = await FillMyDayStepAsync(schedule, log, ct);
|
||||
return day with { Message = $"Ticket system not configured, import skipped; {day.Message}" };
|
||||
});
|
||||
|
||||
return RunPrepAsync("Ticket import", async log =>
|
||||
{
|
||||
|
||||
@@ -367,6 +367,7 @@ if (cfg.ExternalMcpPort > 0)
|
||||
Share<FindingsStore>();
|
||||
Share<HandoffRoundTracker>();
|
||||
Share<HandlerUsageGuard>();
|
||||
Share<TicketImportService>();
|
||||
|
||||
externalBuilder.Services.AddScoped<ClaudeDoDbContext>(sp =>
|
||||
sp.GetRequiredService<IDbContextFactory<ClaudeDoDbContext>>().CreateDbContext());
|
||||
@@ -395,6 +396,7 @@ if (cfg.ExternalMcpPort > 0)
|
||||
externalBuilder.Services.AddScoped<DailyNoteRepository>();
|
||||
externalBuilder.Services.AddScoped<FindingsMcpTools>();
|
||||
externalBuilder.Services.AddScoped<NotesMcpTools>();
|
||||
externalBuilder.Services.AddScoped<TicketMcpTools>();
|
||||
externalBuilder.Services.AddMcpServer()
|
||||
.WithHttpTransport(o => o.Stateless = true)
|
||||
.WithRequestFilters(f => f
|
||||
|
||||
@@ -200,6 +200,8 @@ public sealed class TicketImportService
|
||||
var identity = await client.GetIdentityAsync(ct);
|
||||
var projects = await client.GetProjectsAsync(ct);
|
||||
var items = new List<TicketCandidate>();
|
||||
string? lastFailure = null;
|
||||
var failed = 0;
|
||||
|
||||
foreach (var project in projects)
|
||||
{
|
||||
@@ -212,6 +214,8 @@ public sealed class TicketImportService
|
||||
{
|
||||
// Ein unlesbares Board darf den Sweep über die übrigen Projekte nicht abbrechen.
|
||||
_logger.LogWarning("Board von Projekt {project_id} übersprungen: {reason}", project.Id, ex.Message);
|
||||
lastFailure = ex.Message;
|
||||
failed++;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -233,6 +237,10 @@ public sealed class TicketImportService
|
||||
}
|
||||
}
|
||||
|
||||
// Scheitern ALLE Boards (z.B. Scope fehlt), ist das ein Fehler — kein leerer Backlog.
|
||||
if (projects.Count > 0 && failed == projects.Count)
|
||||
throw new TicketApiException($"Kein Projekt-Board lesbar: {lastFailure}");
|
||||
|
||||
return (items.DistinctBy(i => i.Id).ToList(), projects);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user