diff --git a/src/ClaudeDo.Data/CLAUDE.md b/src/ClaudeDo.Data/CLAUDE.md index f48f3a76..34e7dfe3 100644 --- a/src/ClaudeDo.Data/CLAUDE.md +++ b/src/ClaudeDo.Data/CLAUDE.md @@ -8,8 +8,8 @@ Shared data layer: models, repositories, SQLite infrastructure, and git operatio - Status / PlanningPhase / BlockedByTaskId / DependsOnTaskId semantics + allowed transitions: `ClaudeDo.Worker/CLAUDE.md` → Status Model. - `HandlerBaseCommit`/`HandlerHeadCommit` = the review range for a **worktree-less "list handler" host task** ("Let Claude handle it"), which commits straight into the list's working dir instead of a per-task worktree. Everything that reads a task's diff falls back to this pair whenever `Worktree` is null → [conpty-sessions](../../docs/explore-notes/conpty-sessions.md). - `InteractiveSessionId` = the claude session id an embedded ConPTY interactive task session runs under, persisted by `InteractiveLaunchSpecService` before launch so a closed/aborted session can be resumed → [conpty-sessions](../../docs/explore-notes/conpty-sessions.md). - - `Number` (INTEGER NOT NULL, unique index `idx_tasks_number`) — a global, monotonically increasing display alias for tasks. **Never reused**: deleting a task leaves a gap in numbering, ensuring that a task number that appears in a log or report always points to the same task (if it exists). Allocated by `TaskNumberAllocator.AddWithNumberAsync` on every insert via a persistent counter (`app_settings.next_task_number`). **Why not `MAX(number) + 1`:** deleting the highest-numbered task would free its number for reuse, breaking the immutability guarantee. The allocator uses an `UPDATE…RETURNING` statement to claim numbers atomically, retrying up to 5 times if a uniqueness collision occurs (the counter advances on each attempt, so retries always allocate fresh numbers). ⚠️ Tests use `EnsureCreated`, which bypasses migrations — the backfill needs a migration that runs `Migrate()` explicitly (not tested by default; see `worker-task-pipeline` notes). - - Legacy status values `Manual`/`Planning`/`Planned`/`Draft`/`Waiting` were retired; existing rows backfill via the `RetireLegacyTaskStatus` migration. + - `Number` (INTEGER NOT NULL, unique index `idx_tasks_number`) — a global, monotonically increasing display alias for tasks. **Never reused**: deleting a task leaves a gap in numbering, ensuring that a task number that appears in a log or report always points to the same task (if it exists). Allocated by `TaskNumberAllocator.AddWithNumberAsync` on every insert via a persistent counter (`app_settings.next_task_number`). **Why not `MAX(number) + 1`:** deleting the highest-numbered task would free its number for reuse, breaking the immutability guarantee. The allocator uses an `UPDATE…RETURNING` statement to claim numbers atomically, retrying up to 5 times if a uniqueness collision occurs (the counter advances on each attempt, so retries always allocate fresh numbers). The one-time backfill for pre-existing rows lived in the `AddTaskNumbers` migration, squashed away 2026-08-26. + - Legacy status values `Manual`/`Planning`/`Planned`/`Draft`/`Waiting` were retired. The backfill migration was squashed away (2026-08-26) — a database still holding those values can't be upgraded, see Schema below. - **ListEntity** — Id, Name, WorkingDir, DefaultCommitType, CreatedAt, IsManual (reminder list — tasks created here default to `IsManual`) - **ListConfigEntity** — ListId (PK, 1:1), Model, SystemPrompt, AgentPath, MaxTurns, SessionSkills, VerifyCommand (all nullable). `VerifyCommand` is an optional post-merge gate; null/blank = no gate → [review-merge](../../docs/explore-notes/review-merge.md). - **WorktreeEntity** — TaskId (PK, 1:1), Path, BranchName, BaseCommit, HeadCommit, DiffStat, MergeCommit (nullable — SHA of the merge commit this branch produced; the only thing making `revert_merge` possible without searching `git log`), State (`Active|Merged|Discarded|Kept`) @@ -97,8 +97,19 @@ Tables (one per line so parallel migrations don't collide on the same line): - `week_reports` - `task_attachments` -Managed by EF Core migrations in `Migrations/` — **`ls Migrations/` is the authoritative history**; -don't maintain a changelog here. `tasks` holds `status`, `planning_phase` (default `none`), +Managed by EF Core migrations in `Migrations/`. **The 40 incremental migrations were squashed into +a single `20260826094154_InitialCreate` on 2026-08-26** — the schema history is git history now, +not a migration chain. Consequences: + +- `ClaudeDoDbContext.MigrateAndConfigure` **baselines** an existing database onto the squashed id + (pre-EF databases without a history, and databases whose history still lists the old chain ending + at `20260825063230_AddPrimeActionKind`). A database that stopped *mid*-chain can no longer be + upgraded and throws with a reinstall message instead of being stamped onto a schema it lacks. + Covered by `MigrationBaselineTests` — the only test that runs a real `Migrate()` (every other + Data.Tests fixture uses `EnsureCreated`, which skips migrations entirely). +- Don't hand-edit the migration; add new ones on top as usual. + +`tasks` holds `status`, `planning_phase` (default `none`), `blocked_by_task_id` (FK to `tasks.id`, `ON DELETE SET NULL`), and `depends_on_task_id` (same FK shape, but a separate column — see Worker/CLAUDE.md → Status Model for why it isn't unified with `blocked_by_task_id`). diff --git a/src/ClaudeDo.Data/ClaudeDoDbContext.cs b/src/ClaudeDo.Data/ClaudeDoDbContext.cs index 7000dbd2..9e466fb4 100644 --- a/src/ClaudeDo.Data/ClaudeDoDbContext.cs +++ b/src/ClaudeDo.Data/ClaudeDoDbContext.cs @@ -73,11 +73,19 @@ public class ClaudeDoDbContext : DbContext } } + // The 40 incremental migrations were squashed into a single InitialCreate on 2026-08-26. + // Any database that already carries the full pre-squash schema has to be re-stamped to the + // squashed id, or Migrate() would run CREATE TABLE over live tables. + private const string SquashedMigrationId = "20260826094154_InitialCreate"; + private const string LastPreSquashMigrationId = "20260825063230_AddPrimeActionKind"; + /// /// Applies EF Core migrations and sets WAL mode. Safe for both fresh and existing databases. - /// Existing databases (created by the old schema.sql) have their tables but no - /// __EFMigrationsHistory — this method detects that case and baselines the initial - /// migration so EF skips re-creating tables that already exist. + /// Existing databases are baselined onto instead of being + /// re-created: ones with tables but no __EFMigrationsHistory (created by the old schema.sql), + /// and ones whose history still lists the pre-squash chain. A database that stopped *mid*-chain + /// can no longer be upgraded — the incremental migrations are gone — and throws instead of + /// being silently stamped onto a schema it doesn't have. /// public static void MigrateAndConfigure(ClaudeDoDbContext db) { @@ -101,8 +109,6 @@ public class ClaudeDoDbContext : DbContext fkCmd.ExecuteNonQuery(); } - // If the 'lists' table exists but __EFMigrationsHistory does not, - // this is a pre-EF database. Baseline the InitialCreate migration. using (var cmd = conn.CreateCommand()) { cmd.CommandText = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='lists'"; @@ -113,16 +119,42 @@ public class ClaudeDoDbContext : DbContext if (hasLists && !hasHistory) { - cmd.CommandText = """ + // Pre-EF database: tables, no history at all. + cmd.CommandText = $""" CREATE TABLE "__EFMigrationsHistory" ( "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, "ProductVersion" TEXT NOT NULL ); INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") - VALUES ('20260416064948_InitialCreate', '8.0.11'); + VALUES ('{SquashedMigrationId}', '8.0.11'); """; cmd.ExecuteNonQuery(); } + else if (hasLists && hasHistory) + { + cmd.CommandText = $"""SELECT COUNT(*) FROM "__EFMigrationsHistory" WHERE "MigrationId" = '{SquashedMigrationId}'"""; + var alreadySquashed = Convert.ToInt64(cmd.ExecuteScalar()) > 0; + + if (!alreadySquashed) + { + cmd.CommandText = """SELECT MAX("MigrationId") FROM "__EFMigrationsHistory" """; + var newest = cmd.ExecuteScalar() as string ?? ""; + + if (newest != LastPreSquashMigrationId) + throw new InvalidOperationException( + $"This database was last migrated by '{newest}', but the migration history was " + + $"squashed into '{SquashedMigrationId}' and the incremental migrations no longer " + + "exist. Reinstall ClaudeDo against a fresh database (or restore a backup taken " + + $"after '{LastPreSquashMigrationId}')."); + + cmd.CommandText = $""" + DELETE FROM "__EFMigrationsHistory"; + INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") + VALUES ('{SquashedMigrationId}', '8.0.11'); + """; + cmd.ExecuteNonQuery(); + } + } } } finally diff --git a/src/ClaudeDo.Data/Migrations/20260416064948_InitialCreate.Designer.cs b/src/ClaudeDo.Data/Migrations/20260416064948_InitialCreate.Designer.cs deleted file mode 100644 index 8474e6f7..00000000 --- a/src/ClaudeDo.Data/Migrations/20260416064948_InitialCreate.Designer.cs +++ /dev/null @@ -1,482 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260416064948_InitialCreate")] - partial class InitialCreate - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TagEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("tags", (string)null); - - b.HasData( - new - { - Id = 1L, - Name = "agent" - }, - new - { - Id = 2L, - Name = "manual" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("list_tags", b => - { - b.Property("list_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("list_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("list_tags", (string)null); - }); - - modelBuilder.Entity("task_tags", b => - { - b.Property("task_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("task_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("task_tags", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("list_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", null) - .WithMany() - .HasForeignKey("list_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("task_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("task_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260416064948_InitialCreate.cs b/src/ClaudeDo.Data/Migrations/20260416064948_InitialCreate.cs deleted file mode 100644 index 301b9316..00000000 --- a/src/ClaudeDo.Data/Migrations/20260416064948_InitialCreate.cs +++ /dev/null @@ -1,298 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class InitialCreate : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "lists", - columns: table => new - { - id = table.Column(type: "TEXT", nullable: false), - name = table.Column(type: "TEXT", nullable: false), - created_at = table.Column(type: "TEXT", nullable: false), - working_dir = table.Column(type: "TEXT", nullable: true), - default_commit_type = table.Column(type: "TEXT", nullable: false, defaultValue: "chore") - }, - constraints: table => - { - table.PrimaryKey("PK_lists", x => x.id); - }); - - migrationBuilder.CreateTable( - name: "tags", - columns: table => new - { - id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - name = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_tags", x => x.id); - }); - - migrationBuilder.CreateTable( - name: "list_config", - columns: table => new - { - list_id = table.Column(type: "TEXT", nullable: false), - model = table.Column(type: "TEXT", nullable: true), - system_prompt = table.Column(type: "TEXT", nullable: true), - agent_path = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_list_config", x => x.list_id); - table.ForeignKey( - name: "FK_list_config_lists_list_id", - column: x => x.list_id, - principalTable: "lists", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "tasks", - columns: table => new - { - id = table.Column(type: "TEXT", nullable: false), - list_id = table.Column(type: "TEXT", nullable: false), - title = table.Column(type: "TEXT", nullable: false), - description = table.Column(type: "TEXT", nullable: true), - status = table.Column(type: "TEXT", nullable: false), - scheduled_for = table.Column(type: "TEXT", nullable: true), - result = table.Column(type: "TEXT", nullable: true), - log_path = table.Column(type: "TEXT", nullable: true), - created_at = table.Column(type: "TEXT", nullable: false), - started_at = table.Column(type: "TEXT", nullable: true), - finished_at = table.Column(type: "TEXT", nullable: true), - commit_type = table.Column(type: "TEXT", nullable: false, defaultValue: "chore"), - model = table.Column(type: "TEXT", nullable: true), - system_prompt = table.Column(type: "TEXT", nullable: true), - agent_path = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_tasks", x => x.id); - table.ForeignKey( - name: "FK_tasks_lists_list_id", - column: x => x.list_id, - principalTable: "lists", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "list_tags", - columns: table => new - { - list_id = table.Column(type: "TEXT", nullable: false), - tag_id = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_list_tags", x => new { x.list_id, x.tag_id }); - table.ForeignKey( - name: "FK_list_tags_lists_list_id", - column: x => x.list_id, - principalTable: "lists", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_list_tags_tags_tag_id", - column: x => x.tag_id, - principalTable: "tags", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "subtasks", - columns: table => new - { - id = table.Column(type: "TEXT", nullable: false), - task_id = table.Column(type: "TEXT", nullable: false), - title = table.Column(type: "TEXT", nullable: false), - completed = table.Column(type: "INTEGER", nullable: false, defaultValue: false), - order_num = table.Column(type: "INTEGER", nullable: false), - created_at = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_subtasks", x => x.id); - table.ForeignKey( - name: "FK_subtasks_tasks_task_id", - column: x => x.task_id, - principalTable: "tasks", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "task_runs", - columns: table => new - { - id = table.Column(type: "TEXT", nullable: false), - task_id = table.Column(type: "TEXT", nullable: false), - run_number = table.Column(type: "INTEGER", nullable: false), - session_id = table.Column(type: "TEXT", nullable: true), - is_retry = table.Column(type: "INTEGER", nullable: false, defaultValue: false), - prompt = table.Column(type: "TEXT", nullable: false), - result_markdown = table.Column(type: "TEXT", nullable: true), - structured_output = table.Column(type: "TEXT", nullable: true), - error_markdown = table.Column(type: "TEXT", nullable: true), - exit_code = table.Column(type: "INTEGER", nullable: true), - turn_count = table.Column(type: "INTEGER", nullable: true), - tokens_in = table.Column(type: "INTEGER", nullable: true), - tokens_out = table.Column(type: "INTEGER", nullable: true), - log_path = table.Column(type: "TEXT", nullable: true), - started_at = table.Column(type: "TEXT", nullable: true), - finished_at = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_task_runs", x => x.id); - table.ForeignKey( - name: "FK_task_runs_tasks_task_id", - column: x => x.task_id, - principalTable: "tasks", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "task_tags", - columns: table => new - { - task_id = table.Column(type: "TEXT", nullable: false), - tag_id = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_task_tags", x => new { x.task_id, x.tag_id }); - table.ForeignKey( - name: "FK_task_tags_tags_tag_id", - column: x => x.tag_id, - principalTable: "tags", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_task_tags_tasks_task_id", - column: x => x.task_id, - principalTable: "tasks", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "worktrees", - columns: table => new - { - task_id = table.Column(type: "TEXT", nullable: false), - path = table.Column(type: "TEXT", nullable: false), - branch_name = table.Column(type: "TEXT", nullable: false), - base_commit = table.Column(type: "TEXT", nullable: false), - head_commit = table.Column(type: "TEXT", nullable: true), - diff_stat = table.Column(type: "TEXT", nullable: true), - state = table.Column(type: "TEXT", nullable: false, defaultValue: "active"), - created_at = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_worktrees", x => x.task_id); - table.ForeignKey( - name: "FK_worktrees_tasks_task_id", - column: x => x.task_id, - principalTable: "tasks", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.InsertData( - table: "tags", - columns: new[] { "id", "name" }, - values: new object[,] - { - { 1L, "agent" }, - { 2L, "manual" } - }); - - migrationBuilder.CreateIndex( - name: "IX_list_tags_tag_id", - table: "list_tags", - column: "tag_id"); - - migrationBuilder.CreateIndex( - name: "idx_subtasks_task_id", - table: "subtasks", - column: "task_id"); - - migrationBuilder.CreateIndex( - name: "IX_tags_name", - table: "tags", - column: "name", - unique: true); - - migrationBuilder.CreateIndex( - name: "idx_task_runs_task_id", - table: "task_runs", - column: "task_id"); - - migrationBuilder.CreateIndex( - name: "IX_task_tags_tag_id", - table: "task_tags", - column: "tag_id"); - - migrationBuilder.CreateIndex( - name: "idx_tasks_list_id", - table: "tasks", - column: "list_id"); - - migrationBuilder.CreateIndex( - name: "idx_tasks_status", - table: "tasks", - column: "status"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "list_config"); - - migrationBuilder.DropTable( - name: "list_tags"); - - migrationBuilder.DropTable( - name: "subtasks"); - - migrationBuilder.DropTable( - name: "task_runs"); - - migrationBuilder.DropTable( - name: "task_tags"); - - migrationBuilder.DropTable( - name: "worktrees"); - - migrationBuilder.DropTable( - name: "tags"); - - migrationBuilder.DropTable( - name: "tasks"); - - migrationBuilder.DropTable( - name: "lists"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260420075929_AddTaskFlagsAndNotes.Designer.cs b/src/ClaudeDo.Data/Migrations/20260420075929_AddTaskFlagsAndNotes.Designer.cs deleted file mode 100644 index b8fa6b69..00000000 --- a/src/ClaudeDo.Data/Migrations/20260420075929_AddTaskFlagsAndNotes.Designer.cs +++ /dev/null @@ -1,498 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260420075929_AddTaskFlagsAndNotes")] - partial class AddTaskFlagsAndNotes - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TagEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("tags", (string)null); - - b.HasData( - new - { - Id = 1L, - Name = "agent" - }, - new - { - Id = 2L, - Name = "manual" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("list_tags", b => - { - b.Property("list_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("list_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("list_tags", (string)null); - }); - - modelBuilder.Entity("task_tags", b => - { - b.Property("task_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("task_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("task_tags", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("list_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", null) - .WithMany() - .HasForeignKey("list_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("task_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("task_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260420075929_AddTaskFlagsAndNotes.cs b/src/ClaudeDo.Data/Migrations/20260420075929_AddTaskFlagsAndNotes.cs deleted file mode 100644 index 75467678..00000000 --- a/src/ClaudeDo.Data/Migrations/20260420075929_AddTaskFlagsAndNotes.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddTaskFlagsAndNotes : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "is_my_day", - table: "tasks", - type: "INTEGER", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "is_starred", - table: "tasks", - type: "INTEGER", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "notes", - table: "tasks", - type: "TEXT", - nullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "is_my_day", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "is_starred", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "notes", - table: "tasks"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260421113614_AddAppSettings.Designer.cs b/src/ClaudeDo.Data/Migrations/20260421113614_AddAppSettings.Designer.cs deleted file mode 100644 index a03d20e6..00000000 --- a/src/ClaudeDo.Data/Migrations/20260421113614_AddAppSettings.Designer.cs +++ /dev/null @@ -1,572 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260421113614_AddAppSettings")] - partial class AddAppSettings - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 30, - DefaultModel = "sonnet", - DefaultPermissionMode = "bypassPermissions", - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TagEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("tags", (string)null); - - b.HasData( - new - { - Id = 1L, - Name = "agent" - }, - new - { - Id = 2L, - Name = "manual" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("list_tags", b => - { - b.Property("list_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("list_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("list_tags", (string)null); - }); - - modelBuilder.Entity("task_tags", b => - { - b.Property("task_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("task_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("task_tags", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("list_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", null) - .WithMany() - .HasForeignKey("list_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("task_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("task_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260421113614_AddAppSettings.cs b/src/ClaudeDo.Data/Migrations/20260421113614_AddAppSettings.cs deleted file mode 100644 index 083c4cb5..00000000 --- a/src/ClaudeDo.Data/Migrations/20260421113614_AddAppSettings.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddAppSettings : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "app_settings", - columns: table => new - { - id = table.Column(type: "INTEGER", nullable: false), - default_claude_instructions = table.Column(type: "TEXT", nullable: false, defaultValue: ""), - default_model = table.Column(type: "TEXT", nullable: false, defaultValue: "sonnet"), - default_max_turns = table.Column(type: "INTEGER", nullable: false, defaultValue: 30), - default_permission_mode = table.Column(type: "TEXT", nullable: false, defaultValue: "bypassPermissions"), - worktree_strategy = table.Column(type: "TEXT", nullable: false, defaultValue: "sibling"), - central_worktree_root = table.Column(type: "TEXT", nullable: true), - worktree_auto_cleanup_enabled = table.Column(type: "INTEGER", nullable: false, defaultValue: false), - worktree_auto_cleanup_days = table.Column(type: "INTEGER", nullable: false, defaultValue: 7) - }, - constraints: table => - { - table.PrimaryKey("PK_app_settings", x => x.id); - }); - - migrationBuilder.InsertData( - table: "app_settings", - columns: new[] { "id", "central_worktree_root", "default_claude_instructions", "default_max_turns", "default_model", "default_permission_mode", "worktree_auto_cleanup_days", "worktree_strategy" }, - values: new object[] { 1, null, "", 30, "sonnet", "bypassPermissions", 7, "sibling" }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260422120000_AddTaskSortOrder.Designer.cs b/src/ClaudeDo.Data/Migrations/20260422120000_AddTaskSortOrder.Designer.cs deleted file mode 100644 index 5bf2020c..00000000 --- a/src/ClaudeDo.Data/Migrations/20260422120000_AddTaskSortOrder.Designer.cs +++ /dev/null @@ -1,581 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260422120000_AddTaskSortOrder")] - partial class AddTaskSortOrder - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 30, - DefaultModel = "sonnet", - DefaultPermissionMode = "bypassPermissions", - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TagEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("tags", (string)null); - - b.HasData( - new - { - Id = 1L, - Name = "agent" - }, - new - { - Id = 2L, - Name = "manual" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("list_tags", b => - { - b.Property("list_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("list_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("list_tags", (string)null); - }); - - modelBuilder.Entity("task_tags", b => - { - b.Property("task_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("task_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("task_tags", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("list_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", null) - .WithMany() - .HasForeignKey("list_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("task_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("task_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260422120000_AddTaskSortOrder.cs b/src/ClaudeDo.Data/Migrations/20260422120000_AddTaskSortOrder.cs deleted file mode 100644 index 6918635b..00000000 --- a/src/ClaudeDo.Data/Migrations/20260422120000_AddTaskSortOrder.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddTaskSortOrder : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "sort_order", - table: "tasks", - type: "INTEGER", - nullable: false, - defaultValue: 0); - - // Backfill existing rows with a per-list dense order (0..N-1) by creation time - // so today's UI order is preserved after the migration. - migrationBuilder.Sql(""" - WITH ordered AS ( - SELECT id, (row_number() OVER (PARTITION BY list_id ORDER BY created_at) - 1) AS rn - FROM tasks - ) - UPDATE tasks SET sort_order = (SELECT rn FROM ordered WHERE ordered.id = tasks.id); - """); - - migrationBuilder.CreateIndex( - name: "idx_tasks_list_sort", - table: "tasks", - columns: new[] { "list_id", "sort_order" }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "idx_tasks_list_sort", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "sort_order", - table: "tasks"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260423154708_AddPlanningSupport.Designer.cs b/src/ClaudeDo.Data/Migrations/20260423154708_AddPlanningSupport.Designer.cs deleted file mode 100644 index f8ca253a..00000000 --- a/src/ClaudeDo.Data/Migrations/20260423154708_AddPlanningSupport.Designer.cs +++ /dev/null @@ -1,609 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260423154708_AddPlanningSupport")] - partial class AddPlanningSupport - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 30, - DefaultModel = "sonnet", - DefaultPermissionMode = "bypassPermissions", - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TagEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("tags", (string)null); - - b.HasData( - new - { - Id = 1L, - Name = "agent" - }, - new - { - Id = 2L, - Name = "manual" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("list_tags", b => - { - b.Property("list_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("list_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("list_tags", (string)null); - }); - - modelBuilder.Entity("task_tags", b => - { - b.Property("task_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("task_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("task_tags", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("list_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", null) - .WithMany() - .HasForeignKey("list_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("task_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("task_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260423154708_AddPlanningSupport.cs b/src/ClaudeDo.Data/Migrations/20260423154708_AddPlanningSupport.cs deleted file mode 100644 index 56e0468e..00000000 --- a/src/ClaudeDo.Data/Migrations/20260423154708_AddPlanningSupport.cs +++ /dev/null @@ -1,79 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddPlanningSupport : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "parent_task_id", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "planning_finalized_at", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "planning_session_id", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "planning_session_token", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.CreateIndex( - name: "idx_tasks_parent_task_id", - table: "tasks", - column: "parent_task_id"); - - migrationBuilder.AddForeignKey( - name: "FK_tasks_tasks_parent_task_id", - table: "tasks", - column: "parent_task_id", - principalTable: "tasks", - principalColumn: "id", - onDelete: ReferentialAction.Restrict); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_tasks_tasks_parent_task_id", - table: "tasks"); - - migrationBuilder.DropIndex( - name: "idx_tasks_parent_task_id", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "parent_task_id", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "planning_finalized_at", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "planning_session_id", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "planning_session_token", - table: "tasks"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260424212250_AddTaskCreatedBy.Designer.cs b/src/ClaudeDo.Data/Migrations/20260424212250_AddTaskCreatedBy.Designer.cs deleted file mode 100644 index 820c2c83..00000000 --- a/src/ClaudeDo.Data/Migrations/20260424212250_AddTaskCreatedBy.Designer.cs +++ /dev/null @@ -1,613 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260424212250_AddTaskCreatedBy")] - partial class AddTaskCreatedBy - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "bypassPermissions", - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TagEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("tags", (string)null); - - b.HasData( - new - { - Id = 1L, - Name = "agent" - }, - new - { - Id = 2L, - Name = "manual" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("list_tags", b => - { - b.Property("list_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("list_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("list_tags", (string)null); - }); - - modelBuilder.Entity("task_tags", b => - { - b.Property("task_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("task_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("task_tags", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("list_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", null) - .WithMany() - .HasForeignKey("list_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("task_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("task_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260424212250_AddTaskCreatedBy.cs b/src/ClaudeDo.Data/Migrations/20260424212250_AddTaskCreatedBy.cs deleted file mode 100644 index 325c68a2..00000000 --- a/src/ClaudeDo.Data/Migrations/20260424212250_AddTaskCreatedBy.cs +++ /dev/null @@ -1,28 +0,0 @@ -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/20260427082248_AddPlanningPhaseAndBlockedBy.Designer.cs b/src/ClaudeDo.Data/Migrations/20260427082248_AddPlanningPhaseAndBlockedBy.Designer.cs deleted file mode 100644 index bba03cde..00000000 --- a/src/ClaudeDo.Data/Migrations/20260427082248_AddPlanningPhaseAndBlockedBy.Designer.cs +++ /dev/null @@ -1,632 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260427082248_AddPlanningPhaseAndBlockedBy")] - partial class AddPlanningPhaseAndBlockedBy - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TagEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("tags", (string)null); - - b.HasData( - new - { - Id = 1L, - Name = "agent" - }, - new - { - Id = 2L, - Name = "manual" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("list_tags", b => - { - b.Property("list_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("list_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("list_tags", (string)null); - }); - - modelBuilder.Entity("task_tags", b => - { - b.Property("task_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("task_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("task_tags", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("list_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", null) - .WithMany() - .HasForeignKey("list_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("task_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("task_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260427082248_AddPlanningPhaseAndBlockedBy.cs b/src/ClaudeDo.Data/Migrations/20260427082248_AddPlanningPhaseAndBlockedBy.cs deleted file mode 100644 index 301367ab..00000000 --- a/src/ClaudeDo.Data/Migrations/20260427082248_AddPlanningPhaseAndBlockedBy.cs +++ /dev/null @@ -1,74 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddPlanningPhaseAndBlockedBy : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "blocked_by_task_id", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "planning_phase", - table: "tasks", - type: "TEXT", - nullable: false, - defaultValue: "none"); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - column: "default_permission_mode", - value: "auto"); - - migrationBuilder.CreateIndex( - name: "idx_tasks_blocked_by", - table: "tasks", - column: "blocked_by_task_id"); - - migrationBuilder.AddForeignKey( - name: "FK_tasks_tasks_blocked_by_task_id", - table: "tasks", - column: "blocked_by_task_id", - principalTable: "tasks", - principalColumn: "id", - onDelete: ReferentialAction.SetNull); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_tasks_tasks_blocked_by_task_id", - table: "tasks"); - - migrationBuilder.DropIndex( - name: "idx_tasks_blocked_by", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "blocked_by_task_id", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "planning_phase", - table: "tasks"); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - column: "default_permission_mode", - value: "bypassPermissions"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260427130058_RetireLegacyTaskStatus.Designer.cs b/src/ClaudeDo.Data/Migrations/20260427130058_RetireLegacyTaskStatus.Designer.cs deleted file mode 100644 index bd718ab7..00000000 --- a/src/ClaudeDo.Data/Migrations/20260427130058_RetireLegacyTaskStatus.Designer.cs +++ /dev/null @@ -1,632 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260427130058_RetireLegacyTaskStatus")] - partial class RetireLegacyTaskStatus - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TagEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("tags", (string)null); - - b.HasData( - new - { - Id = 1L, - Name = "agent" - }, - new - { - Id = 2L, - Name = "manual" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("list_tags", b => - { - b.Property("list_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("list_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("list_tags", (string)null); - }); - - modelBuilder.Entity("task_tags", b => - { - b.Property("task_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("task_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("task_tags", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("list_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", null) - .WithMany() - .HasForeignKey("list_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("task_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("task_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260427130058_RetireLegacyTaskStatus.cs b/src/ClaudeDo.Data/Migrations/20260427130058_RetireLegacyTaskStatus.cs deleted file mode 100644 index 00aff25b..00000000 --- a/src/ClaudeDo.Data/Migrations/20260427130058_RetireLegacyTaskStatus.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class RetireLegacyTaskStatus : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - // manual / draft -> idle - migrationBuilder.Sql("UPDATE tasks SET status = 'idle' WHERE status IN ('manual', 'draft');"); - - // planning -> idle + planning_phase=active - migrationBuilder.Sql("UPDATE tasks SET status = 'idle', planning_phase = 'active' WHERE status = 'planning';"); - - // planned -> idle + planning_phase=finalized - migrationBuilder.Sql("UPDATE tasks SET status = 'idle', planning_phase = 'finalized' WHERE status = 'planned';"); - - // waiting -> queued + blocked_by_task_id derived from sort_order chain. - // SQLite 3.25+ supports window functions (LAG). - migrationBuilder.Sql(@" -WITH ordered AS ( - SELECT id, - LAG(id) OVER (PARTITION BY parent_task_id ORDER BY sort_order, created_at) AS prev_id - FROM tasks - WHERE status = 'waiting' -) -UPDATE tasks -SET status = 'queued', - blocked_by_task_id = (SELECT prev_id FROM ordered WHERE ordered.id = tasks.id) -WHERE id IN (SELECT id FROM ordered);"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - // Best-effort and lossy: cancelled is folded back into failed, - // (idle, finalized) -> planned, (idle, active) -> planning, - // queued + blocked_by_task_id != null -> waiting. - // Manual/Draft distinction is unrecoverable — anything previously - // 'manual' or 'draft' stays 'idle' on the way back. - migrationBuilder.Sql("UPDATE tasks SET status = 'failed' WHERE status = 'cancelled';"); - migrationBuilder.Sql("UPDATE tasks SET status = 'planned' WHERE status = 'idle' AND planning_phase = 'finalized';"); - migrationBuilder.Sql("UPDATE tasks SET status = 'planning' WHERE status = 'idle' AND planning_phase = 'active';"); - migrationBuilder.Sql("UPDATE tasks SET status = 'waiting', blocked_by_task_id = NULL WHERE status = 'queued' AND blocked_by_task_id IS NOT NULL;"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260428064951_AddPrimeSchedules.Designer.cs b/src/ClaudeDo.Data/Migrations/20260428064951_AddPrimeSchedules.Designer.cs deleted file mode 100644 index 7bf98821..00000000 --- a/src/ClaudeDo.Data/Migrations/20260428064951_AddPrimeSchedules.Designer.cs +++ /dev/null @@ -1,679 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260428064951_AddPrimeSchedules")] - partial class AddPrimeSchedules - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.Property("WorkdaysOnly") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("workdays_only"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TagEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("tags", (string)null); - - b.HasData( - new - { - Id = 1L, - Name = "agent" - }, - new - { - Id = 2L, - Name = "manual" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("list_tags", b => - { - b.Property("list_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("list_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("list_tags", (string)null); - }); - - modelBuilder.Entity("task_tags", b => - { - b.Property("task_id") - .HasColumnType("TEXT"); - - b.Property("tag_id") - .HasColumnType("INTEGER"); - - b.HasKey("task_id", "tag_id"); - - b.HasIndex("tag_id"); - - b.ToTable("task_tags", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("list_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", null) - .WithMany() - .HasForeignKey("list_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("task_tags", b => - { - b.HasOne("ClaudeDo.Data.Models.TagEntity", null) - .WithMany() - .HasForeignKey("tag_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("task_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260428064951_AddPrimeSchedules.cs b/src/ClaudeDo.Data/Migrations/20260428064951_AddPrimeSchedules.cs deleted file mode 100644 index 6315a524..00000000 --- a/src/ClaudeDo.Data/Migrations/20260428064951_AddPrimeSchedules.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddPrimeSchedules : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "prime_schedules", - columns: table => new - { - id = table.Column(type: "TEXT", nullable: false), - start_date = table.Column(type: "TEXT", nullable: false), - end_date = table.Column(type: "TEXT", nullable: false), - time_of_day = table.Column(type: "TEXT", nullable: false), - workdays_only = table.Column(type: "INTEGER", nullable: false, defaultValue: true), - enabled = table.Column(type: "INTEGER", nullable: false, defaultValue: true), - last_run_at = table.Column(type: "TEXT", nullable: true), - prompt_override = table.Column(type: "TEXT", nullable: true), - created_at = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_prime_schedules", x => x.id); - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "prime_schedules"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260519044715_RemoveTags.Designer.cs b/src/ClaudeDo.Data/Migrations/20260519044715_RemoveTags.Designer.cs deleted file mode 100644 index 82d70359..00000000 --- a/src/ClaudeDo.Data/Migrations/20260519044715_RemoveTags.Designer.cs +++ /dev/null @@ -1,587 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260519044715_RemoveTags")] - partial class RemoveTags - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.Property("WorkdaysOnly") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("workdays_only"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260519044715_RemoveTags.cs b/src/ClaudeDo.Data/Migrations/20260519044715_RemoveTags.cs deleted file mode 100644 index c2202067..00000000 --- a/src/ClaudeDo.Data/Migrations/20260519044715_RemoveTags.cs +++ /dev/null @@ -1,115 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class RemoveTags : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "list_tags"); - - migrationBuilder.DropTable( - name: "task_tags"); - - migrationBuilder.DropTable( - name: "tags"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "tags", - columns: table => new - { - id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - name = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_tags", x => x.id); - }); - - migrationBuilder.CreateTable( - name: "list_tags", - columns: table => new - { - list_id = table.Column(type: "TEXT", nullable: false), - tag_id = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_list_tags", x => new { x.list_id, x.tag_id }); - table.ForeignKey( - name: "FK_list_tags_lists_list_id", - column: x => x.list_id, - principalTable: "lists", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_list_tags_tags_tag_id", - column: x => x.tag_id, - principalTable: "tags", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "task_tags", - columns: table => new - { - task_id = table.Column(type: "TEXT", nullable: false), - tag_id = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_task_tags", x => new { x.task_id, x.tag_id }); - table.ForeignKey( - name: "FK_task_tags_tags_tag_id", - column: x => x.tag_id, - principalTable: "tags", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_task_tags_tasks_task_id", - column: x => x.task_id, - principalTable: "tasks", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.InsertData( - table: "tags", - columns: new[] { "id", "name" }, - values: new object[,] - { - { 1L, "agent" }, - { 2L, "manual" } - }); - - migrationBuilder.CreateIndex( - name: "IX_list_tags_tag_id", - table: "list_tags", - column: "tag_id"); - - migrationBuilder.CreateIndex( - name: "IX_tags_name", - table: "tags", - column: "name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_task_tags_tag_id", - table: "task_tags", - column: "tag_id"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260529142614_AddRepoImportFolders.Designer.cs b/src/ClaudeDo.Data/Migrations/20260529142614_AddRepoImportFolders.Designer.cs deleted file mode 100644 index 0506d104..00000000 --- a/src/ClaudeDo.Data/Migrations/20260529142614_AddRepoImportFolders.Designer.cs +++ /dev/null @@ -1,591 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260529142614_AddRepoImportFolders")] - partial class AddRepoImportFolders - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.Property("WorkdaysOnly") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("workdays_only"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260529142614_AddRepoImportFolders.cs b/src/ClaudeDo.Data/Migrations/20260529142614_AddRepoImportFolders.cs deleted file mode 100644 index 537291c0..00000000 --- a/src/ClaudeDo.Data/Migrations/20260529142614_AddRepoImportFolders.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddRepoImportFolders : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "repo_import_folders", - table: "app_settings", - type: "TEXT", - nullable: true); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - column: "repo_import_folders", - value: null); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "repo_import_folders", - table: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260601114247_AddListSortOrder.Designer.cs b/src/ClaudeDo.Data/Migrations/20260601114247_AddListSortOrder.Designer.cs deleted file mode 100644 index 3cd274a4..00000000 --- a/src/ClaudeDo.Data/Migrations/20260601114247_AddListSortOrder.Designer.cs +++ /dev/null @@ -1,600 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260601114247_AddListSortOrder")] - partial class AddListSortOrder - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.Property("WorkdaysOnly") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("workdays_only"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260601114247_AddListSortOrder.cs b/src/ClaudeDo.Data/Migrations/20260601114247_AddListSortOrder.cs deleted file mode 100644 index 36716c4c..00000000 --- a/src/ClaudeDo.Data/Migrations/20260601114247_AddListSortOrder.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddListSortOrder : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "sort_order", - table: "lists", - type: "INTEGER", - nullable: false, - defaultValue: 0); - - // Backfill existing rows with a dense order (0..N-1) by creation time - // so today's sidebar order is preserved after the migration. - migrationBuilder.Sql(""" - WITH ordered AS ( - SELECT id, (row_number() OVER (ORDER BY created_at) - 1) AS rn - FROM lists - ) - UPDATE lists SET sort_order = (SELECT rn FROM ordered WHERE ordered.id = lists.id); - """); - - migrationBuilder.CreateIndex( - name: "idx_lists_sort", - table: "lists", - column: "sort_order"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "idx_lists_sort", - table: "lists"); - - migrationBuilder.DropColumn( - name: "sort_order", - table: "lists"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260601133737_AddMaxParallelExecutions.Designer.cs b/src/ClaudeDo.Data/Migrations/20260601133737_AddMaxParallelExecutions.Designer.cs deleted file mode 100644 index a1b12f6f..00000000 --- a/src/ClaudeDo.Data/Migrations/20260601133737_AddMaxParallelExecutions.Designer.cs +++ /dev/null @@ -1,607 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260601133737_AddMaxParallelExecutions")] - partial class AddMaxParallelExecutions - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.Property("WorkdaysOnly") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("workdays_only"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260601133737_AddMaxParallelExecutions.cs b/src/ClaudeDo.Data/Migrations/20260601133737_AddMaxParallelExecutions.cs deleted file mode 100644 index 089844df..00000000 --- a/src/ClaudeDo.Data/Migrations/20260601133737_AddMaxParallelExecutions.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddMaxParallelExecutions : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "max_parallel_executions", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 1); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - column: "max_parallel_executions", - value: 1); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "max_parallel_executions", - table: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260601140000_NormalizeListIdFormat.Designer.cs b/src/ClaudeDo.Data/Migrations/20260601140000_NormalizeListIdFormat.Designer.cs deleted file mode 100644 index 77e60e55..00000000 --- a/src/ClaudeDo.Data/Migrations/20260601140000_NormalizeListIdFormat.Designer.cs +++ /dev/null @@ -1,607 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260601140000_NormalizeListIdFormat")] - partial class NormalizeListIdFormat - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.Property("WorkdaysOnly") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("workdays_only"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260601140000_NormalizeListIdFormat.cs b/src/ClaudeDo.Data/Migrations/20260601140000_NormalizeListIdFormat.cs deleted file mode 100644 index 82e10627..00000000 --- a/src/ClaudeDo.Data/Migrations/20260601140000_NormalizeListIdFormat.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class NormalizeListIdFormat : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - // SQLite: PRAGMA foreign_keys must run outside a transaction. - migrationBuilder.Sql("PRAGMA foreign_keys = OFF;", suppressTransaction: true); - - // Normalize tasks.list_id: 32-char compact hex → 36-char dashed UUID - migrationBuilder.Sql(""" - UPDATE tasks - SET list_id = substr(list_id,1,8)||'-'||substr(list_id,9,4)||'-'||substr(list_id,13,4)||'-'||substr(list_id,17,4)||'-'||substr(list_id,21,12) - WHERE length(list_id) = 32; - """); - - // Normalize list_config.list_id (also the PK of that table) - migrationBuilder.Sql(""" - UPDATE list_config - SET list_id = substr(list_id,1,8)||'-'||substr(list_id,9,4)||'-'||substr(list_id,13,4)||'-'||substr(list_id,17,4)||'-'||substr(list_id,21,12) - WHERE length(list_id) = 32; - """); - - // Normalize lists.id (PK — must come last) - migrationBuilder.Sql(""" - UPDATE lists - SET id = substr(id,1,8)||'-'||substr(id,9,4)||'-'||substr(id,13,4)||'-'||substr(id,17,4)||'-'||substr(id,21,12) - WHERE length(id) = 32; - """); - - migrationBuilder.Sql("PRAGMA foreign_keys = ON;", suppressTransaction: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.Sql("PRAGMA foreign_keys = OFF;", suppressTransaction: true); - - migrationBuilder.Sql("UPDATE tasks SET list_id = replace(list_id,'-','') WHERE length(list_id) = 36;"); - migrationBuilder.Sql("UPDATE list_config SET list_id = replace(list_id,'-','') WHERE length(list_id) = 36;"); - migrationBuilder.Sql("UPDATE lists SET id = replace(id,'-','') WHERE length(id) = 36;"); - - migrationBuilder.Sql("PRAGMA foreign_keys = ON;", suppressTransaction: true); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260601150820_AddReviewFeedback.Designer.cs b/src/ClaudeDo.Data/Migrations/20260601150820_AddReviewFeedback.Designer.cs deleted file mode 100644 index 0bb383f8..00000000 --- a/src/ClaudeDo.Data/Migrations/20260601150820_AddReviewFeedback.Designer.cs +++ /dev/null @@ -1,611 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260601150820_AddReviewFeedback")] - partial class AddReviewFeedback - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.Property("WorkdaysOnly") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("workdays_only"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260601150820_AddReviewFeedback.cs b/src/ClaudeDo.Data/Migrations/20260601150820_AddReviewFeedback.cs deleted file mode 100644 index 645f3764..00000000 --- a/src/ClaudeDo.Data/Migrations/20260601150820_AddReviewFeedback.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddReviewFeedback : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "review_feedback", - table: "tasks", - type: "TEXT", - nullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "review_feedback", - table: "tasks"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260602060000_PrimeWeekdays.Designer.cs b/src/ClaudeDo.Data/Migrations/20260602060000_PrimeWeekdays.Designer.cs deleted file mode 100644 index 3361c0cb..00000000 --- a/src/ClaudeDo.Data/Migrations/20260602060000_PrimeWeekdays.Designer.cs +++ /dev/null @@ -1,603 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260602060000_PrimeWeekdays")] - partial class PrimeWeekdays - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260602060000_PrimeWeekdays.cs b/src/ClaudeDo.Data/Migrations/20260602060000_PrimeWeekdays.cs deleted file mode 100644 index a36c5ec7..00000000 --- a/src/ClaudeDo.Data/Migrations/20260602060000_PrimeWeekdays.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class PrimeWeekdays : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "days_of_week", - table: "prime_schedules", - type: "INTEGER", - nullable: false, - defaultValue: 31); - - migrationBuilder.Sql( - "UPDATE prime_schedules SET days_of_week = CASE WHEN workdays_only = 1 THEN 31 ELSE 127 END;"); - - migrationBuilder.DropColumn(name: "start_date", table: "prime_schedules"); - migrationBuilder.DropColumn(name: "end_date", table: "prime_schedules"); - migrationBuilder.DropColumn(name: "workdays_only", table: "prime_schedules"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "start_date", table: "prime_schedules", - type: "TEXT", nullable: false, defaultValue: new DateOnly(2000, 1, 1)); - migrationBuilder.AddColumn( - name: "end_date", table: "prime_schedules", - type: "TEXT", nullable: false, defaultValue: new DateOnly(2099, 12, 31)); - migrationBuilder.AddColumn( - name: "workdays_only", table: "prime_schedules", - type: "INTEGER", nullable: false, defaultValue: true); - - migrationBuilder.Sql( - "UPDATE prime_schedules SET workdays_only = CASE WHEN days_of_week = 127 THEN 0 ELSE 1 END;"); - - migrationBuilder.DropColumn(name: "days_of_week", table: "prime_schedules"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260603072822_WeeklyReport.Designer.cs b/src/ClaudeDo.Data/Migrations/20260603072822_WeeklyReport.Designer.cs deleted file mode 100644 index 0ccb9c27..00000000 --- a/src/ClaudeDo.Data/Migrations/20260603072822_WeeklyReport.Designer.cs +++ /dev/null @@ -1,675 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260603072822_WeeklyReport")] - partial class WeeklyReport - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260603072822_WeeklyReport.cs b/src/ClaudeDo.Data/Migrations/20260603072822_WeeklyReport.cs deleted file mode 100644 index 491a6007..00000000 --- a/src/ClaudeDo.Data/Migrations/20260603072822_WeeklyReport.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class WeeklyReport : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "report_excluded_paths", - table: "app_settings", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "standup_weekday", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 3); - - migrationBuilder.CreateTable( - name: "daily_notes", - columns: table => new - { - id = table.Column(type: "TEXT", nullable: false), - note_date = table.Column(type: "TEXT", nullable: false), - text = table.Column(type: "TEXT", nullable: false), - sort_order = table.Column(type: "INTEGER", nullable: false), - created_at = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_daily_notes", x => x.id); - }); - - migrationBuilder.CreateTable( - name: "week_reports", - columns: table => new - { - id = table.Column(type: "TEXT", nullable: false), - start_date = table.Column(type: "TEXT", nullable: false), - end_date = table.Column(type: "TEXT", nullable: false), - markdown = table.Column(type: "TEXT", nullable: false), - generated_at = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_week_reports", x => x.id); - }); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - columns: new[] { "report_excluded_paths", "standup_weekday" }, - values: new object[] { null, 3 }); - - migrationBuilder.CreateIndex( - name: "IX_daily_notes_note_date", - table: "daily_notes", - column: "note_date"); - - migrationBuilder.CreateIndex( - name: "IX_week_reports_start_date_end_date", - table: "week_reports", - columns: new[] { "start_date", "end_date" }, - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "daily_notes"); - - migrationBuilder.DropTable( - name: "week_reports"); - - migrationBuilder.DropColumn( - name: "report_excluded_paths", - table: "app_settings"); - - migrationBuilder.DropColumn( - name: "standup_weekday", - table: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260603141020_DailyPrepMaxTasks.Designer.cs b/src/ClaudeDo.Data/Migrations/20260603141020_DailyPrepMaxTasks.Designer.cs deleted file mode 100644 index 0e4d7274..00000000 --- a/src/ClaudeDo.Data/Migrations/20260603141020_DailyPrepMaxTasks.Designer.cs +++ /dev/null @@ -1,682 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260603141020_DailyPrepMaxTasks")] - partial class DailyPrepMaxTasks - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260603141020_DailyPrepMaxTasks.cs b/src/ClaudeDo.Data/Migrations/20260603141020_DailyPrepMaxTasks.cs deleted file mode 100644 index a85d0aa8..00000000 --- a/src/ClaudeDo.Data/Migrations/20260603141020_DailyPrepMaxTasks.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class DailyPrepMaxTasks : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "daily_prep_max_tasks", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 5); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - column: "daily_prep_max_tasks", - value: 5); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "daily_prep_max_tasks", - table: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260604101453_InheritableMaxTurns.Designer.cs b/src/ClaudeDo.Data/Migrations/20260604101453_InheritableMaxTurns.Designer.cs deleted file mode 100644 index d52f2c25..00000000 --- a/src/ClaudeDo.Data/Migrations/20260604101453_InheritableMaxTurns.Designer.cs +++ /dev/null @@ -1,690 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260604101453_InheritableMaxTurns")] - partial class InheritableMaxTurns - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260604101453_InheritableMaxTurns.cs b/src/ClaudeDo.Data/Migrations/20260604101453_InheritableMaxTurns.cs deleted file mode 100644 index 96bad04c..00000000 --- a/src/ClaudeDo.Data/Migrations/20260604101453_InheritableMaxTurns.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class InheritableMaxTurns : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "max_turns", - table: "tasks", - type: "INTEGER", - nullable: true); - - migrationBuilder.AddColumn( - name: "max_turns", - table: "list_config", - type: "INTEGER", - nullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "max_turns", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "max_turns", - table: "list_config"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260604125720_AddRoadblockCount.Designer.cs b/src/ClaudeDo.Data/Migrations/20260604125720_AddRoadblockCount.Designer.cs deleted file mode 100644 index 9f023a8c..00000000 --- a/src/ClaudeDo.Data/Migrations/20260604125720_AddRoadblockCount.Designer.cs +++ /dev/null @@ -1,696 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260604125720_AddRoadblockCount")] - partial class AddRoadblockCount - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260604125720_AddRoadblockCount.cs b/src/ClaudeDo.Data/Migrations/20260604125720_AddRoadblockCount.cs deleted file mode 100644 index 3f490c4d..00000000 --- a/src/ClaudeDo.Data/Migrations/20260604125720_AddRoadblockCount.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddRoadblockCount : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "roadblock_count", - table: "tasks", - type: "INTEGER", - nullable: false, - defaultValue: 0); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "roadblock_count", - table: "tasks"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260609000000_UniqueListName.Designer.cs b/src/ClaudeDo.Data/Migrations/20260609000000_UniqueListName.Designer.cs deleted file mode 100644 index 14770849..00000000 --- a/src/ClaudeDo.Data/Migrations/20260609000000_UniqueListName.Designer.cs +++ /dev/null @@ -1,696 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260609000000_UniqueListName")] - partial class UniqueListName - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260609000000_UniqueListName.cs b/src/ClaudeDo.Data/Migrations/20260609000000_UniqueListName.cs deleted file mode 100644 index a687b8ef..00000000 --- a/src/ClaudeDo.Data/Migrations/20260609000000_UniqueListName.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class UniqueListName : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - // Remove duplicate list rows that have no tasks — keep the oldest rowid. - // This handles the startup-race case where both App and Worker seeded - // the same default list names concurrently. - migrationBuilder.Sql(""" - DELETE FROM lists - WHERE (SELECT COUNT(*) FROM tasks WHERE list_id = lists.id) = 0 - AND rowid NOT IN ( - SELECT MIN(l2.rowid) FROM lists l2 WHERE l2.name = lists.name - ) - """); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260622150934_AddTaskAttachments.Designer.cs b/src/ClaudeDo.Data/Migrations/20260622150934_AddTaskAttachments.Designer.cs deleted file mode 100644 index 1c6b6b25..00000000 --- a/src/ClaudeDo.Data/Migrations/20260622150934_AddTaskAttachments.Designer.cs +++ /dev/null @@ -1,739 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260622150934_AddTaskAttachments")] - partial class AddTaskAttachments - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260622150934_AddTaskAttachments.cs b/src/ClaudeDo.Data/Migrations/20260622150934_AddTaskAttachments.cs deleted file mode 100644 index f2780df6..00000000 --- a/src/ClaudeDo.Data/Migrations/20260622150934_AddTaskAttachments.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddTaskAttachments : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "task_attachments", - columns: table => new - { - id = table.Column(type: "TEXT", nullable: false), - task_id = table.Column(type: "TEXT", nullable: false), - file_name = table.Column(type: "TEXT", nullable: false), - byte_size = table.Column(type: "INTEGER", nullable: false), - created_at = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_task_attachments", x => x.id); - table.ForeignKey( - name: "FK_task_attachments_tasks_task_id", - column: x => x.task_id, - principalTable: "tasks", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "idx_task_attachments_task_id", - table: "task_attachments", - column: "task_id"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "task_attachments"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260703072917_AddSessionSkills.Designer.cs b/src/ClaudeDo.Data/Migrations/20260703072917_AddSessionSkills.Designer.cs deleted file mode 100644 index 6e83e0f9..00000000 --- a/src/ClaudeDo.Data/Migrations/20260703072917_AddSessionSkills.Designer.cs +++ /dev/null @@ -1,786 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260703072917_AddSessionSkills")] - partial class AddSessionSkills - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260703072917_AddSessionSkills.cs b/src/ClaudeDo.Data/Migrations/20260703072917_AddSessionSkills.cs deleted file mode 100644 index 1de4db47..00000000 --- a/src/ClaudeDo.Data/Migrations/20260703072917_AddSessionSkills.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddSessionSkills : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "session_skills", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "session_skills", - table: "list_config", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "session_skills", - table: "app_settings", - type: "TEXT", - nullable: true); - - migrationBuilder.CreateTable( - name: "session_skills", - columns: table => new - { - name = table.Column(type: "TEXT", nullable: false), - source_url = table.Column(type: "TEXT", nullable: false), - pinned_ref = table.Column(type: "TEXT", nullable: false), - subpath = table.Column(type: "TEXT", nullable: false), - description = table.Column(type: "TEXT", nullable: false), - added_at = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_session_skills", x => x.name); - }); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - column: "session_skills", - value: null); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "session_skills"); - - migrationBuilder.DropColumn( - name: "session_skills", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "session_skills", - table: "list_config"); - - migrationBuilder.DropColumn( - name: "session_skills", - table: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260727114206_AddModelPresetsAndManualFlag.Designer.cs b/src/ClaudeDo.Data/Migrations/20260727114206_AddModelPresetsAndManualFlag.Designer.cs deleted file mode 100644 index 836240fd..00000000 --- a/src/ClaudeDo.Data/Migrations/20260727114206_AddModelPresetsAndManualFlag.Designer.cs +++ /dev/null @@ -1,802 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260727114206_AddModelPresetsAndManualFlag")] - partial class AddModelPresetsAndManualFlag - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260727114206_AddModelPresetsAndManualFlag.cs b/src/ClaudeDo.Data/Migrations/20260727114206_AddModelPresetsAndManualFlag.cs deleted file mode 100644 index 7d13e4af..00000000 --- a/src/ClaudeDo.Data/Migrations/20260727114206_AddModelPresetsAndManualFlag.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddModelPresetsAndManualFlag : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "is_manual", - table: "tasks", - type: "INTEGER", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "is_manual", - table: "lists", - type: "INTEGER", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "model_presets", - table: "app_settings", - type: "TEXT", - nullable: true); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - column: "model_presets", - value: null); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "is_manual", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "is_manual", - table: "lists"); - - migrationBuilder.DropColumn( - name: "model_presets", - table: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805065217_AddHandlerCommitRange.Designer.cs b/src/ClaudeDo.Data/Migrations/20260805065217_AddHandlerCommitRange.Designer.cs deleted file mode 100644 index 1e0233cf..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805065217_AddHandlerCommitRange.Designer.cs +++ /dev/null @@ -1,810 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260805065217_AddHandlerCommitRange")] - partial class AddHandlerCommitRange - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805065217_AddHandlerCommitRange.cs b/src/ClaudeDo.Data/Migrations/20260805065217_AddHandlerCommitRange.cs deleted file mode 100644 index a06bf764..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805065217_AddHandlerCommitRange.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddHandlerCommitRange : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "handler_base_commit", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "handler_head_commit", - table: "tasks", - type: "TEXT", - nullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "handler_base_commit", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "handler_head_commit", - table: "tasks"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805074906_AddUsageGateAndRunModel.Designer.cs b/src/ClaudeDo.Data/Migrations/20260805074906_AddUsageGateAndRunModel.Designer.cs deleted file mode 100644 index 67631dd8..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805074906_AddUsageGateAndRunModel.Designer.cs +++ /dev/null @@ -1,828 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260805074906_AddUsageGateAndRunModel")] - partial class AddUsageGateAndRunModel - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805074906_AddUsageGateAndRunModel.cs b/src/ClaudeDo.Data/Migrations/20260805074906_AddUsageGateAndRunModel.cs deleted file mode 100644 index 242cc7d1..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805074906_AddUsageGateAndRunModel.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddUsageGateAndRunModel : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "model", - table: "task_runs", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "usage_gate_five_hour_pct", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 80); - - migrationBuilder.AddColumn( - name: "usage_gate_seven_day_pct", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 90); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - columns: new[] { "usage_gate_five_hour_pct", "usage_gate_seven_day_pct" }, - values: new object[] { 80, 90 }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "model", - table: "task_runs"); - - migrationBuilder.DropColumn( - name: "usage_gate_five_hour_pct", - table: "app_settings"); - - migrationBuilder.DropColumn( - name: "usage_gate_seven_day_pct", - table: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805090016_AddVerifyCommand.Designer.cs b/src/ClaudeDo.Data/Migrations/20260805090016_AddVerifyCommand.Designer.cs deleted file mode 100644 index e72c471f..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805090016_AddVerifyCommand.Designer.cs +++ /dev/null @@ -1,832 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260805090016_AddVerifyCommand")] - partial class AddVerifyCommand - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805090016_AddVerifyCommand.cs b/src/ClaudeDo.Data/Migrations/20260805090016_AddVerifyCommand.cs deleted file mode 100644 index f89a2a43..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805090016_AddVerifyCommand.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddVerifyCommand : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "verify_command", - table: "list_config", - type: "TEXT", - nullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "verify_command", - table: "list_config"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805091910_AddWorktreeMergeCommit.Designer.cs b/src/ClaudeDo.Data/Migrations/20260805091910_AddWorktreeMergeCommit.Designer.cs deleted file mode 100644 index b04c77f6..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805091910_AddWorktreeMergeCommit.Designer.cs +++ /dev/null @@ -1,832 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260805091910_AddWorktreeMergeCommit")] - partial class AddWorktreeMergeCommit - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805091910_AddWorktreeMergeCommit.cs b/src/ClaudeDo.Data/Migrations/20260805091910_AddWorktreeMergeCommit.cs deleted file mode 100644 index c403c0e5..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805091910_AddWorktreeMergeCommit.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddWorktreeMergeCommit : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "merge_commit", - table: "worktrees", - type: "TEXT", - nullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "merge_commit", - table: "worktrees"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805132052_AddMaxTurnsCeiling.Designer.cs b/src/ClaudeDo.Data/Migrations/20260805132052_AddMaxTurnsCeiling.Designer.cs deleted file mode 100644 index ee1739cd..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805132052_AddMaxTurnsCeiling.Designer.cs +++ /dev/null @@ -1,843 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260805132052_AddMaxTurnsCeiling")] - partial class AddMaxTurnsCeiling - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(40) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("MaxTurnsCeiling") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("max_turns_ceiling"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 40, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - MaxTurnsCeiling = 80, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805132052_AddMaxTurnsCeiling.cs b/src/ClaudeDo.Data/Migrations/20260805132052_AddMaxTurnsCeiling.cs deleted file mode 100644 index 917b9ab8..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805132052_AddMaxTurnsCeiling.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddMaxTurnsCeiling : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "default_max_turns", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 40, - oldClrType: typeof(int), - oldType: "INTEGER", - oldDefaultValue: 30); - - migrationBuilder.AddColumn( - name: "max_turns_ceiling", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 80); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - columns: new[] { "default_max_turns", "max_turns_ceiling" }, - values: new object[] { 40, 80 }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "max_turns_ceiling", - table: "app_settings"); - - migrationBuilder.AlterColumn( - name: "default_max_turns", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 30, - oldClrType: typeof(int), - oldType: "INTEGER", - oldDefaultValue: 40); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - column: "default_max_turns", - value: 100); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805132801_AddRunCacheTokens.Designer.cs b/src/ClaudeDo.Data/Migrations/20260805132801_AddRunCacheTokens.Designer.cs deleted file mode 100644 index 1ab8a6df..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805132801_AddRunCacheTokens.Designer.cs +++ /dev/null @@ -1,844 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260805132801_AddRunCacheTokens")] - partial class AddRunCacheTokens - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CacheReadTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_read_tokens"); - - b.Property("CacheWriteTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_write_tokens"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805132801_AddRunCacheTokens.cs b/src/ClaudeDo.Data/Migrations/20260805132801_AddRunCacheTokens.cs deleted file mode 100644 index 1a460707..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805132801_AddRunCacheTokens.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddRunCacheTokens : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "cache_read_tokens", - table: "task_runs", - type: "INTEGER", - nullable: true); - - migrationBuilder.AddColumn( - name: "cache_write_tokens", - table: "task_runs", - type: "INTEGER", - nullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "cache_read_tokens", - table: "task_runs"); - - migrationBuilder.DropColumn( - name: "cache_write_tokens", - table: "task_runs"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805133429_AddUsageThrottleThresholds.Designer.cs b/src/ClaudeDo.Data/Migrations/20260805133429_AddUsageThrottleThresholds.Designer.cs deleted file mode 100644 index b0eeea84..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805133429_AddUsageThrottleThresholds.Designer.cs +++ /dev/null @@ -1,850 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260805133429_AddUsageThrottleThresholds")] - partial class AddUsageThrottleThresholds - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(30) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("UsageThrottleHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_hard_pct"); - - b.Property("UsageThrottleSoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_soft_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 100, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - UsageThrottleHardPct = 65, - UsageThrottleSoftPct = 50, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260805133429_AddUsageThrottleThresholds.cs b/src/ClaudeDo.Data/Migrations/20260805133429_AddUsageThrottleThresholds.cs deleted file mode 100644 index 96b819b5..00000000 --- a/src/ClaudeDo.Data/Migrations/20260805133429_AddUsageThrottleThresholds.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddUsageThrottleThresholds : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "usage_throttle_hard_pct", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 65); - - migrationBuilder.AddColumn( - name: "usage_throttle_soft_pct", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 50); - - migrationBuilder.UpdateData( - table: "app_settings", - keyColumn: "id", - keyValue: 1, - columns: new[] { "usage_throttle_hard_pct", "usage_throttle_soft_pct" }, - values: new object[] { 65, 50 }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "usage_throttle_hard_pct", - table: "app_settings"); - - migrationBuilder.DropColumn( - name: "usage_throttle_soft_pct", - table: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260806111454_AddInteractiveSessionId.Designer.cs b/src/ClaudeDo.Data/Migrations/20260806111454_AddInteractiveSessionId.Designer.cs deleted file mode 100644 index 35741f74..00000000 --- a/src/ClaudeDo.Data/Migrations/20260806111454_AddInteractiveSessionId.Designer.cs +++ /dev/null @@ -1,869 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260806111454_AddInteractiveSessionId")] - partial class AddInteractiveSessionId - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(40) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("MaxTurnsCeiling") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("max_turns_ceiling"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("UsageThrottleHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_hard_pct"); - - b.Property("UsageThrottleSoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_soft_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 40, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - MaxTurnsCeiling = 80, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - UsageThrottleHardPct = 65, - UsageThrottleSoftPct = 50, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("InteractiveSessionId") - .HasColumnType("TEXT") - .HasColumnName("interactive_session_id"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CacheReadTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_read_tokens"); - - b.Property("CacheWriteTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_write_tokens"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260806111454_AddInteractiveSessionId.cs b/src/ClaudeDo.Data/Migrations/20260806111454_AddInteractiveSessionId.cs deleted file mode 100644 index ef0d71c0..00000000 --- a/src/ClaudeDo.Data/Migrations/20260806111454_AddInteractiveSessionId.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddInteractiveSessionId : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "interactive_session_id", - table: "tasks", - type: "TEXT", - nullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "interactive_session_id", - table: "tasks"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260806141710_SplitUsageThrottlePerBucket.Designer.cs b/src/ClaudeDo.Data/Migrations/20260806141710_SplitUsageThrottlePerBucket.Designer.cs deleted file mode 100644 index 545c4758..00000000 --- a/src/ClaudeDo.Data/Migrations/20260806141710_SplitUsageThrottlePerBucket.Designer.cs +++ /dev/null @@ -1,883 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260806141710_SplitUsageThrottlePerBucket")] - partial class SplitUsageThrottlePerBucket - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(40) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("MaxTurnsCeiling") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("max_turns_ceiling"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("UsageThrottleFiveHourHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_five_hour_hard_pct"); - - b.Property("UsageThrottleFiveHourSoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_five_hour_soft_pct"); - - b.Property("UsageThrottleSevenDayHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_seven_day_hard_pct"); - - b.Property("UsageThrottleSevenDaySoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_seven_day_soft_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 40, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - MaxTurnsCeiling = 80, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - UsageThrottleFiveHourHardPct = 65, - UsageThrottleFiveHourSoftPct = 50, - UsageThrottleSevenDayHardPct = 65, - UsageThrottleSevenDaySoftPct = 50, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("InteractiveSessionId") - .HasColumnType("TEXT") - .HasColumnName("interactive_session_id"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CacheReadTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_read_tokens"); - - b.Property("CacheWriteTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_write_tokens"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260806141710_SplitUsageThrottlePerBucket.cs b/src/ClaudeDo.Data/Migrations/20260806141710_SplitUsageThrottlePerBucket.cs deleted file mode 100644 index 25f18668..00000000 --- a/src/ClaudeDo.Data/Migrations/20260806141710_SplitUsageThrottlePerBucket.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class SplitUsageThrottlePerBucket : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.RenameColumn( - name: "usage_throttle_soft_pct", - table: "app_settings", - newName: "usage_throttle_seven_day_soft_pct"); - - migrationBuilder.RenameColumn( - name: "usage_throttle_hard_pct", - table: "app_settings", - newName: "usage_throttle_seven_day_hard_pct"); - - migrationBuilder.AddColumn( - name: "usage_throttle_five_hour_hard_pct", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 65); - - migrationBuilder.AddColumn( - name: "usage_throttle_five_hour_soft_pct", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 50); - - // The old single soft/hard pair was compared against whichever bucket was more utilized, - // so carrying it into BOTH buckets keeps an existing install behaving exactly as before - // the split — the rename above already preserved it for the 7d side. - migrationBuilder.Sql( - """ - UPDATE app_settings - SET usage_throttle_five_hour_soft_pct = usage_throttle_seven_day_soft_pct, - usage_throttle_five_hour_hard_pct = usage_throttle_seven_day_hard_pct; - """); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "usage_throttle_five_hour_hard_pct", - table: "app_settings"); - - migrationBuilder.DropColumn( - name: "usage_throttle_five_hour_soft_pct", - table: "app_settings"); - - migrationBuilder.RenameColumn( - name: "usage_throttle_seven_day_soft_pct", - table: "app_settings", - newName: "usage_throttle_soft_pct"); - - migrationBuilder.RenameColumn( - name: "usage_throttle_seven_day_hard_pct", - table: "app_settings", - newName: "usage_throttle_hard_pct"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260810080113_AddFindingsTracked.Designer.cs b/src/ClaudeDo.Data/Migrations/20260810080113_AddFindingsTracked.Designer.cs deleted file mode 100644 index f43edad3..00000000 --- a/src/ClaudeDo.Data/Migrations/20260810080113_AddFindingsTracked.Designer.cs +++ /dev/null @@ -1,889 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260810080113_AddFindingsTracked")] - partial class AddFindingsTracked - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(40) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("MaxTurnsCeiling") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("max_turns_ceiling"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("UsageThrottleFiveHourHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_five_hour_hard_pct"); - - b.Property("UsageThrottleFiveHourSoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_five_hour_soft_pct"); - - b.Property("UsageThrottleSevenDayHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_seven_day_hard_pct"); - - b.Property("UsageThrottleSevenDaySoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_seven_day_soft_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 40, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - MaxTurnsCeiling = 80, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - UsageThrottleFiveHourHardPct = 65, - UsageThrottleFiveHourSoftPct = 50, - UsageThrottleSevenDayHardPct = 65, - UsageThrottleSevenDaySoftPct = 50, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("FindingsTracked") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("findings_tracked"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("InteractiveSessionId") - .HasColumnType("TEXT") - .HasColumnName("interactive_session_id"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CacheReadTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_read_tokens"); - - b.Property("CacheWriteTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_write_tokens"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260810080113_AddFindingsTracked.cs b/src/ClaudeDo.Data/Migrations/20260810080113_AddFindingsTracked.cs deleted file mode 100644 index 20077faa..00000000 --- a/src/ClaudeDo.Data/Migrations/20260810080113_AddFindingsTracked.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddFindingsTracked : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "findings_tracked", - table: "lists", - type: "INTEGER", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "findings_tracked", - table: "lists"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260810113643_AddScopeOverlapFields.Designer.cs b/src/ClaudeDo.Data/Migrations/20260810113643_AddScopeOverlapFields.Designer.cs deleted file mode 100644 index d2f26cf1..00000000 --- a/src/ClaudeDo.Data/Migrations/20260810113643_AddScopeOverlapFields.Designer.cs +++ /dev/null @@ -1,899 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260810113643_AddScopeOverlapFields")] - partial class AddScopeOverlapFields - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(40) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("MaxTurnsCeiling") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("max_turns_ceiling"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("UsageThrottleFiveHourHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_five_hour_hard_pct"); - - b.Property("UsageThrottleFiveHourSoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_five_hour_soft_pct"); - - b.Property("UsageThrottleSevenDayHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_seven_day_hard_pct"); - - b.Property("UsageThrottleSevenDaySoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_seven_day_soft_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 40, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - MaxTurnsCeiling = 80, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - UsageThrottleFiveHourHardPct = 65, - UsageThrottleFiveHourSoftPct = 50, - UsageThrottleSevenDayHardPct = 65, - UsageThrottleSevenDaySoftPct = 50, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SerializeOnFileOverlap") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("serialize_on_file_overlap"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("FindingsTracked") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("findings_tracked"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("InteractiveSessionId") - .HasColumnType("TEXT") - .HasColumnName("interactive_session_id"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("ScopeGlobs") - .HasColumnType("TEXT") - .HasColumnName("scope_globs"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CacheReadTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_read_tokens"); - - b.Property("CacheWriteTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_write_tokens"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260810113643_AddScopeOverlapFields.cs b/src/ClaudeDo.Data/Migrations/20260810113643_AddScopeOverlapFields.cs deleted file mode 100644 index 4301257b..00000000 --- a/src/ClaudeDo.Data/Migrations/20260810113643_AddScopeOverlapFields.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddScopeOverlapFields : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "scope_globs", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "serialize_on_file_overlap", - table: "list_config", - type: "INTEGER", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "scope_globs", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "serialize_on_file_overlap", - table: "list_config"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260810115110_AddTaskDependency.Designer.cs b/src/ClaudeDo.Data/Migrations/20260810115110_AddTaskDependency.Designer.cs deleted file mode 100644 index 6ae7b440..00000000 --- a/src/ClaudeDo.Data/Migrations/20260810115110_AddTaskDependency.Designer.cs +++ /dev/null @@ -1,905 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260810115110_AddTaskDependency")] - partial class AddTaskDependency - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(40) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("MaxTurnsCeiling") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("max_turns_ceiling"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("UsageThrottleFiveHourHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_five_hour_hard_pct"); - - b.Property("UsageThrottleFiveHourSoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_five_hour_soft_pct"); - - b.Property("UsageThrottleSevenDayHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_seven_day_hard_pct"); - - b.Property("UsageThrottleSevenDaySoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_seven_day_soft_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 40, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - MaxTurnsCeiling = 80, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - UsageThrottleFiveHourHardPct = 65, - UsageThrottleFiveHourSoftPct = 50, - UsageThrottleSevenDayHardPct = 65, - UsageThrottleSevenDaySoftPct = 50, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("FindingsTracked") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("findings_tracked"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("DependsOnTaskId") - .HasColumnType("TEXT") - .HasColumnName("depends_on_task_id"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("InteractiveSessionId") - .HasColumnType("TEXT") - .HasColumnName("interactive_session_id"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("ScopeGlobs") - .HasColumnType("TEXT") - .HasColumnName("scope_globs"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("DependsOnTaskId") - .HasDatabaseName("idx_tasks_depends_on"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CacheReadTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_read_tokens"); - - b.Property("CacheWriteTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_write_tokens"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("DependsOnTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260810115110_AddTaskDependency.cs b/src/ClaudeDo.Data/Migrations/20260810115110_AddTaskDependency.cs deleted file mode 100644 index 7717acd8..00000000 --- a/src/ClaudeDo.Data/Migrations/20260810115110_AddTaskDependency.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddTaskDependency : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "depends_on_task_id", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.CreateIndex( - name: "idx_tasks_depends_on", - table: "tasks", - column: "depends_on_task_id"); - - migrationBuilder.AddForeignKey( - name: "FK_tasks_tasks_depends_on_task_id", - table: "tasks", - column: "depends_on_task_id", - principalTable: "tasks", - principalColumn: "id", - onDelete: ReferentialAction.SetNull); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_tasks_tasks_depends_on_task_id", - table: "tasks"); - - migrationBuilder.DropIndex( - name: "idx_tasks_depends_on", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "depends_on_task_id", - table: "tasks"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260810115437_AddFailureReason.Designer.cs b/src/ClaudeDo.Data/Migrations/20260810115437_AddFailureReason.Designer.cs deleted file mode 100644 index ea960241..00000000 --- a/src/ClaudeDo.Data/Migrations/20260810115437_AddFailureReason.Designer.cs +++ /dev/null @@ -1,913 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260810115437_AddFailureReason")] - partial class AddFailureReason - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(40) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("MaxTurnsCeiling") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("max_turns_ceiling"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("UsageThrottleFiveHourHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_five_hour_hard_pct"); - - b.Property("UsageThrottleFiveHourSoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_five_hour_soft_pct"); - - b.Property("UsageThrottleSevenDayHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_seven_day_hard_pct"); - - b.Property("UsageThrottleSevenDaySoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_seven_day_soft_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 40, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - MaxTurnsCeiling = 80, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - UsageThrottleFiveHourHardPct = 65, - UsageThrottleFiveHourSoftPct = 50, - UsageThrottleSevenDayHardPct = 65, - UsageThrottleSevenDaySoftPct = 50, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("FindingsTracked") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("findings_tracked"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FailureMaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("failure_max_turns"); - - b.Property("FailureReason") - .HasColumnType("TEXT") - .HasColumnName("failure_reason"); - - b.Property("FailureTurnsUsed") - .HasColumnType("INTEGER") - .HasColumnName("failure_turns_used"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("InteractiveSessionId") - .HasColumnType("TEXT") - .HasColumnName("interactive_session_id"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CacheReadTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_read_tokens"); - - b.Property("CacheWriteTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_write_tokens"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("Errors") - .HasColumnType("TEXT") - .HasColumnName("errors"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("ResultSubtype") - .HasColumnType("TEXT") - .HasColumnName("result_subtype"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TerminalReason") - .HasColumnType("TEXT") - .HasColumnName("terminal_reason"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260810115437_AddFailureReason.cs b/src/ClaudeDo.Data/Migrations/20260810115437_AddFailureReason.cs deleted file mode 100644 index 7b8d60f0..00000000 --- a/src/ClaudeDo.Data/Migrations/20260810115437_AddFailureReason.cs +++ /dev/null @@ -1,78 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddFailureReason : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "failure_max_turns", - table: "tasks", - type: "INTEGER", - nullable: true); - - migrationBuilder.AddColumn( - name: "failure_reason", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "failure_turns_used", - table: "tasks", - type: "INTEGER", - nullable: true); - - migrationBuilder.AddColumn( - name: "errors", - table: "task_runs", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "result_subtype", - table: "task_runs", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "terminal_reason", - table: "task_runs", - type: "TEXT", - nullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "failure_max_turns", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "failure_reason", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "failure_turns_used", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "errors", - table: "task_runs"); - - migrationBuilder.DropColumn( - name: "result_subtype", - table: "task_runs"); - - migrationBuilder.DropColumn( - name: "terminal_reason", - table: "task_runs"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260811081530_AddTaskNumbers.Designer.cs b/src/ClaudeDo.Data/Migrations/20260811081530_AddTaskNumbers.Designer.cs deleted file mode 100644 index 101a3d0c..00000000 --- a/src/ClaudeDo.Data/Migrations/20260811081530_AddTaskNumbers.Designer.cs +++ /dev/null @@ -1,950 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260811081530_AddTaskNumbers")] - partial class AddTaskNumbers - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(40) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("MaxTurnsCeiling") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("max_turns_ceiling"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("NextTaskNumber") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("next_task_number"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("UsageThrottleFiveHourHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_five_hour_hard_pct"); - - b.Property("UsageThrottleFiveHourSoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_five_hour_soft_pct"); - - b.Property("UsageThrottleSevenDayHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_seven_day_hard_pct"); - - b.Property("UsageThrottleSevenDaySoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_seven_day_soft_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 40, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - MaxTurnsCeiling = 80, - NextTaskNumber = 1, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - UsageThrottleFiveHourHardPct = 65, - UsageThrottleFiveHourSoftPct = 50, - UsageThrottleSevenDayHardPct = 65, - UsageThrottleSevenDaySoftPct = 50, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SerializeOnFileOverlap") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("serialize_on_file_overlap"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("FindingsTracked") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("findings_tracked"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("DependsOnTaskId") - .HasColumnType("TEXT") - .HasColumnName("depends_on_task_id"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FailureMaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("failure_max_turns"); - - b.Property("FailureReason") - .HasColumnType("TEXT") - .HasColumnName("failure_reason"); - - b.Property("FailureTurnsUsed") - .HasColumnType("INTEGER") - .HasColumnName("failure_turns_used"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("InteractiveSessionId") - .HasColumnType("TEXT") - .HasColumnName("interactive_session_id"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("Number") - .HasColumnType("INTEGER") - .HasColumnName("number"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("ScopeGlobs") - .HasColumnType("TEXT") - .HasColumnName("scope_globs"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("DependsOnTaskId") - .HasDatabaseName("idx_tasks_depends_on"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("Number") - .IsUnique() - .HasDatabaseName("idx_tasks_number"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CacheReadTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_read_tokens"); - - b.Property("CacheWriteTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_write_tokens"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("Errors") - .HasColumnType("TEXT") - .HasColumnName("errors"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("ResultSubtype") - .HasColumnType("TEXT") - .HasColumnName("result_subtype"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TerminalReason") - .HasColumnType("TEXT") - .HasColumnName("terminal_reason"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("DependsOnTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260811081530_AddTaskNumbers.cs b/src/ClaudeDo.Data/Migrations/20260811081530_AddTaskNumbers.cs deleted file mode 100644 index 5f367379..00000000 --- a/src/ClaudeDo.Data/Migrations/20260811081530_AddTaskNumbers.cs +++ /dev/null @@ -1,67 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddTaskNumbers : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "number", - table: "tasks", - type: "INTEGER", - nullable: false, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "next_task_number", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: 1); - - // Backfill in creation order (tiebreak by id) so pre-existing tasks get a stable, - // gapless 1..N numbering. Must run before the unique index below. - migrationBuilder.Sql(""" - UPDATE tasks - SET number = ( - SELECT COUNT(*) FROM tasks t2 - WHERE t2.created_at < tasks.created_at - OR (t2.created_at = tasks.created_at AND t2.id <= tasks.id) - ); - """); - - migrationBuilder.Sql(""" - UPDATE app_settings - SET next_task_number = (SELECT COALESCE(MAX(number), 0) + 1 FROM tasks) - WHERE id = 1; - """); - - migrationBuilder.CreateIndex( - name: "idx_tasks_number", - table: "tasks", - column: "number", - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "idx_tasks_number", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "number", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "next_task_number", - table: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260821155619_AddUsageLimitAutoContinue.Designer.cs b/src/ClaudeDo.Data/Migrations/20260821155619_AddUsageLimitAutoContinue.Designer.cs deleted file mode 100644 index 578bd86a..00000000 --- a/src/ClaudeDo.Data/Migrations/20260821155619_AddUsageLimitAutoContinue.Designer.cs +++ /dev/null @@ -1,961 +0,0 @@ -// -using System; -using ClaudeDo.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260821155619_AddUsageLimitAutoContinue")] - partial class AddUsageLimitAutoContinue - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); - - modelBuilder.Entity("ClaudeDo.Data.Models.AppSettingsEntity", b => - { - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("id"); - - b.Property("AutoContinueOnUsageLimit") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("auto_continue_on_usage_limit"); - - b.Property("CentralWorktreeRoot") - .HasColumnType("TEXT") - .HasColumnName("central_worktree_root"); - - b.Property("DailyPrepMaxTasks") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(5) - .HasColumnName("daily_prep_max_tasks"); - - b.Property("DefaultClaudeInstructions") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("") - .HasColumnName("default_claude_instructions"); - - b.Property("DefaultMaxTurns") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(40) - .HasColumnName("default_max_turns"); - - b.Property("DefaultModel") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sonnet") - .HasColumnName("default_model"); - - b.Property("DefaultPermissionMode") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("bypassPermissions") - .HasColumnName("default_permission_mode"); - - b.Property("MaxParallelExecutions") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("max_parallel_executions"); - - b.Property("MaxTurnsCeiling") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("max_turns_ceiling"); - - b.Property("ModelPresets") - .HasColumnType("TEXT") - .HasColumnName("model_presets"); - - b.Property("NextTaskNumber") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1) - .HasColumnName("next_task_number"); - - b.Property("RepoImportFolders") - .HasColumnType("TEXT") - .HasColumnName("repo_import_folders"); - - b.Property("ReportExcludedPaths") - .HasColumnType("TEXT") - .HasColumnName("report_excluded_paths"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("StandupWeekday") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(3) - .HasColumnName("standup_weekday"); - - b.Property("UsageGateFiveHourPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(80) - .HasColumnName("usage_gate_five_hour_pct"); - - b.Property("UsageGateSevenDayPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(90) - .HasColumnName("usage_gate_seven_day_pct"); - - b.Property("UsageThrottleFiveHourHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_five_hour_hard_pct"); - - b.Property("UsageThrottleFiveHourSoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_five_hour_soft_pct"); - - b.Property("UsageThrottleSevenDayHardPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(65) - .HasColumnName("usage_throttle_seven_day_hard_pct"); - - b.Property("UsageThrottleSevenDaySoftPct") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(50) - .HasColumnName("usage_throttle_seven_day_soft_pct"); - - b.Property("WorktreeAutoCleanupDays") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(7) - .HasColumnName("worktree_auto_cleanup_days"); - - b.Property("WorktreeAutoCleanupEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("worktree_auto_cleanup_enabled"); - - b.Property("WorktreeStrategy") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("sibling") - .HasColumnName("worktree_strategy"); - - b.HasKey("Id"); - - b.ToTable("app_settings", (string)null); - - b.HasData( - new - { - Id = 1, - AutoContinueOnUsageLimit = false, - DailyPrepMaxTasks = 5, - DefaultClaudeInstructions = "", - DefaultMaxTurns = 40, - DefaultModel = "sonnet", - DefaultPermissionMode = "auto", - MaxParallelExecutions = 1, - MaxTurnsCeiling = 80, - NextTaskNumber = 1, - StandupWeekday = 3, - UsageGateFiveHourPct = 80, - UsageGateSevenDayPct = 90, - UsageThrottleFiveHourHardPct = 65, - UsageThrottleFiveHourSoftPct = 50, - UsageThrottleSevenDayHardPct = 65, - UsageThrottleSevenDaySoftPct = 50, - WorktreeAutoCleanupDays = 7, - WorktreeAutoCleanupEnabled = false, - WorktreeStrategy = "sibling" - }); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.DailyNoteEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("note_date"); - - b.Property("SortOrder") - .HasColumnType("INTEGER") - .HasColumnName("sort_order"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("text"); - - b.HasKey("Id"); - - b.HasIndex("Date"); - - b.ToTable("daily_notes", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.Property("ListId") - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("SerializeOnFileOverlap") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("serialize_on_file_overlap"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("VerifyCommand") - .HasColumnType("TEXT") - .HasColumnName("verify_command"); - - b.HasKey("ListId"); - - b.ToTable("list_config", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DefaultCommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("default_commit_type"); - - b.Property("FindingsTracked") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("findings_tracked"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("WorkingDir") - .HasColumnType("TEXT") - .HasColumnName("working_dir"); - - b.HasKey("Id"); - - b.HasIndex("SortOrder") - .HasDatabaseName("idx_lists_sort"); - - b.ToTable("lists", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.PrimeScheduleEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("Days") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(31) - .HasColumnName("days_of_week"); - - b.Property("Enabled") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(true) - .HasColumnName("enabled"); - - b.Property("LastRunAt") - .HasColumnType("TEXT") - .HasColumnName("last_run_at"); - - b.Property("PromptOverride") - .HasColumnType("TEXT") - .HasColumnName("prompt_override"); - - b.Property("TimeOfDay") - .HasColumnType("TEXT") - .HasColumnName("time_of_day"); - - b.HasKey("Id"); - - b.ToTable("prime_schedules", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SessionSkillEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.Property("AddedAt") - .HasColumnType("TEXT") - .HasColumnName("added_at"); - - b.Property("Description") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("PinnedRef") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("pinned_ref"); - - b.Property("SourceUrl") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("source_url"); - - b.Property("Subpath") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("subpath"); - - b.HasKey("Name"); - - b.ToTable("session_skills", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Completed") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("completed"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("OrderNum") - .HasColumnType("INTEGER") - .HasColumnName("order_num"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_subtasks_task_id"); - - b.ToTable("subtasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ByteSize") - .HasColumnType("INTEGER") - .HasColumnName("byte_size"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("file_name"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_attachments_task_id"); - - b.ToTable("task_attachments", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("AgentPath") - .HasColumnType("TEXT") - .HasColumnName("agent_path"); - - b.Property("BlockedByTaskId") - .HasColumnType("TEXT") - .HasColumnName("blocked_by_task_id"); - - b.Property("CommitType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("chore") - .HasColumnName("commit_type"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("TEXT") - .HasColumnName("created_by"); - - b.Property("DependsOnTaskId") - .HasColumnType("TEXT") - .HasColumnName("depends_on_task_id"); - - b.Property("Description") - .HasColumnType("TEXT") - .HasColumnName("description"); - - b.Property("FailureMaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("failure_max_turns"); - - b.Property("FailureReason") - .HasColumnType("TEXT") - .HasColumnName("failure_reason"); - - b.Property("FailureTurnsUsed") - .HasColumnType("INTEGER") - .HasColumnName("failure_turns_used"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("HandlerBaseCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_base_commit"); - - b.Property("HandlerHeadCommit") - .HasColumnType("TEXT") - .HasColumnName("handler_head_commit"); - - b.Property("InteractiveSessionId") - .HasColumnType("TEXT") - .HasColumnName("interactive_session_id"); - - b.Property("IsManual") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_manual"); - - b.Property("IsMyDay") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_my_day"); - - b.Property("IsStarred") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_starred"); - - b.Property("ListId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("list_id"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("MaxTurns") - .HasColumnType("INTEGER") - .HasColumnName("max_turns"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Notes") - .HasColumnType("TEXT") - .HasColumnName("notes"); - - b.Property("Number") - .HasColumnType("INTEGER") - .HasColumnName("number"); - - b.Property("ParentTaskId") - .HasColumnType("TEXT") - .HasColumnName("parent_task_id"); - - b.Property("PlanningFinalizedAt") - .HasColumnType("TEXT") - .HasColumnName("planning_finalized_at"); - - b.Property("PlanningPhase") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("none") - .HasColumnName("planning_phase"); - - b.Property("PlanningSessionId") - .HasColumnType("TEXT") - .HasColumnName("planning_session_id"); - - b.Property("PlanningSessionToken") - .HasColumnType("TEXT") - .HasColumnName("planning_session_token"); - - b.Property("Result") - .HasColumnType("TEXT") - .HasColumnName("result"); - - b.Property("ReviewFeedback") - .HasColumnType("TEXT") - .HasColumnName("review_feedback"); - - b.Property("RoadblockCount") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("roadblock_count"); - - b.Property("ScheduledFor") - .HasColumnType("TEXT") - .HasColumnName("scheduled_for"); - - b.Property("ScopeGlobs") - .HasColumnType("TEXT") - .HasColumnName("scope_globs"); - - b.Property("SessionSkills") - .HasColumnType("TEXT") - .HasColumnName("session_skills"); - - b.Property("SortOrder") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("sort_order"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("SystemPrompt") - .HasColumnType("TEXT") - .HasColumnName("system_prompt"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.Property("UsageLimitAutoContinuedAt") - .HasColumnType("TEXT") - .HasColumnName("usage_limit_auto_continued_at"); - - b.HasKey("Id"); - - b.HasIndex("BlockedByTaskId") - .HasDatabaseName("idx_tasks_blocked_by"); - - b.HasIndex("DependsOnTaskId") - .HasDatabaseName("idx_tasks_depends_on"); - - b.HasIndex("ListId") - .HasDatabaseName("idx_tasks_list_id"); - - b.HasIndex("Number") - .IsUnique() - .HasDatabaseName("idx_tasks_number"); - - b.HasIndex("ParentTaskId") - .HasDatabaseName("idx_tasks_parent_task_id"); - - b.HasIndex("Status") - .HasDatabaseName("idx_tasks_status"); - - b.HasIndex("ListId", "SortOrder") - .HasDatabaseName("idx_tasks_list_sort"); - - b.ToTable("tasks", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CacheReadTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_read_tokens"); - - b.Property("CacheWriteTokens") - .HasColumnType("INTEGER") - .HasColumnName("cache_write_tokens"); - - b.Property("ErrorMarkdown") - .HasColumnType("TEXT") - .HasColumnName("error_markdown"); - - b.Property("Errors") - .HasColumnType("TEXT") - .HasColumnName("errors"); - - b.Property("ExitCode") - .HasColumnType("INTEGER") - .HasColumnName("exit_code"); - - b.Property("FinishedAt") - .HasColumnType("TEXT") - .HasColumnName("finished_at"); - - b.Property("IsRetry") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(false) - .HasColumnName("is_retry"); - - b.Property("LogPath") - .HasColumnType("TEXT") - .HasColumnName("log_path"); - - b.Property("Model") - .HasColumnType("TEXT") - .HasColumnName("model"); - - b.Property("Prompt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("prompt"); - - b.Property("ResultMarkdown") - .HasColumnType("TEXT") - .HasColumnName("result_markdown"); - - b.Property("ResultSubtype") - .HasColumnType("TEXT") - .HasColumnName("result_subtype"); - - b.Property("RunNumber") - .HasColumnType("INTEGER") - .HasColumnName("run_number"); - - b.Property("SessionId") - .HasColumnType("TEXT") - .HasColumnName("session_id"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("StructuredOutputJson") - .HasColumnType("TEXT") - .HasColumnName("structured_output"); - - b.Property("TaskId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("TerminalReason") - .HasColumnType("TEXT") - .HasColumnName("terminal_reason"); - - b.Property("TokensIn") - .HasColumnType("INTEGER") - .HasColumnName("tokens_in"); - - b.Property("TokensOut") - .HasColumnType("INTEGER") - .HasColumnName("tokens_out"); - - b.Property("TurnCount") - .HasColumnType("INTEGER") - .HasColumnName("turn_count"); - - b.HasKey("Id"); - - b.HasIndex("TaskId") - .HasDatabaseName("idx_task_runs_task_id"); - - b.ToTable("task_runs", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WeekReportEntity", b => - { - b.Property("Id") - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("EndDate") - .HasColumnType("TEXT") - .HasColumnName("end_date"); - - b.Property("GeneratedAt") - .HasColumnType("TEXT") - .HasColumnName("generated_at"); - - b.Property("Markdown") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("markdown"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id"); - - b.HasIndex("StartDate", "EndDate") - .IsUnique(); - - b.ToTable("week_reports", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.Property("TaskId") - .HasColumnType("TEXT") - .HasColumnName("task_id"); - - b.Property("BaseCommit") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("base_commit"); - - b.Property("BranchName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("branch_name"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DiffStat") - .HasColumnType("TEXT") - .HasColumnName("diff_stat"); - - b.Property("HeadCommit") - .HasColumnType("TEXT") - .HasColumnName("head_commit"); - - b.Property("MergeCommit") - .HasColumnType("TEXT") - .HasColumnName("merge_commit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("State") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasDefaultValue("active") - .HasColumnName("state"); - - b.HasKey("TaskId"); - - b.ToTable("worktrees", (string)null); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListConfigEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithOne("Config") - .HasForeignKey("ClaudeDo.Data.Models.ListConfigEntity", "ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("List"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.SubtaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Subtasks") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskAttachmentEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany() - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("BlockedByTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", null) - .WithMany() - .HasForeignKey("DependsOnTaskId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("ClaudeDo.Data.Models.ListEntity", "List") - .WithMany("Tasks") - .HasForeignKey("ListId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Parent") - .WithMany("Children") - .HasForeignKey("ParentTaskId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("List"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskRunEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithMany("Runs") - .HasForeignKey("TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.WorktreeEntity", b => - { - b.HasOne("ClaudeDo.Data.Models.TaskEntity", "Task") - .WithOne("Worktree") - .HasForeignKey("ClaudeDo.Data.Models.WorktreeEntity", "TaskId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Task"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.ListEntity", b => - { - b.Navigation("Config"); - - b.Navigation("Tasks"); - }); - - modelBuilder.Entity("ClaudeDo.Data.Models.TaskEntity", b => - { - b.Navigation("Children"); - - b.Navigation("Runs"); - - b.Navigation("Subtasks"); - - b.Navigation("Worktree"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260821155619_AddUsageLimitAutoContinue.cs b/src/ClaudeDo.Data/Migrations/20260821155619_AddUsageLimitAutoContinue.cs deleted file mode 100644 index fe7d59d4..00000000 --- a/src/ClaudeDo.Data/Migrations/20260821155619_AddUsageLimitAutoContinue.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddUsageLimitAutoContinue : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "usage_limit_auto_continued_at", - table: "tasks", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "auto_continue_on_usage_limit", - table: "app_settings", - type: "INTEGER", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "usage_limit_auto_continued_at", - table: "tasks"); - - migrationBuilder.DropColumn( - name: "auto_continue_on_usage_limit", - table: "app_settings"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260825063230_AddPrimeActionKind.cs b/src/ClaudeDo.Data/Migrations/20260825063230_AddPrimeActionKind.cs deleted file mode 100644 index 467bd2e3..00000000 --- a/src/ClaudeDo.Data/Migrations/20260825063230_AddPrimeActionKind.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ClaudeDo.Data.Migrations -{ - /// - public partial class AddPrimeActionKind : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "action_kind", - table: "prime_schedules", - type: "TEXT", - nullable: false, - defaultValue: "ping"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "action_kind", - table: "prime_schedules"); - } - } -} diff --git a/src/ClaudeDo.Data/Migrations/20260825063230_AddPrimeActionKind.Designer.cs b/src/ClaudeDo.Data/Migrations/20260826094154_InitialCreate.Designer.cs similarity index 99% rename from src/ClaudeDo.Data/Migrations/20260825063230_AddPrimeActionKind.Designer.cs rename to src/ClaudeDo.Data/Migrations/20260826094154_InitialCreate.Designer.cs index 119a4524..c91643b5 100644 --- a/src/ClaudeDo.Data/Migrations/20260825063230_AddPrimeActionKind.Designer.cs +++ b/src/ClaudeDo.Data/Migrations/20260826094154_InitialCreate.Designer.cs @@ -11,8 +11,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace ClaudeDo.Data.Migrations { [DbContext(typeof(ClaudeDoDbContext))] - [Migration("20260825063230_AddPrimeActionKind")] - partial class AddPrimeActionKind + [Migration("20260826094154_InitialCreate")] + partial class InitialCreate { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/src/ClaudeDo.Data/Migrations/20260826094154_InitialCreate.cs b/src/ClaudeDo.Data/Migrations/20260826094154_InitialCreate.cs new file mode 100644 index 00000000..857325ac --- /dev/null +++ b/src/ClaudeDo.Data/Migrations/20260826094154_InitialCreate.cs @@ -0,0 +1,449 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ClaudeDo.Data.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "app_settings", + columns: table => new + { + id = table.Column(type: "INTEGER", nullable: false), + next_task_number = table.Column(type: "INTEGER", nullable: false, defaultValue: 1), + default_claude_instructions = table.Column(type: "TEXT", nullable: false, defaultValue: ""), + default_model = table.Column(type: "TEXT", nullable: false, defaultValue: "sonnet"), + default_max_turns = table.Column(type: "INTEGER", nullable: false, defaultValue: 40), + default_permission_mode = table.Column(type: "TEXT", nullable: false, defaultValue: "bypassPermissions"), + max_turns_ceiling = table.Column(type: "INTEGER", nullable: false, defaultValue: 80), + max_parallel_executions = table.Column(type: "INTEGER", nullable: false, defaultValue: 1), + worktree_strategy = table.Column(type: "TEXT", nullable: false, defaultValue: "sibling"), + central_worktree_root = table.Column(type: "TEXT", nullable: true), + worktree_auto_cleanup_enabled = table.Column(type: "INTEGER", nullable: false, defaultValue: false), + worktree_auto_cleanup_days = table.Column(type: "INTEGER", nullable: false, defaultValue: 7), + repo_import_folders = table.Column(type: "TEXT", nullable: true), + report_excluded_paths = table.Column(type: "TEXT", nullable: true), + standup_weekday = table.Column(type: "INTEGER", nullable: false, defaultValue: 3), + daily_prep_max_tasks = table.Column(type: "INTEGER", nullable: false, defaultValue: 5), + session_skills = table.Column(type: "TEXT", nullable: true), + model_presets = table.Column(type: "TEXT", nullable: true), + usage_gate_five_hour_pct = table.Column(type: "INTEGER", nullable: false, defaultValue: 80), + usage_gate_seven_day_pct = table.Column(type: "INTEGER", nullable: false, defaultValue: 90), + usage_throttle_five_hour_soft_pct = table.Column(type: "INTEGER", nullable: false, defaultValue: 50), + usage_throttle_five_hour_hard_pct = table.Column(type: "INTEGER", nullable: false, defaultValue: 65), + usage_throttle_seven_day_soft_pct = table.Column(type: "INTEGER", nullable: false, defaultValue: 50), + usage_throttle_seven_day_hard_pct = table.Column(type: "INTEGER", nullable: false, defaultValue: 65), + auto_continue_on_usage_limit = table.Column(type: "INTEGER", nullable: false, defaultValue: false) + }, + constraints: table => + { + table.PrimaryKey("PK_app_settings", x => x.id); + }); + + migrationBuilder.CreateTable( + name: "daily_notes", + columns: table => new + { + id = table.Column(type: "TEXT", nullable: false), + note_date = table.Column(type: "TEXT", nullable: false), + text = table.Column(type: "TEXT", nullable: false), + sort_order = table.Column(type: "INTEGER", nullable: false), + created_at = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_daily_notes", x => x.id); + }); + + migrationBuilder.CreateTable( + name: "lists", + columns: table => new + { + id = table.Column(type: "TEXT", nullable: false), + name = table.Column(type: "TEXT", nullable: false), + created_at = table.Column(type: "TEXT", nullable: false), + working_dir = table.Column(type: "TEXT", nullable: true), + default_commit_type = table.Column(type: "TEXT", nullable: false, defaultValue: "chore"), + sort_order = table.Column(type: "INTEGER", nullable: false, defaultValue: 0), + is_manual = table.Column(type: "INTEGER", nullable: false, defaultValue: false), + findings_tracked = table.Column(type: "INTEGER", nullable: false, defaultValue: false) + }, + constraints: table => + { + table.PrimaryKey("PK_lists", x => x.id); + }); + + migrationBuilder.CreateTable( + name: "prime_schedules", + columns: table => new + { + id = table.Column(type: "TEXT", nullable: false), + days_of_week = table.Column(type: "INTEGER", nullable: false, defaultValue: 31), + action_kind = table.Column(type: "TEXT", nullable: false, defaultValue: "ping"), + time_of_day = table.Column(type: "TEXT", nullable: false), + enabled = table.Column(type: "INTEGER", nullable: false, defaultValue: true), + last_run_at = table.Column(type: "TEXT", nullable: true), + prompt_override = table.Column(type: "TEXT", nullable: true), + created_at = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_prime_schedules", x => x.id); + }); + + migrationBuilder.CreateTable( + name: "session_skills", + columns: table => new + { + name = table.Column(type: "TEXT", nullable: false), + source_url = table.Column(type: "TEXT", nullable: false), + pinned_ref = table.Column(type: "TEXT", nullable: false), + subpath = table.Column(type: "TEXT", nullable: false), + description = table.Column(type: "TEXT", nullable: false), + added_at = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_session_skills", x => x.name); + }); + + migrationBuilder.CreateTable( + name: "week_reports", + columns: table => new + { + id = table.Column(type: "TEXT", nullable: false), + start_date = table.Column(type: "TEXT", nullable: false), + end_date = table.Column(type: "TEXT", nullable: false), + markdown = table.Column(type: "TEXT", nullable: false), + generated_at = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_week_reports", x => x.id); + }); + + migrationBuilder.CreateTable( + name: "list_config", + columns: table => new + { + list_id = table.Column(type: "TEXT", nullable: false), + model = table.Column(type: "TEXT", nullable: true), + system_prompt = table.Column(type: "TEXT", nullable: true), + agent_path = table.Column(type: "TEXT", nullable: true), + max_turns = table.Column(type: "INTEGER", nullable: true), + session_skills = table.Column(type: "TEXT", nullable: true), + verify_command = table.Column(type: "TEXT", nullable: true), + serialize_on_file_overlap = table.Column(type: "INTEGER", nullable: false, defaultValue: false) + }, + constraints: table => + { + table.PrimaryKey("PK_list_config", x => x.list_id); + table.ForeignKey( + name: "FK_list_config_lists_list_id", + column: x => x.list_id, + principalTable: "lists", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "tasks", + columns: table => new + { + id = table.Column(type: "TEXT", nullable: false), + number = table.Column(type: "INTEGER", nullable: false), + list_id = table.Column(type: "TEXT", nullable: false), + title = table.Column(type: "TEXT", nullable: false), + description = table.Column(type: "TEXT", nullable: true), + status = table.Column(type: "TEXT", nullable: false), + planning_phase = table.Column(type: "TEXT", nullable: false, defaultValue: "none"), + blocked_by_task_id = table.Column(type: "TEXT", nullable: true), + depends_on_task_id = table.Column(type: "TEXT", nullable: true), + scheduled_for = table.Column(type: "TEXT", nullable: true), + result = table.Column(type: "TEXT", nullable: true), + review_feedback = table.Column(type: "TEXT", nullable: true), + roadblock_count = table.Column(type: "INTEGER", nullable: false, defaultValue: 0), + failure_reason = table.Column(type: "TEXT", nullable: true), + failure_turns_used = table.Column(type: "INTEGER", nullable: true), + failure_max_turns = table.Column(type: "INTEGER", nullable: true), + usage_limit_auto_continued_at = table.Column(type: "TEXT", nullable: true), + log_path = table.Column(type: "TEXT", nullable: true), + created_at = table.Column(type: "TEXT", nullable: false), + started_at = table.Column(type: "TEXT", nullable: true), + finished_at = table.Column(type: "TEXT", nullable: true), + commit_type = table.Column(type: "TEXT", nullable: false, defaultValue: "chore"), + model = table.Column(type: "TEXT", nullable: true), + system_prompt = table.Column(type: "TEXT", nullable: true), + agent_path = table.Column(type: "TEXT", nullable: true), + max_turns = table.Column(type: "INTEGER", nullable: true), + is_starred = table.Column(type: "INTEGER", nullable: false, defaultValue: false), + is_my_day = table.Column(type: "INTEGER", nullable: false, defaultValue: false), + is_manual = table.Column(type: "INTEGER", nullable: false, defaultValue: false), + notes = table.Column(type: "TEXT", nullable: true), + sort_order = table.Column(type: "INTEGER", nullable: false, defaultValue: 0), + session_skills = table.Column(type: "TEXT", nullable: true), + scope_globs = table.Column(type: "TEXT", nullable: true), + handler_base_commit = table.Column(type: "TEXT", nullable: true), + handler_head_commit = table.Column(type: "TEXT", nullable: true), + interactive_session_id = table.Column(type: "TEXT", nullable: true), + parent_task_id = table.Column(type: "TEXT", nullable: true), + planning_session_id = table.Column(type: "TEXT", nullable: true), + planning_session_token = table.Column(type: "TEXT", nullable: true), + planning_finalized_at = table.Column(type: "TEXT", nullable: true), + created_by = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_tasks", x => x.id); + table.ForeignKey( + name: "FK_tasks_lists_list_id", + column: x => x.list_id, + principalTable: "lists", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_tasks_tasks_blocked_by_task_id", + column: x => x.blocked_by_task_id, + principalTable: "tasks", + principalColumn: "id", + onDelete: ReferentialAction.SetNull); + table.ForeignKey( + name: "FK_tasks_tasks_depends_on_task_id", + column: x => x.depends_on_task_id, + principalTable: "tasks", + principalColumn: "id", + onDelete: ReferentialAction.SetNull); + table.ForeignKey( + name: "FK_tasks_tasks_parent_task_id", + column: x => x.parent_task_id, + principalTable: "tasks", + principalColumn: "id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "subtasks", + columns: table => new + { + id = table.Column(type: "TEXT", nullable: false), + task_id = table.Column(type: "TEXT", nullable: false), + title = table.Column(type: "TEXT", nullable: false), + completed = table.Column(type: "INTEGER", nullable: false, defaultValue: false), + order_num = table.Column(type: "INTEGER", nullable: false), + created_at = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_subtasks", x => x.id); + table.ForeignKey( + name: "FK_subtasks_tasks_task_id", + column: x => x.task_id, + principalTable: "tasks", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "task_attachments", + columns: table => new + { + id = table.Column(type: "TEXT", nullable: false), + task_id = table.Column(type: "TEXT", nullable: false), + file_name = table.Column(type: "TEXT", nullable: false), + byte_size = table.Column(type: "INTEGER", nullable: false), + created_at = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_task_attachments", x => x.id); + table.ForeignKey( + name: "FK_task_attachments_tasks_task_id", + column: x => x.task_id, + principalTable: "tasks", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "task_runs", + columns: table => new + { + id = table.Column(type: "TEXT", nullable: false), + task_id = table.Column(type: "TEXT", nullable: false), + run_number = table.Column(type: "INTEGER", nullable: false), + session_id = table.Column(type: "TEXT", nullable: true), + is_retry = table.Column(type: "INTEGER", nullable: false, defaultValue: false), + prompt = table.Column(type: "TEXT", nullable: false), + result_markdown = table.Column(type: "TEXT", nullable: true), + structured_output = table.Column(type: "TEXT", nullable: true), + error_markdown = table.Column(type: "TEXT", nullable: true), + exit_code = table.Column(type: "INTEGER", nullable: true), + turn_count = table.Column(type: "INTEGER", nullable: true), + tokens_in = table.Column(type: "INTEGER", nullable: true), + tokens_out = table.Column(type: "INTEGER", nullable: true), + cache_read_tokens = table.Column(type: "INTEGER", nullable: true), + cache_write_tokens = table.Column(type: "INTEGER", nullable: true), + log_path = table.Column(type: "TEXT", nullable: true), + started_at = table.Column(type: "TEXT", nullable: true), + finished_at = table.Column(type: "TEXT", nullable: true), + model = table.Column(type: "TEXT", nullable: true), + result_subtype = table.Column(type: "TEXT", nullable: true), + terminal_reason = table.Column(type: "TEXT", nullable: true), + errors = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_task_runs", x => x.id); + table.ForeignKey( + name: "FK_task_runs_tasks_task_id", + column: x => x.task_id, + principalTable: "tasks", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "worktrees", + columns: table => new + { + task_id = table.Column(type: "TEXT", nullable: false), + path = table.Column(type: "TEXT", nullable: false), + branch_name = table.Column(type: "TEXT", nullable: false), + base_commit = table.Column(type: "TEXT", nullable: false), + head_commit = table.Column(type: "TEXT", nullable: true), + diff_stat = table.Column(type: "TEXT", nullable: true), + merge_commit = table.Column(type: "TEXT", nullable: true), + state = table.Column(type: "TEXT", nullable: false, defaultValue: "active"), + created_at = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_worktrees", x => x.task_id); + table.ForeignKey( + name: "FK_worktrees_tasks_task_id", + column: x => x.task_id, + principalTable: "tasks", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.InsertData( + table: "app_settings", + columns: new[] { "id", "central_worktree_root", "daily_prep_max_tasks", "default_claude_instructions", "default_max_turns", "default_model", "default_permission_mode", "max_parallel_executions", "max_turns_ceiling", "model_presets", "next_task_number", "repo_import_folders", "report_excluded_paths", "session_skills", "standup_weekday", "usage_gate_five_hour_pct", "usage_gate_seven_day_pct", "usage_throttle_five_hour_hard_pct", "usage_throttle_five_hour_soft_pct", "usage_throttle_seven_day_hard_pct", "usage_throttle_seven_day_soft_pct", "worktree_auto_cleanup_days", "worktree_strategy" }, + values: new object[] { 1, null, 5, "", 40, "sonnet", "auto", 1, 80, null, 1, null, null, null, 3, 80, 90, 65, 50, 65, 50, 7, "sibling" }); + + migrationBuilder.CreateIndex( + name: "IX_daily_notes_note_date", + table: "daily_notes", + column: "note_date"); + + migrationBuilder.CreateIndex( + name: "idx_lists_sort", + table: "lists", + column: "sort_order"); + + migrationBuilder.CreateIndex( + name: "idx_subtasks_task_id", + table: "subtasks", + column: "task_id"); + + migrationBuilder.CreateIndex( + name: "idx_task_attachments_task_id", + table: "task_attachments", + column: "task_id"); + + migrationBuilder.CreateIndex( + name: "idx_task_runs_task_id", + table: "task_runs", + column: "task_id"); + + migrationBuilder.CreateIndex( + name: "idx_tasks_blocked_by", + table: "tasks", + column: "blocked_by_task_id"); + + migrationBuilder.CreateIndex( + name: "idx_tasks_depends_on", + table: "tasks", + column: "depends_on_task_id"); + + migrationBuilder.CreateIndex( + name: "idx_tasks_list_id", + table: "tasks", + column: "list_id"); + + migrationBuilder.CreateIndex( + name: "idx_tasks_list_sort", + table: "tasks", + columns: new[] { "list_id", "sort_order" }); + + migrationBuilder.CreateIndex( + name: "idx_tasks_number", + table: "tasks", + column: "number", + unique: true); + + migrationBuilder.CreateIndex( + name: "idx_tasks_parent_task_id", + table: "tasks", + column: "parent_task_id"); + + migrationBuilder.CreateIndex( + name: "idx_tasks_status", + table: "tasks", + column: "status"); + + migrationBuilder.CreateIndex( + name: "IX_week_reports_start_date_end_date", + table: "week_reports", + columns: new[] { "start_date", "end_date" }, + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "app_settings"); + + migrationBuilder.DropTable( + name: "daily_notes"); + + migrationBuilder.DropTable( + name: "list_config"); + + migrationBuilder.DropTable( + name: "prime_schedules"); + + migrationBuilder.DropTable( + name: "session_skills"); + + migrationBuilder.DropTable( + name: "subtasks"); + + migrationBuilder.DropTable( + name: "task_attachments"); + + migrationBuilder.DropTable( + name: "task_runs"); + + migrationBuilder.DropTable( + name: "week_reports"); + + migrationBuilder.DropTable( + name: "worktrees"); + + migrationBuilder.DropTable( + name: "tasks"); + + migrationBuilder.DropTable( + name: "lists"); + } + } +} diff --git a/tests/ClaudeDo.Data.Tests/MigrationBaselineTests.cs b/tests/ClaudeDo.Data.Tests/MigrationBaselineTests.cs new file mode 100644 index 00000000..1d7f7c2c --- /dev/null +++ b/tests/ClaudeDo.Data.Tests/MigrationBaselineTests.cs @@ -0,0 +1,123 @@ +using ClaudeDo.Data.Models; +using Microsoft.EntityFrameworkCore; + +namespace ClaudeDo.Data.Tests; + +// The 40 incremental migrations were squashed into one InitialCreate, so every existing database +// carries a history EF no longer recognises. MigrateAndConfigure re-stamps those instead of +// re-creating tables — this is the only test covering that path (every other Data.Tests fixture +// uses EnsureCreated, which skips migrations entirely). +// Replaces TaskNumberMigrationTests, whose subject (the AddTaskNumbers backfill) was squashed away. +public sealed class MigrationBaselineTests : IDisposable +{ + private const string LastPreSquashMigrationId = "20260825063230_AddPrimeActionKind"; + private const string SquashedMigrationId = "20260826094154_InitialCreate"; + + private readonly string _dbPath; + private readonly DbContextOptions _options; + + public MigrationBaselineTests() + { + _dbPath = Path.Combine(Path.GetTempPath(), $"claudedo_baseline_{Guid.NewGuid():N}.db"); + _options = new DbContextOptionsBuilder() + .UseSqlite($"Data Source={_dbPath}") + .Options; + } + + public void Dispose() + { + Microsoft.Data.Sqlite.SqliteConnection.ClearAllPools(); + foreach (var suffix in new[] { "", "-wal", "-shm" }) + try { File.Delete(_dbPath + suffix); } catch { } + } + + [Fact] + public void Fresh_database_migrates_and_seeds() + { + using var ctx = new ClaudeDoDbContext(_options); + ClaudeDoDbContext.MigrateAndConfigure(ctx); + + Assert.Equal(new[] { SquashedMigrationId }, ctx.Database.GetAppliedMigrations()); + Assert.NotEmpty(ctx.Lists); + } + + [Fact] + public void Fully_migrated_pre_squash_database_is_restamped_and_keeps_its_rows() + { + SeedCurrentSchemaWithHistory(LastPreSquashMigrationId, taskTitle: "survivor"); + + using var ctx = new ClaudeDoDbContext(_options); + ClaudeDoDbContext.MigrateAndConfigure(ctx); + + Assert.Equal(new[] { SquashedMigrationId }, ctx.Database.GetAppliedMigrations()); + Assert.Equal("survivor", ctx.Tasks.Single().Title); + } + + [Fact] + public void Restamping_is_idempotent() + { + SeedCurrentSchemaWithHistory(LastPreSquashMigrationId, taskTitle: "survivor"); + + using (var first = new ClaudeDoDbContext(_options)) + ClaudeDoDbContext.MigrateAndConfigure(first); + using var second = new ClaudeDoDbContext(_options); + ClaudeDoDbContext.MigrateAndConfigure(second); + + Assert.Equal(new[] { SquashedMigrationId }, second.Database.GetAppliedMigrations()); + Assert.Equal("survivor", second.Tasks.Single().Title); + } + + [Fact] + public void Database_stuck_mid_chain_fails_loudly_instead_of_being_stamped() + { + SeedCurrentSchemaWithHistory("20260810115437_AddFailureReason", taskTitle: "stale"); + + using var ctx = new ClaudeDoDbContext(_options); + var ex = Assert.Throws(() => ClaudeDoDbContext.MigrateAndConfigure(ctx)); + Assert.Contains("Reinstall ClaudeDo", ex.Message); + } + + [Fact] + public void Pre_ef_database_without_history_is_baselined() + { + SeedCurrentSchemaWithHistory(historyId: null, taskTitle: "legacy"); + + using var ctx = new ClaudeDoDbContext(_options); + ClaudeDoDbContext.MigrateAndConfigure(ctx); + + Assert.Equal(new[] { SquashedMigrationId }, ctx.Database.GetAppliedMigrations()); + Assert.Equal("legacy", ctx.Tasks.Single().Title); + } + + // EnsureCreated builds today's schema without touching __EFMigrationsHistory, which is exactly + // the shape of a database that was fully migrated by the old chain: current tables, old history. + private void SeedCurrentSchemaWithHistory(string? historyId, string taskTitle) + { + using var seed = new ClaudeDoDbContext(_options); + seed.Database.EnsureCreated(); + + var list = new ListEntity { Id = "l1", Name = "List", CreatedAt = DateTime.UtcNow }; + seed.Lists.Add(list); + seed.Tasks.Add(new TaskEntity + { + Id = "t1", ListId = list.Id, Title = taskTitle, Number = 1, CreatedAt = DateTime.UtcNow, + }); + seed.SaveChanges(); + + if (historyId is null) return; + + var conn = seed.Database.GetDbConnection(); + conn.Open(); + using var cmd = conn.CreateCommand(); + cmd.CommandText = $""" + CREATE TABLE "__EFMigrationsHistory" ( + "MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, + "ProductVersion" TEXT NOT NULL + ); + INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") + VALUES ('{historyId}', '8.0.11'); + """; + cmd.ExecuteNonQuery(); + conn.Close(); + } +} diff --git a/tests/ClaudeDo.Data.Tests/TaskNumberMigrationTests.cs b/tests/ClaudeDo.Data.Tests/TaskNumberMigrationTests.cs deleted file mode 100644 index 40116620..00000000 --- a/tests/ClaudeDo.Data.Tests/TaskNumberMigrationTests.cs +++ /dev/null @@ -1,84 +0,0 @@ -using ClaudeDo.Data; -using ClaudeDo.Data.Models; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.Extensions.DependencyInjection; - -namespace ClaudeDo.Data.Tests; - -// EnsureCreated (used by every other Data.Tests fixture) builds the schema straight from the -// current model and skips migrations entirely, so it can never exercise the AddTaskNumbers -// backfill. This test runs a real Migrate() against a database seeded with pre-migration rows. -public sealed class TaskNumberMigrationTests : IDisposable -{ - private const string MigrationBeforeTaskNumbers = "20260810115437_AddFailureReason"; - - private readonly string _dbPath; - private readonly DbContextOptions _options; - - public TaskNumberMigrationTests() - { - _dbPath = Path.Combine(Path.GetTempPath(), $"claudedo_tasknum_migration_{Guid.NewGuid():N}.db"); - _options = new DbContextOptionsBuilder() - .UseSqlite($"Data Source={_dbPath}") - .Options; - } - - public void Dispose() - { - foreach (var suffix in new[] { "", "-wal", "-shm" }) - try { File.Delete(_dbPath + suffix); } catch { } - } - - [Fact] - public async Task Migrate_backfills_task_numbers_in_creation_order_with_id_tiebreak() - { - await using (var ctx = new ClaudeDoDbContext(_options)) - { - var migrator = ctx.Database.GetInfrastructure().GetRequiredService(); - migrator.Migrate(MigrationBeforeTaskNumbers); - - var conn = ctx.Database.GetDbConnection(); - await conn.OpenAsync(); - - await ExecAsync(conn, """ - INSERT INTO lists (id, name, created_at) VALUES ('l1', 'List', '2026-01-01 00:00:00.0000000'); - """); - - // Inserted out of creation order, and 'd'/'c' share a timestamp to exercise the id tiebreak. - await ExecAsync(conn, InsertTaskSql("d", "2026-01-03 00:00:00.0000000")); - await ExecAsync(conn, InsertTaskSql("a", "2026-01-01 00:00:00.0000000")); - await ExecAsync(conn, InsertTaskSql("c", "2026-01-03 00:00:00.0000000")); - await ExecAsync(conn, InsertTaskSql("b", "2026-01-02 00:00:00.0000000")); - - migrator.Migrate(); - } - - await using var verify = new ClaudeDoDbContext(_options); - var byId = await verify.Tasks.AsNoTracking().ToDictionaryAsync(t => t.Id, t => t.Number); - - Assert.Equal(1, byId["a"]); - Assert.Equal(2, byId["b"]); - Assert.Equal(3, byId["c"]); - Assert.Equal(4, byId["d"]); - - var numbers = byId.Values.OrderBy(n => n).ToList(); - Assert.Equal(new[] { 1, 2, 3, 4 }, numbers); - - var settings = await verify.AppSettings.AsNoTracking().FirstAsync(s => s.Id == AppSettingsEntity.SingletonId); - Assert.Equal(5, settings.NextTaskNumber); - } - - private static string InsertTaskSql(string id, string createdAt) => $""" - INSERT INTO tasks (id, list_id, title, status, created_at) - VALUES ('{id}', 'l1', 'Task {id}', 'idle', '{createdAt}'); - """; - - private static async Task ExecAsync(System.Data.Common.DbConnection conn, string sql) - { - await using var cmd = conn.CreateCommand(); - cmd.CommandText = sql; - await cmd.ExecuteNonQueryAsync(); - } -}