From d47ec56ecaf0bc96087de977e2cd675b3d384c5d Mon Sep 17 00:00:00 2001 From: dotta Date: Fri, 20 Mar 2026 17:23:45 -0500 Subject: [PATCH] fix: renumber worktree merge history migrations --- cli/src/commands/worktree.ts | 11 ++ .../db/src/migrations/0038_fat_magneto.sql | 97 ----------- .../src/migrations/0039_curly_maria_hill.sql | 1 - .../db/src/migrations/0039_eager_shotgun.sql | 5 - .../db/src/migrations/0039_fat_magneto.sql | 161 ++++++++++++++++++ .../db/src/migrations/0040_eager_shotgun.sql | 5 + .../migrations/0040_spotty_the_renegades.sql | 22 --- .../src/migrations/0041_curly_maria_hill.sql | 1 + .../0041_reflective_captain_universe.sql | 6 - .../migrations/0042_spotty_the_renegades.sql | 26 +++ .../0043_reflective_captain_universe.sql | 6 + packages/db/src/migrations/meta/_journal.json | 10 +- 12 files changed, 215 insertions(+), 136 deletions(-) delete mode 100644 packages/db/src/migrations/0038_fat_magneto.sql delete mode 100644 packages/db/src/migrations/0039_curly_maria_hill.sql delete mode 100644 packages/db/src/migrations/0039_eager_shotgun.sql create mode 100644 packages/db/src/migrations/0039_fat_magneto.sql create mode 100644 packages/db/src/migrations/0040_eager_shotgun.sql delete mode 100644 packages/db/src/migrations/0040_spotty_the_renegades.sql create mode 100644 packages/db/src/migrations/0041_curly_maria_hill.sql delete mode 100644 packages/db/src/migrations/0041_reflective_captain_universe.sql create mode 100644 packages/db/src/migrations/0042_spotty_the_renegades.sql create mode 100644 packages/db/src/migrations/0043_reflective_captain_universe.sql diff --git a/cli/src/commands/worktree.ts b/cli/src/commands/worktree.ts index 285d57c0..57166d8f 100644 --- a/cli/src/commands/worktree.ts +++ b/cli/src/commands/worktree.ts @@ -32,6 +32,7 @@ import { formatDatabaseBackupResult, goals, heartbeatRuns, + inspectMigrations, issueAttachments, issueComments, issueDocuments, @@ -1392,6 +1393,16 @@ async function openConfiguredDb(configPath: string): Promise { ); } const connectionString = resolveSourceConnectionString(config, envEntries, embeddedHandle?.port); + const migrationState = await inspectMigrations(connectionString); + if (migrationState.status !== "upToDate") { + const pending = + migrationState.reason === "pending-migrations" + ? ` Pending migrations: ${migrationState.pendingMigrations.join(", ")}.` + : ""; + throw new Error( + `Database for ${configPath} is not up to date.${pending} Run \`pnpm db:migrate\` (or start Paperclip once) before using worktree merge history.`, + ); + } const db = createDb(connectionString) as ClosableDb; return { db, diff --git a/packages/db/src/migrations/0038_fat_magneto.sql b/packages/db/src/migrations/0038_fat_magneto.sql deleted file mode 100644 index 64941db1..00000000 --- a/packages/db/src/migrations/0038_fat_magneto.sql +++ /dev/null @@ -1,97 +0,0 @@ -CREATE TABLE "routine_runs" ( - "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, - "company_id" uuid NOT NULL, - "routine_id" uuid NOT NULL, - "trigger_id" uuid, - "source" text NOT NULL, - "status" text DEFAULT 'received' NOT NULL, - "triggered_at" timestamp with time zone DEFAULT now() NOT NULL, - "idempotency_key" text, - "trigger_payload" jsonb, - "linked_issue_id" uuid, - "coalesced_into_run_id" uuid, - "failure_reason" text, - "completed_at" timestamp with time zone, - "created_at" timestamp with time zone DEFAULT now() NOT NULL, - "updated_at" timestamp with time zone DEFAULT now() NOT NULL -); ---> statement-breakpoint -CREATE TABLE "routine_triggers" ( - "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, - "company_id" uuid NOT NULL, - "routine_id" uuid NOT NULL, - "kind" text NOT NULL, - "label" text, - "enabled" boolean DEFAULT true NOT NULL, - "cron_expression" text, - "timezone" text, - "next_run_at" timestamp with time zone, - "last_fired_at" timestamp with time zone, - "public_id" text, - "secret_id" uuid, - "signing_mode" text, - "replay_window_sec" integer, - "last_rotated_at" timestamp with time zone, - "last_result" text, - "created_by_agent_id" uuid, - "created_by_user_id" text, - "updated_by_agent_id" uuid, - "updated_by_user_id" text, - "created_at" timestamp with time zone DEFAULT now() NOT NULL, - "updated_at" timestamp with time zone DEFAULT now() NOT NULL -); ---> statement-breakpoint -CREATE TABLE "routines" ( - "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, - "company_id" uuid NOT NULL, - "project_id" uuid NOT NULL, - "goal_id" uuid, - "parent_issue_id" uuid, - "title" text NOT NULL, - "description" text, - "assignee_agent_id" uuid NOT NULL, - "priority" text DEFAULT 'medium' NOT NULL, - "status" text DEFAULT 'active' NOT NULL, - "concurrency_policy" text DEFAULT 'coalesce_if_active' NOT NULL, - "catch_up_policy" text DEFAULT 'skip_missed' NOT NULL, - "created_by_agent_id" uuid, - "created_by_user_id" text, - "updated_by_agent_id" uuid, - "updated_by_user_id" text, - "last_triggered_at" timestamp with time zone, - "last_enqueued_at" timestamp with time zone, - "created_at" timestamp with time zone DEFAULT now() NOT NULL, - "updated_at" timestamp with time zone DEFAULT now() NOT NULL -); ---> statement-breakpoint -ALTER TABLE "issues" ADD COLUMN "origin_kind" text DEFAULT 'manual' NOT NULL;--> statement-breakpoint -ALTER TABLE "issues" ADD COLUMN "origin_id" text;--> statement-breakpoint -ALTER TABLE "issues" ADD COLUMN "origin_run_id" text;--> statement-breakpoint -ALTER TABLE "routine_runs" ADD CONSTRAINT "routine_runs_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routine_runs" ADD CONSTRAINT "routine_runs_routine_id_routines_id_fk" FOREIGN KEY ("routine_id") REFERENCES "public"."routines"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routine_runs" ADD CONSTRAINT "routine_runs_trigger_id_routine_triggers_id_fk" FOREIGN KEY ("trigger_id") REFERENCES "public"."routine_triggers"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routine_runs" ADD CONSTRAINT "routine_runs_linked_issue_id_issues_id_fk" FOREIGN KEY ("linked_issue_id") REFERENCES "public"."issues"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routine_triggers" ADD CONSTRAINT "routine_triggers_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routine_triggers" ADD CONSTRAINT "routine_triggers_routine_id_routines_id_fk" FOREIGN KEY ("routine_id") REFERENCES "public"."routines"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routine_triggers" ADD CONSTRAINT "routine_triggers_secret_id_company_secrets_id_fk" FOREIGN KEY ("secret_id") REFERENCES "public"."company_secrets"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routine_triggers" ADD CONSTRAINT "routine_triggers_created_by_agent_id_agents_id_fk" FOREIGN KEY ("created_by_agent_id") REFERENCES "public"."agents"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routine_triggers" ADD CONSTRAINT "routine_triggers_updated_by_agent_id_agents_id_fk" FOREIGN KEY ("updated_by_agent_id") REFERENCES "public"."agents"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routines" ADD CONSTRAINT "routines_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routines" ADD CONSTRAINT "routines_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routines" ADD CONSTRAINT "routines_goal_id_goals_id_fk" FOREIGN KEY ("goal_id") REFERENCES "public"."goals"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routines" ADD CONSTRAINT "routines_parent_issue_id_issues_id_fk" FOREIGN KEY ("parent_issue_id") REFERENCES "public"."issues"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routines" ADD CONSTRAINT "routines_assignee_agent_id_agents_id_fk" FOREIGN KEY ("assignee_agent_id") REFERENCES "public"."agents"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routines" ADD CONSTRAINT "routines_created_by_agent_id_agents_id_fk" FOREIGN KEY ("created_by_agent_id") REFERENCES "public"."agents"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "routines" ADD CONSTRAINT "routines_updated_by_agent_id_agents_id_fk" FOREIGN KEY ("updated_by_agent_id") REFERENCES "public"."agents"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint -CREATE INDEX "routine_runs_company_routine_idx" ON "routine_runs" USING btree ("company_id","routine_id","created_at");--> statement-breakpoint -CREATE INDEX "routine_runs_trigger_idx" ON "routine_runs" USING btree ("trigger_id","created_at");--> statement-breakpoint -CREATE INDEX "routine_runs_linked_issue_idx" ON "routine_runs" USING btree ("linked_issue_id");--> statement-breakpoint -CREATE INDEX "routine_runs_trigger_idempotency_idx" ON "routine_runs" USING btree ("trigger_id","idempotency_key");--> statement-breakpoint -CREATE INDEX "routine_triggers_company_routine_idx" ON "routine_triggers" USING btree ("company_id","routine_id");--> statement-breakpoint -CREATE INDEX "routine_triggers_company_kind_idx" ON "routine_triggers" USING btree ("company_id","kind");--> statement-breakpoint -CREATE INDEX "routine_triggers_next_run_idx" ON "routine_triggers" USING btree ("next_run_at");--> statement-breakpoint -CREATE INDEX "routine_triggers_public_id_idx" ON "routine_triggers" USING btree ("public_id");--> statement-breakpoint -CREATE INDEX "routines_company_status_idx" ON "routines" USING btree ("company_id","status");--> statement-breakpoint -CREATE INDEX "routines_company_assignee_idx" ON "routines" USING btree ("company_id","assignee_agent_id");--> statement-breakpoint -CREATE INDEX "routines_company_project_idx" ON "routines" USING btree ("company_id","project_id");--> statement-breakpoint -CREATE INDEX "issues_company_origin_idx" ON "issues" USING btree ("company_id","origin_kind","origin_id"); diff --git a/packages/db/src/migrations/0039_curly_maria_hill.sql b/packages/db/src/migrations/0039_curly_maria_hill.sql deleted file mode 100644 index 178f6546..00000000 --- a/packages/db/src/migrations/0039_curly_maria_hill.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE "instance_settings" ADD COLUMN "general" jsonb DEFAULT '{}'::jsonb NOT NULL; \ No newline at end of file diff --git a/packages/db/src/migrations/0039_eager_shotgun.sql b/packages/db/src/migrations/0039_eager_shotgun.sql deleted file mode 100644 index 5e5b63b2..00000000 --- a/packages/db/src/migrations/0039_eager_shotgun.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE UNIQUE INDEX "issues_open_routine_execution_uq" ON "issues" USING btree ("company_id","origin_kind","origin_id") WHERE "issues"."origin_kind" = 'routine_execution' - and "issues"."origin_id" is not null - and "issues"."hidden_at" is null - and "issues"."status" in ('backlog', 'todo', 'in_progress', 'in_review', 'blocked');--> statement-breakpoint -CREATE UNIQUE INDEX "routine_triggers_public_id_uq" ON "routine_triggers" USING btree ("public_id"); \ No newline at end of file diff --git a/packages/db/src/migrations/0039_fat_magneto.sql b/packages/db/src/migrations/0039_fat_magneto.sql new file mode 100644 index 00000000..00ca180e --- /dev/null +++ b/packages/db/src/migrations/0039_fat_magneto.sql @@ -0,0 +1,161 @@ +CREATE TABLE IF NOT EXISTS "routine_runs" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "company_id" uuid NOT NULL, + "routine_id" uuid NOT NULL, + "trigger_id" uuid, + "source" text NOT NULL, + "status" text DEFAULT 'received' NOT NULL, + "triggered_at" timestamp with time zone DEFAULT now() NOT NULL, + "idempotency_key" text, + "trigger_payload" jsonb, + "linked_issue_id" uuid, + "coalesced_into_run_id" uuid, + "failure_reason" text, + "completed_at" timestamp with time zone, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "routine_triggers" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "company_id" uuid NOT NULL, + "routine_id" uuid NOT NULL, + "kind" text NOT NULL, + "label" text, + "enabled" boolean DEFAULT true NOT NULL, + "cron_expression" text, + "timezone" text, + "next_run_at" timestamp with time zone, + "last_fired_at" timestamp with time zone, + "public_id" text, + "secret_id" uuid, + "signing_mode" text, + "replay_window_sec" integer, + "last_rotated_at" timestamp with time zone, + "last_result" text, + "created_by_agent_id" uuid, + "created_by_user_id" text, + "updated_by_agent_id" uuid, + "updated_by_user_id" text, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "routines" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "company_id" uuid NOT NULL, + "project_id" uuid NOT NULL, + "goal_id" uuid, + "parent_issue_id" uuid, + "title" text NOT NULL, + "description" text, + "assignee_agent_id" uuid NOT NULL, + "priority" text DEFAULT 'medium' NOT NULL, + "status" text DEFAULT 'active' NOT NULL, + "concurrency_policy" text DEFAULT 'coalesce_if_active' NOT NULL, + "catch_up_policy" text DEFAULT 'skip_missed' NOT NULL, + "created_by_agent_id" uuid, + "created_by_user_id" text, + "updated_by_agent_id" uuid, + "updated_by_user_id" text, + "last_triggered_at" timestamp with time zone, + "last_enqueued_at" timestamp with time zone, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint +ALTER TABLE "issues" ADD COLUMN IF NOT EXISTS "origin_kind" text DEFAULT 'manual' NOT NULL;--> statement-breakpoint +ALTER TABLE "issues" ADD COLUMN IF NOT EXISTS "origin_id" text;--> statement-breakpoint +ALTER TABLE "issues" ADD COLUMN IF NOT EXISTS "origin_run_id" text;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routine_runs_company_id_companies_id_fk') THEN + ALTER TABLE "routine_runs" ADD CONSTRAINT "routine_runs_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE cascade ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routine_runs_routine_id_routines_id_fk') THEN + ALTER TABLE "routine_runs" ADD CONSTRAINT "routine_runs_routine_id_routines_id_fk" FOREIGN KEY ("routine_id") REFERENCES "public"."routines"("id") ON DELETE cascade ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routine_runs_trigger_id_routine_triggers_id_fk') THEN + ALTER TABLE "routine_runs" ADD CONSTRAINT "routine_runs_trigger_id_routine_triggers_id_fk" FOREIGN KEY ("trigger_id") REFERENCES "public"."routine_triggers"("id") ON DELETE set null ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routine_runs_linked_issue_id_issues_id_fk') THEN + ALTER TABLE "routine_runs" ADD CONSTRAINT "routine_runs_linked_issue_id_issues_id_fk" FOREIGN KEY ("linked_issue_id") REFERENCES "public"."issues"("id") ON DELETE set null ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routine_triggers_company_id_companies_id_fk') THEN + ALTER TABLE "routine_triggers" ADD CONSTRAINT "routine_triggers_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE cascade ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routine_triggers_routine_id_routines_id_fk') THEN + ALTER TABLE "routine_triggers" ADD CONSTRAINT "routine_triggers_routine_id_routines_id_fk" FOREIGN KEY ("routine_id") REFERENCES "public"."routines"("id") ON DELETE cascade ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routine_triggers_secret_id_company_secrets_id_fk') THEN + ALTER TABLE "routine_triggers" ADD CONSTRAINT "routine_triggers_secret_id_company_secrets_id_fk" FOREIGN KEY ("secret_id") REFERENCES "public"."company_secrets"("id") ON DELETE set null ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routine_triggers_created_by_agent_id_agents_id_fk') THEN + ALTER TABLE "routine_triggers" ADD CONSTRAINT "routine_triggers_created_by_agent_id_agents_id_fk" FOREIGN KEY ("created_by_agent_id") REFERENCES "public"."agents"("id") ON DELETE set null ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routine_triggers_updated_by_agent_id_agents_id_fk') THEN + ALTER TABLE "routine_triggers" ADD CONSTRAINT "routine_triggers_updated_by_agent_id_agents_id_fk" FOREIGN KEY ("updated_by_agent_id") REFERENCES "public"."agents"("id") ON DELETE set null ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routines_company_id_companies_id_fk') THEN + ALTER TABLE "routines" ADD CONSTRAINT "routines_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE cascade ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routines_project_id_projects_id_fk') THEN + ALTER TABLE "routines" ADD CONSTRAINT "routines_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routines_goal_id_goals_id_fk') THEN + ALTER TABLE "routines" ADD CONSTRAINT "routines_goal_id_goals_id_fk" FOREIGN KEY ("goal_id") REFERENCES "public"."goals"("id") ON DELETE set null ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routines_parent_issue_id_issues_id_fk') THEN + ALTER TABLE "routines" ADD CONSTRAINT "routines_parent_issue_id_issues_id_fk" FOREIGN KEY ("parent_issue_id") REFERENCES "public"."issues"("id") ON DELETE set null ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routines_assignee_agent_id_agents_id_fk') THEN + ALTER TABLE "routines" ADD CONSTRAINT "routines_assignee_agent_id_agents_id_fk" FOREIGN KEY ("assignee_agent_id") REFERENCES "public"."agents"("id") ON DELETE no action ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routines_created_by_agent_id_agents_id_fk') THEN + ALTER TABLE "routines" ADD CONSTRAINT "routines_created_by_agent_id_agents_id_fk" FOREIGN KEY ("created_by_agent_id") REFERENCES "public"."agents"("id") ON DELETE set null ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routines_updated_by_agent_id_agents_id_fk') THEN + ALTER TABLE "routines" ADD CONSTRAINT "routines_updated_by_agent_id_agents_id_fk" FOREIGN KEY ("updated_by_agent_id") REFERENCES "public"."agents"("id") ON DELETE set null ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routine_runs_company_routine_idx" ON "routine_runs" USING btree ("company_id","routine_id","created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routine_runs_trigger_idx" ON "routine_runs" USING btree ("trigger_id","created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routine_runs_linked_issue_idx" ON "routine_runs" USING btree ("linked_issue_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routine_runs_trigger_idempotency_idx" ON "routine_runs" USING btree ("trigger_id","idempotency_key");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routine_triggers_company_routine_idx" ON "routine_triggers" USING btree ("company_id","routine_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routine_triggers_company_kind_idx" ON "routine_triggers" USING btree ("company_id","kind");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routine_triggers_next_run_idx" ON "routine_triggers" USING btree ("next_run_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routine_triggers_public_id_idx" ON "routine_triggers" USING btree ("public_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routines_company_status_idx" ON "routines" USING btree ("company_id","status");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routines_company_assignee_idx" ON "routines" USING btree ("company_id","assignee_agent_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "routines_company_project_idx" ON "routines" USING btree ("company_id","project_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "issues_company_origin_idx" ON "issues" USING btree ("company_id","origin_kind","origin_id"); diff --git a/packages/db/src/migrations/0040_eager_shotgun.sql b/packages/db/src/migrations/0040_eager_shotgun.sql new file mode 100644 index 00000000..726173e0 --- /dev/null +++ b/packages/db/src/migrations/0040_eager_shotgun.sql @@ -0,0 +1,5 @@ +CREATE UNIQUE INDEX IF NOT EXISTS "issues_open_routine_execution_uq" ON "issues" USING btree ("company_id","origin_kind","origin_id") WHERE "issues"."origin_kind" = 'routine_execution' + and "issues"."origin_id" is not null + and "issues"."hidden_at" is null + and "issues"."status" in ('backlog', 'todo', 'in_progress', 'in_review', 'blocked');--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "routine_triggers_public_id_uq" ON "routine_triggers" USING btree ("public_id"); diff --git a/packages/db/src/migrations/0040_spotty_the_renegades.sql b/packages/db/src/migrations/0040_spotty_the_renegades.sql deleted file mode 100644 index 8c4c0b04..00000000 --- a/packages/db/src/migrations/0040_spotty_the_renegades.sql +++ /dev/null @@ -1,22 +0,0 @@ -CREATE TABLE "company_skills" ( - "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, - "company_id" uuid NOT NULL, - "key" text NOT NULL, - "slug" text NOT NULL, - "name" text NOT NULL, - "description" text, - "markdown" text NOT NULL, - "source_type" text DEFAULT 'local_path' NOT NULL, - "source_locator" text, - "source_ref" text, - "trust_level" text DEFAULT 'markdown_only' NOT NULL, - "compatibility" text DEFAULT 'compatible' NOT NULL, - "file_inventory" jsonb DEFAULT '[]'::jsonb NOT NULL, - "metadata" jsonb, - "created_at" timestamp with time zone DEFAULT now() NOT NULL, - "updated_at" timestamp with time zone DEFAULT now() NOT NULL -); ---> statement-breakpoint -ALTER TABLE "company_skills" ADD CONSTRAINT "company_skills_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint -CREATE UNIQUE INDEX "company_skills_company_key_idx" ON "company_skills" USING btree ("company_id","key");--> statement-breakpoint -CREATE INDEX "company_skills_company_name_idx" ON "company_skills" USING btree ("company_id","name"); \ No newline at end of file diff --git a/packages/db/src/migrations/0041_curly_maria_hill.sql b/packages/db/src/migrations/0041_curly_maria_hill.sql new file mode 100644 index 00000000..cad4f83f --- /dev/null +++ b/packages/db/src/migrations/0041_curly_maria_hill.sql @@ -0,0 +1 @@ +ALTER TABLE "instance_settings" ADD COLUMN IF NOT EXISTS "general" jsonb DEFAULT '{}'::jsonb NOT NULL; diff --git a/packages/db/src/migrations/0041_reflective_captain_universe.sql b/packages/db/src/migrations/0041_reflective_captain_universe.sql deleted file mode 100644 index c624b55f..00000000 --- a/packages/db/src/migrations/0041_reflective_captain_universe.sql +++ /dev/null @@ -1,6 +0,0 @@ -DROP INDEX "issues_open_routine_execution_uq";--> statement-breakpoint -CREATE UNIQUE INDEX "issues_open_routine_execution_uq" ON "issues" USING btree ("company_id","origin_kind","origin_id") WHERE "issues"."origin_kind" = 'routine_execution' - and "issues"."origin_id" is not null - and "issues"."hidden_at" is null - and "issues"."execution_run_id" is not null - and "issues"."status" in ('backlog', 'todo', 'in_progress', 'in_review', 'blocked'); \ No newline at end of file diff --git a/packages/db/src/migrations/0042_spotty_the_renegades.sql b/packages/db/src/migrations/0042_spotty_the_renegades.sql new file mode 100644 index 00000000..3fc8b228 --- /dev/null +++ b/packages/db/src/migrations/0042_spotty_the_renegades.sql @@ -0,0 +1,26 @@ +CREATE TABLE IF NOT EXISTS "company_skills" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "company_id" uuid NOT NULL, + "key" text NOT NULL, + "slug" text NOT NULL, + "name" text NOT NULL, + "description" text, + "markdown" text NOT NULL, + "source_type" text DEFAULT 'local_path' NOT NULL, + "source_locator" text, + "source_ref" text, + "trust_level" text DEFAULT 'markdown_only' NOT NULL, + "compatibility" text DEFAULT 'compatible' NOT NULL, + "file_inventory" jsonb DEFAULT '[]'::jsonb NOT NULL, + "metadata" jsonb, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'company_skills_company_id_companies_id_fk') THEN + ALTER TABLE "company_skills" ADD CONSTRAINT "company_skills_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE no action ON UPDATE no action; + END IF; +END $$;--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "company_skills_company_key_idx" ON "company_skills" USING btree ("company_id","key");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "company_skills_company_name_idx" ON "company_skills" USING btree ("company_id","name"); diff --git a/packages/db/src/migrations/0043_reflective_captain_universe.sql b/packages/db/src/migrations/0043_reflective_captain_universe.sql new file mode 100644 index 00000000..fc45e05b --- /dev/null +++ b/packages/db/src/migrations/0043_reflective_captain_universe.sql @@ -0,0 +1,6 @@ +DROP INDEX IF EXISTS "issues_open_routine_execution_uq";--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "issues_open_routine_execution_uq" ON "issues" USING btree ("company_id","origin_kind","origin_id") WHERE "issues"."origin_kind" = 'routine_execution' + and "issues"."origin_id" is not null + and "issues"."hidden_at" is null + and "issues"."execution_run_id" is not null + and "issues"."status" in ('backlog', 'todo', 'in_progress', 'in_review', 'blocked'); diff --git a/packages/db/src/migrations/meta/_journal.json b/packages/db/src/migrations/meta/_journal.json index 9ba84be4..7ceb306a 100644 --- a/packages/db/src/migrations/meta/_journal.json +++ b/packages/db/src/migrations/meta/_journal.json @@ -279,35 +279,35 @@ "idx": 39, "version": "7", "when": 1773926116580, - "tag": "0038_fat_magneto", + "tag": "0039_fat_magneto", "breakpoints": true }, { "idx": 40, "version": "7", "when": 1773927102783, - "tag": "0039_eager_shotgun", + "tag": "0040_eager_shotgun", "breakpoints": true }, { "idx": 41, "version": "7", "when": 1774011294562, - "tag": "0039_curly_maria_hill", + "tag": "0041_curly_maria_hill", "breakpoints": true }, { "idx": 42, "version": "7", "when": 1774031825634, - "tag": "0040_spotty_the_renegades", + "tag": "0042_spotty_the_renegades", "breakpoints": true }, { "idx": 43, "version": "7", "when": 1774008910991, - "tag": "0041_reflective_captain_universe", + "tag": "0043_reflective_captain_universe", "breakpoints": true } ]