refactor: collapse single-implementation interfaces
Nine interfaces had exactly one implementation and no test double — they existed only to be named twice in a DI registration: IFindingsStore, IFindingsStoreLocator, IPrimeScheduleSignal, IRefineRunner, IWeekReportService, IMergeCoordinator, IMissionControlPane, IOnlineLoginService, ITaskListFilter. Consumers now depend on the concrete type; the DTO records that shared those files moved next to their implementation. IInteractiveLaunchSpecService stays — it carries 54 lines of contract documentation, which is not ceremony. IMergeCoordinator in particular had a redundant null object: MergeCoordinator with a null Handler already no-ops, and every test used the real class with Handler set. Filtering/ collapses from 8 files to 1. ITaskListFilter and TaskListFilterBase were a double abstraction over four predicates, with MatchesAsContext => false declared in both. SmartFlagFilter also compiled its expression twice (its own _flag plus the inherited Matches cache) — it now uses the cache. StaticTokenAuthProvider was in src but production uses ZitadelAuthProvider; it is a test double, so it moves to the test project. Its own test goes away with it.
This commit is contained in:
@@ -67,7 +67,7 @@ builder.Services.AddDbContextFactory<ClaudeDoDbContext>(opt =>
|
||||
builder.Services.AddSingleton(cfg);
|
||||
builder.Services.AddSingleton<AttachmentStore>();
|
||||
// Singleton so the always-on and in-task MCP servers share the same index write lock.
|
||||
builder.Services.AddSingleton<IFindingsStore, FindingsStore>();
|
||||
builder.Services.AddSingleton<FindingsStore>();
|
||||
builder.Services.AddHostedService<StaleTaskRecovery>();
|
||||
builder.Services.AddHostedService<OrphanRecovery>();
|
||||
builder.Services.AddHostedService<AttachmentOrphanRecovery>();
|
||||
@@ -140,7 +140,7 @@ builder.Services.AddSingleton<OverrideSlotService>();
|
||||
builder.Services.AddSingleton<IClaudeHistoryReader>(_ =>
|
||||
new ClaudeHistoryReader(Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".claude", "projects")));
|
||||
builder.Services.AddSingleton<IWeekReportService, WeekReportService>();
|
||||
builder.Services.AddSingleton<WeekReportService>();
|
||||
|
||||
// Usage
|
||||
builder.Services.AddSingleton<ITranscriptUsageReader, TranscriptUsageReader>();
|
||||
@@ -154,14 +154,13 @@ builder.Services.AddSingleton<TokenTrackerService>();
|
||||
// Prime Claude
|
||||
builder.Services.AddSingleton<IPrimeClock, PrimeClock>();
|
||||
builder.Services.AddSingleton<PrimeScheduleSignal>();
|
||||
builder.Services.AddSingleton<IPrimeScheduleSignal>(sp => sp.GetRequiredService<PrimeScheduleSignal>());
|
||||
builder.Services.AddSingleton<IPrimeRunner, PrimeRunner>();
|
||||
builder.Services.AddSingleton(PrimeSchedulerOptions.Default);
|
||||
builder.Services.AddSingleton<IPrimeBroadcaster>(sp => sp.GetRequiredService<HubBroadcaster>());
|
||||
builder.Services.AddHostedService<PrimeScheduler>();
|
||||
|
||||
// Refine
|
||||
builder.Services.AddSingleton<IRefineRunner, RefineRunner>();
|
||||
builder.Services.AddSingleton<RefineRunner>();
|
||||
builder.Services.AddSingleton<IRefineBroadcaster>(sp => sp.GetRequiredService<HubBroadcaster>());
|
||||
|
||||
// "Continue on session limit reset" toggle — depends on UsageState, registered below.
|
||||
@@ -199,7 +198,7 @@ builder.Services.AddScoped<ClaudeDoDbContext>(sp =>
|
||||
builder.Services.AddScoped<TaskRepository>();
|
||||
builder.Services.AddScoped<ListRepository>();
|
||||
builder.Services.AddScoped<PlanningMcpService>();
|
||||
builder.Services.AddScoped<IFindingsStoreLocator, FindingsStoreLocator>();
|
||||
builder.Services.AddScoped<FindingsStoreLocator>();
|
||||
builder.Services.AddScoped<TaskRunFindingsMcpTools>();
|
||||
builder.Services.AddMcpServer()
|
||||
.WithHttpTransport()
|
||||
@@ -339,8 +338,8 @@ if (cfg.ExternalMcpPort > 0)
|
||||
externalBuilder.Services.AddSingleton(app.Services.GetRequiredService<AttachmentStore>());
|
||||
externalBuilder.Services.AddScoped<TaskAttachmentRepository>();
|
||||
externalBuilder.Services.AddScoped<AttachmentMcpTools>();
|
||||
externalBuilder.Services.AddSingleton<IFindingsStore>(app.Services.GetRequiredService<IFindingsStore>());
|
||||
externalBuilder.Services.AddScoped<IFindingsStoreLocator, FindingsStoreLocator>();
|
||||
externalBuilder.Services.AddSingleton(app.Services.GetRequiredService<FindingsStore>());
|
||||
externalBuilder.Services.AddScoped<FindingsStoreLocator>();
|
||||
externalBuilder.Services.AddScoped<FindingsMcpTools>();
|
||||
externalBuilder.Services.AddMcpServer()
|
||||
.WithHttpTransport()
|
||||
|
||||
Reference in New Issue
Block a user