test(ui): rebase IWorkerClient fakes onto shared StubWorkerClient base
Add a StubWorkerClient base implementing the full IWorkerClient surface so the planning/conflict/diff test fakes only override the members they exercise. Eliminates the constructor-drift duplication across the three fakes. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
61
tests/ClaudeDo.Ui.Tests/StubWorkerClient.cs
Normal file
61
tests/ClaudeDo.Ui.Tests/StubWorkerClient.cs
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using ClaudeDo.Data.Models;
|
||||||
|
using ClaudeDo.Data.Repositories;
|
||||||
|
using ClaudeDo.Ui.Services;
|
||||||
|
using TaskStatus = ClaudeDo.Data.Models.TaskStatus;
|
||||||
|
|
||||||
|
namespace ClaudeDo.Ui.Tests;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// No-op <see cref="IWorkerClient"/> base for tests. Override only the members a
|
||||||
|
/// test actually exercises; everything else returns a benign default. Keeping the
|
||||||
|
/// full interface surface here means new interface members only break this file.
|
||||||
|
/// </summary>
|
||||||
|
public abstract class StubWorkerClient : IWorkerClient
|
||||||
|
{
|
||||||
|
#pragma warning disable CS0067 // interface-mandated events; tests don't raise them
|
||||||
|
public event PropertyChangedEventHandler? PropertyChanged;
|
||||||
|
public event Action<string, string, DateTime>? TaskStartedEvent;
|
||||||
|
public event Action<string, string, string, DateTime>? TaskFinishedEvent;
|
||||||
|
public event Action<string>? TaskUpdatedEvent;
|
||||||
|
public event Action? ConnectionRestoredEvent;
|
||||||
|
public event Action<string>? WorktreeUpdatedEvent;
|
||||||
|
public event Action<string>? ListUpdatedEvent;
|
||||||
|
public event Action<string, string>? TaskMessageEvent;
|
||||||
|
public event Action<string, string>? PlanningMergeStartedEvent;
|
||||||
|
public event Action<string, string>? PlanningSubtaskMergedEvent;
|
||||||
|
public event Action<string, string, IReadOnlyList<string>>? PlanningMergeConflictEvent;
|
||||||
|
public event Action<string>? PlanningMergeAbortedEvent;
|
||||||
|
public event Action<string>? PlanningCompletedEvent;
|
||||||
|
#pragma warning restore CS0067
|
||||||
|
|
||||||
|
public virtual bool IsConnected => false;
|
||||||
|
|
||||||
|
public virtual Task WakeQueueAsync() => Task.CompletedTask;
|
||||||
|
public virtual Task RunNowAsync(string taskId) => Task.CompletedTask;
|
||||||
|
public virtual Task ContinueTaskAsync(string taskId, string followUpPrompt) => Task.CompletedTask;
|
||||||
|
public virtual Task ResetTaskAsync(string taskId) => Task.CompletedTask;
|
||||||
|
public virtual Task CancelTaskAsync(string taskId) => Task.CompletedTask;
|
||||||
|
public virtual Task<List<AgentInfo>> GetAgentsAsync() => Task.FromResult(new List<AgentInfo>());
|
||||||
|
public virtual Task<ListConfigDto?> GetListConfigAsync(string listId) => Task.FromResult<ListConfigDto?>(null);
|
||||||
|
public virtual Task UpdateTaskAgentSettingsAsync(UpdateTaskAgentSettingsDto dto) => Task.CompletedTask;
|
||||||
|
public virtual Task SetTaskStatusAsync(string taskId, TaskStatus status) => Task.CompletedTask;
|
||||||
|
public virtual Task StartPlanningSessionAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
||||||
|
public virtual Task OpenInteractiveTerminalAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
||||||
|
public virtual Task ResumePlanningSessionAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
||||||
|
public virtual Task<DiscardPlanningOutcome> DiscardPlanningSessionAsync(string taskId, bool dequeueQueuedChildren = false, CancellationToken ct = default)
|
||||||
|
=> Task.FromResult(new DiscardPlanningOutcome(DiscardPlanningResult.Discarded, 0, 0));
|
||||||
|
public virtual Task FinalizePlanningSessionAsync(string taskId, bool queueAgentTasks = true, CancellationToken ct = default) => Task.CompletedTask;
|
||||||
|
public virtual Task<int> GetPendingDraftCountAsync(string taskId, CancellationToken ct = default) => Task.FromResult(0);
|
||||||
|
public virtual Task<MergeTargetsDto?> GetMergeTargetsAsync(string taskId) => Task.FromResult<MergeTargetsDto?>(null);
|
||||||
|
public virtual Task<IReadOnlyList<SubtaskDiffDto>> GetPlanningAggregateAsync(string planningTaskId)
|
||||||
|
=> Task.FromResult<IReadOnlyList<SubtaskDiffDto>>(Array.Empty<SubtaskDiffDto>());
|
||||||
|
public virtual Task<CombinedDiffResultDto?> BuildPlanningIntegrationBranchAsync(string planningTaskId, string targetBranch)
|
||||||
|
=> Task.FromResult<CombinedDiffResultDto?>(null);
|
||||||
|
public virtual Task MergeAllPlanningAsync(string planningTaskId, string targetBranch) => Task.CompletedTask;
|
||||||
|
public virtual Task ContinuePlanningMergeAsync(string planningTaskId) => Task.CompletedTask;
|
||||||
|
public virtual Task AbortPlanningMergeAsync(string planningTaskId) => Task.CompletedTask;
|
||||||
|
public virtual Task QueuePlanningSubtasksAsync(string parentTaskId, CancellationToken ct = default) => Task.CompletedTask;
|
||||||
|
|
||||||
|
protected void RaisePropertyChanged(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
||||||
|
}
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
using System.ComponentModel;
|
|
||||||
using ClaudeDo.Data.Models;
|
using ClaudeDo.Data.Models;
|
||||||
using ClaudeDo.Ui.Services;
|
using ClaudeDo.Ui.Services;
|
||||||
using ClaudeDo.Ui.ViewModels.Planning;
|
using ClaudeDo.Ui.ViewModels.Planning;
|
||||||
@@ -8,63 +7,21 @@ namespace ClaudeDo.Ui.Tests.ViewModels;
|
|||||||
public class ConflictResolutionViewModelTests
|
public class ConflictResolutionViewModelTests
|
||||||
{
|
{
|
||||||
// ------------------------------------------------------------------ fake
|
// ------------------------------------------------------------------ fake
|
||||||
private sealed class FakeWorker : IWorkerClient
|
private sealed class FakeWorker : StubWorkerClient
|
||||||
{
|
{
|
||||||
public bool IsConnected => false;
|
|
||||||
|
|
||||||
public string? ContinueCalledWith { get; private set; }
|
public string? ContinueCalledWith { get; private set; }
|
||||||
public string? AbortCalledWith { get; private set; }
|
public string? AbortCalledWith { get; private set; }
|
||||||
public Exception? ContinueThrows { get; set; }
|
public Exception? ContinueThrows { get; set; }
|
||||||
public Exception? AbortThrows { get; set; }
|
public Exception? AbortThrows { get; set; }
|
||||||
|
|
||||||
public event PropertyChangedEventHandler? PropertyChanged;
|
public override Task ContinuePlanningMergeAsync(string planningTaskId)
|
||||||
public event Action<string, string, DateTime>? TaskStartedEvent;
|
|
||||||
public event Action<string, string, string, DateTime>? TaskFinishedEvent;
|
|
||||||
public event Action<string>? TaskUpdatedEvent;
|
|
||||||
public event Action? ConnectionRestoredEvent;
|
|
||||||
public event Action<string>? WorktreeUpdatedEvent;
|
|
||||||
public event Action<string>? ListUpdatedEvent;
|
|
||||||
public event Action<string, string>? TaskMessageEvent;
|
|
||||||
public event Action<string, string>? PlanningMergeStartedEvent;
|
|
||||||
public event Action<string, string>? PlanningSubtaskMergedEvent;
|
|
||||||
public event Action<string, string, IReadOnlyList<string>>? PlanningMergeConflictEvent;
|
|
||||||
public event Action<string>? PlanningMergeAbortedEvent;
|
|
||||||
public event Action<string>? PlanningCompletedEvent;
|
|
||||||
|
|
||||||
public Task WakeQueueAsync() => Task.CompletedTask;
|
|
||||||
public Task RunNowAsync(string taskId) => Task.CompletedTask;
|
|
||||||
public Task ContinueTaskAsync(string taskId, string followUpPrompt) => Task.CompletedTask;
|
|
||||||
public Task ResetTaskAsync(string taskId) => Task.CompletedTask;
|
|
||||||
public Task CancelTaskAsync(string taskId) => Task.CompletedTask;
|
|
||||||
public Task<List<AgentInfo>> GetAgentsAsync() => Task.FromResult(new List<AgentInfo>());
|
|
||||||
public Task<ListConfigDto?> GetListConfigAsync(string listId) => Task.FromResult<ListConfigDto?>(null);
|
|
||||||
public Task UpdateTaskAgentSettingsAsync(UpdateTaskAgentSettingsDto dto) => Task.CompletedTask;
|
|
||||||
public Task SetTaskStatusAsync(string taskId, ClaudeDo.Data.Models.TaskStatus status) => Task.CompletedTask;
|
|
||||||
public Task SetTaskTagsAsync(string taskId, IEnumerable<string> tagNames) => Task.CompletedTask;
|
|
||||||
public Task<List<string>> GetAllTagsAsync() => Task.FromResult(new List<string>());
|
|
||||||
public Task StartPlanningSessionAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task ResumePlanningSessionAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task<ClaudeDo.Data.Repositories.DiscardPlanningOutcome> DiscardPlanningSessionAsync(string taskId, bool dequeueQueuedChildren = false, CancellationToken ct = default)
|
|
||||||
=> Task.FromResult(new ClaudeDo.Data.Repositories.DiscardPlanningOutcome(ClaudeDo.Data.Repositories.DiscardPlanningResult.Discarded, 0, 0));
|
|
||||||
public Task FinalizePlanningSessionAsync(string taskId, bool queueAgentTasks = true, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task<int> GetPendingDraftCountAsync(string taskId, CancellationToken ct = default) => Task.FromResult(0);
|
|
||||||
public Task<MergeTargetsDto?> GetMergeTargetsAsync(string taskId) => Task.FromResult<MergeTargetsDto?>(null);
|
|
||||||
public Task<IReadOnlyList<SubtaskDiffDto>> GetPlanningAggregateAsync(string planningTaskId) =>
|
|
||||||
Task.FromResult<IReadOnlyList<SubtaskDiffDto>>(Array.Empty<SubtaskDiffDto>());
|
|
||||||
public Task<CombinedDiffResultDto?> BuildPlanningIntegrationBranchAsync(string planningTaskId, string targetBranch) =>
|
|
||||||
Task.FromResult<CombinedDiffResultDto?>(null);
|
|
||||||
public Task MergeAllPlanningAsync(string planningTaskId, string targetBranch) => Task.CompletedTask;
|
|
||||||
public Task OpenInteractiveTerminalAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task QueuePlanningSubtasksAsync(string parentTaskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
|
|
||||||
public Task ContinuePlanningMergeAsync(string planningTaskId)
|
|
||||||
{
|
{
|
||||||
ContinueCalledWith = planningTaskId;
|
ContinueCalledWith = planningTaskId;
|
||||||
if (ContinueThrows is not null) throw ContinueThrows;
|
if (ContinueThrows is not null) throw ContinueThrows;
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task AbortPlanningMergeAsync(string planningTaskId)
|
public override Task AbortPlanningMergeAsync(string planningTaskId)
|
||||||
{
|
{
|
||||||
AbortCalledWith = planningTaskId;
|
AbortCalledWith = planningTaskId;
|
||||||
if (AbortThrows is not null) throw AbortThrows;
|
if (AbortThrows is not null) throw AbortThrows;
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.ComponentModel;
|
|
||||||
using ClaudeDo.Data;
|
using ClaudeDo.Data;
|
||||||
using ClaudeDo.Data.Models;
|
using ClaudeDo.Data.Models;
|
||||||
using ClaudeDo.Ui.Services;
|
using ClaudeDo.Ui.Services;
|
||||||
@@ -42,52 +41,11 @@ public class DetailsIslandPlanningTests : IDisposable
|
|||||||
public ClaudeDoDbContext CreateDbContext() => _create();
|
public ClaudeDoDbContext CreateDbContext() => _create();
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class FakeWorkerClient : IWorkerClient
|
private sealed class FakeWorkerClient : StubWorkerClient
|
||||||
{
|
{
|
||||||
public event PropertyChangedEventHandler? PropertyChanged;
|
|
||||||
public event Action<string, string, DateTime>? TaskStartedEvent;
|
|
||||||
public event Action<string, string, string, DateTime>? TaskFinishedEvent;
|
|
||||||
public event Action<string>? TaskUpdatedEvent;
|
|
||||||
public event Action? ConnectionRestoredEvent;
|
|
||||||
public event Action<string>? WorktreeUpdatedEvent;
|
|
||||||
public event Action<string>? ListUpdatedEvent;
|
|
||||||
public event Action<string, string>? TaskMessageEvent;
|
|
||||||
public event Action<string, string>? PlanningMergeStartedEvent;
|
|
||||||
public event Action<string, string>? PlanningSubtaskMergedEvent;
|
|
||||||
public event Action<string, string, IReadOnlyList<string>>? PlanningMergeConflictEvent;
|
|
||||||
public event Action<string>? PlanningMergeAbortedEvent;
|
|
||||||
public event Action<string>? PlanningCompletedEvent;
|
|
||||||
|
|
||||||
public bool IsConnected => false;
|
|
||||||
public MergeTargetsDto? MergeTargetsResult { get; set; }
|
public MergeTargetsDto? MergeTargetsResult { get; set; }
|
||||||
|
|
||||||
public Task WakeQueueAsync() => Task.CompletedTask;
|
public override Task<MergeTargetsDto?> GetMergeTargetsAsync(string taskId) => Task.FromResult(MergeTargetsResult);
|
||||||
public Task RunNowAsync(string taskId) => Task.CompletedTask;
|
|
||||||
public Task ContinueTaskAsync(string taskId, string followUpPrompt) => Task.CompletedTask;
|
|
||||||
public Task ResetTaskAsync(string taskId) => Task.CompletedTask;
|
|
||||||
public Task CancelTaskAsync(string taskId) => Task.CompletedTask;
|
|
||||||
public Task<List<AgentInfo>> GetAgentsAsync() => Task.FromResult(new List<AgentInfo>());
|
|
||||||
public Task<ListConfigDto?> GetListConfigAsync(string listId) => Task.FromResult<ListConfigDto?>(null);
|
|
||||||
public Task UpdateTaskAgentSettingsAsync(UpdateTaskAgentSettingsDto dto) => Task.CompletedTask;
|
|
||||||
public Task SetTaskStatusAsync(string taskId, TaskStatus status) => Task.CompletedTask;
|
|
||||||
public Task SetTaskTagsAsync(string taskId, IEnumerable<string> tagNames) => Task.CompletedTask;
|
|
||||||
public Task<List<string>> GetAllTagsAsync() => Task.FromResult(new List<string>());
|
|
||||||
public Task StartPlanningSessionAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task ResumePlanningSessionAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task<ClaudeDo.Data.Repositories.DiscardPlanningOutcome> DiscardPlanningSessionAsync(string taskId, bool dequeueQueuedChildren = false, CancellationToken ct = default)
|
|
||||||
=> Task.FromResult(new ClaudeDo.Data.Repositories.DiscardPlanningOutcome(ClaudeDo.Data.Repositories.DiscardPlanningResult.Discarded, 0, 0));
|
|
||||||
public Task FinalizePlanningSessionAsync(string taskId, bool queueAgentTasks = true, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task<int> GetPendingDraftCountAsync(string taskId, CancellationToken ct = default) => Task.FromResult(0);
|
|
||||||
public Task<MergeTargetsDto?> GetMergeTargetsAsync(string taskId) => Task.FromResult(MergeTargetsResult);
|
|
||||||
public Task<IReadOnlyList<SubtaskDiffDto>> GetPlanningAggregateAsync(string planningTaskId) =>
|
|
||||||
Task.FromResult<IReadOnlyList<SubtaskDiffDto>>(Array.Empty<SubtaskDiffDto>());
|
|
||||||
public Task<CombinedDiffResultDto?> BuildPlanningIntegrationBranchAsync(string planningTaskId, string targetBranch) =>
|
|
||||||
Task.FromResult<CombinedDiffResultDto?>(null);
|
|
||||||
public Task MergeAllPlanningAsync(string planningTaskId, string targetBranch) => Task.CompletedTask;
|
|
||||||
public Task ContinuePlanningMergeAsync(string planningTaskId) => Task.CompletedTask;
|
|
||||||
public Task AbortPlanningMergeAsync(string planningTaskId) => Task.CompletedTask;
|
|
||||||
public Task OpenInteractiveTerminalAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task QueuePlanningSubtasksAsync(string parentTaskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class NullServiceProvider : IServiceProvider
|
private sealed class NullServiceProvider : IServiceProvider
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
using System.ComponentModel;
|
|
||||||
using ClaudeDo.Data.Models;
|
using ClaudeDo.Data.Models;
|
||||||
using ClaudeDo.Ui.Services;
|
using ClaudeDo.Ui.Services;
|
||||||
using ClaudeDo.Ui.ViewModels.Planning;
|
using ClaudeDo.Ui.ViewModels.Planning;
|
||||||
@@ -7,54 +6,15 @@ namespace ClaudeDo.Ui.Tests.ViewModels;
|
|||||||
|
|
||||||
public class PlanningDiffViewModelTests
|
public class PlanningDiffViewModelTests
|
||||||
{
|
{
|
||||||
private sealed class FakePlanningWorker : IWorkerClient
|
private sealed class FakePlanningWorker : StubWorkerClient
|
||||||
{
|
{
|
||||||
public event PropertyChangedEventHandler? PropertyChanged;
|
|
||||||
public event Action<string, string, DateTime>? TaskStartedEvent;
|
|
||||||
public event Action<string, string, string, DateTime>? TaskFinishedEvent;
|
|
||||||
public event Action<string>? TaskUpdatedEvent;
|
|
||||||
public event Action? ConnectionRestoredEvent;
|
|
||||||
public event Action<string>? WorktreeUpdatedEvent;
|
|
||||||
public event Action<string>? ListUpdatedEvent;
|
|
||||||
public event Action<string, string>? TaskMessageEvent;
|
|
||||||
public event Action<string, string>? PlanningMergeStartedEvent;
|
|
||||||
public event Action<string, string>? PlanningSubtaskMergedEvent;
|
|
||||||
public event Action<string, string, IReadOnlyList<string>>? PlanningMergeConflictEvent;
|
|
||||||
public event Action<string>? PlanningMergeAbortedEvent;
|
|
||||||
public event Action<string>? PlanningCompletedEvent;
|
|
||||||
|
|
||||||
public bool IsConnected => false;
|
|
||||||
|
|
||||||
public IReadOnlyList<SubtaskDiffDto> AggregateResult { get; set; } = Array.Empty<SubtaskDiffDto>();
|
public IReadOnlyList<SubtaskDiffDto> AggregateResult { get; set; } = Array.Empty<SubtaskDiffDto>();
|
||||||
public CombinedDiffResultDto? CombinedResult { get; set; }
|
public CombinedDiffResultDto? CombinedResult { get; set; }
|
||||||
|
|
||||||
public Task WakeQueueAsync() => Task.CompletedTask;
|
public override Task<IReadOnlyList<SubtaskDiffDto>> GetPlanningAggregateAsync(string planningTaskId) =>
|
||||||
public Task RunNowAsync(string taskId) => Task.CompletedTask;
|
|
||||||
public Task ContinueTaskAsync(string taskId, string followUpPrompt) => Task.CompletedTask;
|
|
||||||
public Task ResetTaskAsync(string taskId) => Task.CompletedTask;
|
|
||||||
public Task CancelTaskAsync(string taskId) => Task.CompletedTask;
|
|
||||||
public Task<List<AgentInfo>> GetAgentsAsync() => Task.FromResult(new List<AgentInfo>());
|
|
||||||
public Task<ListConfigDto?> GetListConfigAsync(string listId) => Task.FromResult<ListConfigDto?>(null);
|
|
||||||
public Task UpdateTaskAgentSettingsAsync(UpdateTaskAgentSettingsDto dto) => Task.CompletedTask;
|
|
||||||
public Task SetTaskStatusAsync(string taskId, ClaudeDo.Data.Models.TaskStatus status) => Task.CompletedTask;
|
|
||||||
public Task SetTaskTagsAsync(string taskId, IEnumerable<string> tagNames) => Task.CompletedTask;
|
|
||||||
public Task<List<string>> GetAllTagsAsync() => Task.FromResult(new List<string>());
|
|
||||||
public Task StartPlanningSessionAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task ResumePlanningSessionAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task<ClaudeDo.Data.Repositories.DiscardPlanningOutcome> DiscardPlanningSessionAsync(string taskId, bool dequeueQueuedChildren = false, CancellationToken ct = default)
|
|
||||||
=> Task.FromResult(new ClaudeDo.Data.Repositories.DiscardPlanningOutcome(ClaudeDo.Data.Repositories.DiscardPlanningResult.Discarded, 0, 0));
|
|
||||||
public Task FinalizePlanningSessionAsync(string taskId, bool queueAgentTasks = true, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task<int> GetPendingDraftCountAsync(string taskId, CancellationToken ct = default) => Task.FromResult(0);
|
|
||||||
public Task<MergeTargetsDto?> GetMergeTargetsAsync(string taskId) => Task.FromResult<MergeTargetsDto?>(null);
|
|
||||||
public Task<IReadOnlyList<SubtaskDiffDto>> GetPlanningAggregateAsync(string planningTaskId) =>
|
|
||||||
Task.FromResult(AggregateResult);
|
Task.FromResult(AggregateResult);
|
||||||
public Task<CombinedDiffResultDto?> BuildPlanningIntegrationBranchAsync(string planningTaskId, string targetBranch) =>
|
public override Task<CombinedDiffResultDto?> BuildPlanningIntegrationBranchAsync(string planningTaskId, string targetBranch) =>
|
||||||
Task.FromResult(CombinedResult);
|
Task.FromResult(CombinedResult);
|
||||||
public Task MergeAllPlanningAsync(string planningTaskId, string targetBranch) => Task.CompletedTask;
|
|
||||||
public Task ContinuePlanningMergeAsync(string planningTaskId) => Task.CompletedTask;
|
|
||||||
public Task AbortPlanningMergeAsync(string planningTaskId) => Task.CompletedTask;
|
|
||||||
public Task OpenInteractiveTerminalAsync(string taskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
public Task QueuePlanningSubtasksAsync(string parentTaskId, CancellationToken ct = default) => Task.CompletedTask;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
Reference in New Issue
Block a user