diff --git a/src/ClaudeDo.Data/Configuration/TaskEntityConfiguration.cs b/src/ClaudeDo.Data/Configuration/TaskEntityConfiguration.cs index 26aa747..531b218 100644 --- a/src/ClaudeDo.Data/Configuration/TaskEntityConfiguration.cs +++ b/src/ClaudeDo.Data/Configuration/TaskEntityConfiguration.cs @@ -17,6 +17,7 @@ public class TaskEntityConfiguration : IEntityTypeConfiguration : v == TaskStatus.Planning ? "planning" : v == TaskStatus.Planned ? "planned" : v == TaskStatus.Draft ? "draft" + : v == TaskStatus.Waiting ? "waiting" : throw new ArgumentOutOfRangeException(nameof(v)); private static TaskStatus StatusFromString(string v) @@ -28,6 +29,7 @@ public class TaskEntityConfiguration : IEntityTypeConfiguration : v == "planning" ? TaskStatus.Planning : v == "planned" ? TaskStatus.Planned : v == "draft" ? TaskStatus.Draft + : v == "waiting" ? TaskStatus.Waiting : throw new ArgumentOutOfRangeException(nameof(v)); private static readonly ValueConverter StatusConverter = @@ -64,6 +66,8 @@ public class TaskEntityConfiguration : IEntityTypeConfiguration builder.Property(t => t.PlanningSessionToken).HasColumnName("planning_session_token"); builder.Property(t => t.PlanningFinalizedAt).HasColumnName("planning_finalized_at"); + builder.Property(t => t.CreatedBy).HasColumnName("created_by"); + builder.HasOne(t => t.Parent) .WithMany(t => t.Children) .HasForeignKey(t => t.ParentTaskId) diff --git a/src/ClaudeDo.Data/Migrations/20260424212250_AddTaskCreatedBy.cs b/src/ClaudeDo.Data/Migrations/20260424212250_AddTaskCreatedBy.cs new file mode 100644 index 0000000..325c68a --- /dev/null +++ b/src/ClaudeDo.Data/Migrations/20260424212250_AddTaskCreatedBy.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ClaudeDo.Data.Migrations +{ + /// + public partial class AddTaskCreatedBy : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "created_by", + table: "tasks", + type: "TEXT", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "created_by", + table: "tasks"); + } + } +} diff --git a/src/ClaudeDo.Data/Migrations/ClaudeDoDbContextModelSnapshot.cs b/src/ClaudeDo.Data/Migrations/ClaudeDoDbContextModelSnapshot.cs index 08926d8..2b622ae 100644 --- a/src/ClaudeDo.Data/Migrations/ClaudeDoDbContextModelSnapshot.cs +++ b/src/ClaudeDo.Data/Migrations/ClaudeDoDbContextModelSnapshot.cs @@ -82,7 +82,7 @@ namespace ClaudeDo.Data.Migrations { Id = 1, DefaultClaudeInstructions = "", - DefaultMaxTurns = 30, + DefaultMaxTurns = 100, DefaultModel = "sonnet", DefaultPermissionMode = "bypassPermissions", WorktreeAutoCleanupDays = 7, @@ -236,6 +236,10 @@ namespace ClaudeDo.Data.Migrations .HasColumnType("TEXT") .HasColumnName("created_at"); + b.Property("CreatedBy") + .HasColumnType("TEXT") + .HasColumnName("created_by"); + b.Property("Description") .HasColumnType("TEXT") .HasColumnName("description"); diff --git a/src/ClaudeDo.Data/Models/TaskEntity.cs b/src/ClaudeDo.Data/Models/TaskEntity.cs index 9b81aa6..c58eaeb 100644 --- a/src/ClaudeDo.Data/Models/TaskEntity.cs +++ b/src/ClaudeDo.Data/Models/TaskEntity.cs @@ -10,6 +10,7 @@ public enum TaskStatus Planning, Planned, Draft, + Waiting, } public sealed class TaskEntity @@ -39,6 +40,8 @@ public sealed class TaskEntity public string? PlanningSessionToken { get; set; } public DateTime? PlanningFinalizedAt { get; set; } + public string? CreatedBy { get; set; } + // Navigation properties public ListEntity List { get; set; } = null!; public WorktreeEntity? Worktree { get; set; } diff --git a/src/ClaudeDo.Data/Repositories/TaskRepository.cs b/src/ClaudeDo.Data/Repositories/TaskRepository.cs index 232f00d..9161ee9 100644 --- a/src/ClaudeDo.Data/Repositories/TaskRepository.cs +++ b/src/ClaudeDo.Data/Repositories/TaskRepository.cs @@ -75,6 +75,15 @@ public sealed class TaskRepository public Task> GetByListAsync(string listId, CancellationToken ct = default) => GetByListIdAsync(listId, ct); + public async Task> GetByCreatorAsync(string createdBy, CancellationToken ct = default) + { + return await _context.Tasks + .AsNoTracking() + .Where(t => t.CreatedBy == createdBy) + .OrderByDescending(t => t.CreatedAt) + .ToListAsync(ct); + } + #endregion #region Status transitions