Move drizzle/, dist/, and coverage/ into apps/server/ so all server-specific artifacts live alongside the source they belong to. - git mv drizzle/ → apps/server/drizzle/ - drizzle.config.ts: out → ./apps/server/drizzle - tsconfig.json: outDir → ./apps/server/dist, exclude drizzle dir - package.json: main/bin/clean point to apps/server/dist/ - vitest.config.ts: reportsDirectory → ./apps/server/coverage - .gitignore: add coverage/ entry - ensure-schema.ts: update getMigrationsPath() for new layout - docs/database-migrations.md: update drizzle/ references
99 lines
3.7 KiB
TypeScript
99 lines
3.7 KiB
TypeScript
import { sqliteTable, AnySQLiteColumn, uniqueIndex, foreignKey, text, integer } from "drizzle-orm/sqlite-core"
|
|
import { sql } from "drizzle-orm"
|
|
|
|
export const agents = sqliteTable("agents", {
|
|
id: text().primaryKey().notNull(),
|
|
name: text().notNull(),
|
|
taskId: text("task_id").references(() => tasks.id, { onDelete: "set null" } ),
|
|
sessionId: text("session_id"),
|
|
worktreeId: text("worktree_id").notNull(),
|
|
status: text().default("idle").notNull(),
|
|
mode: text().default("execute").notNull(),
|
|
createdAt: integer("created_at").notNull(),
|
|
updatedAt: integer("updated_at").notNull(),
|
|
},
|
|
(table) => [
|
|
uniqueIndex("agents_name_unique").on(table.name),
|
|
]);
|
|
|
|
export const initiatives = sqliteTable("initiatives", {
|
|
id: text().primaryKey().notNull(),
|
|
name: text().notNull(),
|
|
description: text(),
|
|
status: text().default("active").notNull(),
|
|
createdAt: integer("created_at").notNull(),
|
|
updatedAt: integer("updated_at").notNull(),
|
|
});
|
|
|
|
export const messages = sqliteTable("messages", {
|
|
id: text().primaryKey().notNull(),
|
|
senderType: text("sender_type").notNull(),
|
|
senderId: text("sender_id").references(() => agents.id, { onDelete: "set null" } ),
|
|
recipientType: text("recipient_type").notNull(),
|
|
recipientId: text("recipient_id").references(() => agents.id, { onDelete: "set null" } ),
|
|
type: text().default("info").notNull(),
|
|
content: text().notNull(),
|
|
requiresResponse: integer("requires_response").default(false).notNull(),
|
|
status: text().default("pending").notNull(),
|
|
parentMessageId: text("parent_message_id"),
|
|
createdAt: integer("created_at").notNull(),
|
|
updatedAt: integer("updated_at").notNull(),
|
|
},
|
|
(table) => [
|
|
foreignKey(() => ({
|
|
columns: [table.parentMessageId],
|
|
foreignColumns: [table.id],
|
|
name: "messages_parent_message_id_messages_id_fk"
|
|
})).onDelete("set null"),
|
|
]);
|
|
|
|
export const phases = sqliteTable("phases", {
|
|
id: text().primaryKey().notNull(),
|
|
initiativeId: text("initiative_id").notNull().references(() => initiatives.id, { onDelete: "cascade" } ),
|
|
number: integer().notNull(),
|
|
name: text().notNull(),
|
|
description: text(),
|
|
status: text().default("pending").notNull(),
|
|
createdAt: integer("created_at").notNull(),
|
|
updatedAt: integer("updated_at").notNull(),
|
|
});
|
|
|
|
export const plans = sqliteTable("plans", {
|
|
id: text().primaryKey().notNull(),
|
|
phaseId: text("phase_id").notNull().references(() => phases.id, { onDelete: "cascade" } ),
|
|
number: integer().notNull(),
|
|
name: text().notNull(),
|
|
description: text(),
|
|
status: text().default("pending").notNull(),
|
|
createdAt: integer("created_at").notNull(),
|
|
updatedAt: integer("updated_at").notNull(),
|
|
});
|
|
|
|
export const taskDependencies = sqliteTable("task_dependencies", {
|
|
id: text().primaryKey().notNull(),
|
|
taskId: text("task_id").notNull().references(() => tasks.id, { onDelete: "cascade" } ),
|
|
dependsOnTaskId: text("depends_on_task_id").notNull().references(() => tasks.id, { onDelete: "cascade" } ),
|
|
createdAt: integer("created_at").notNull(),
|
|
});
|
|
|
|
export const tasks = sqliteTable("tasks", {
|
|
id: text().primaryKey().notNull(),
|
|
planId: text("plan_id").notNull().references(() => plans.id, { onDelete: "cascade" } ),
|
|
name: text().notNull(),
|
|
description: text(),
|
|
type: text().default("auto").notNull(),
|
|
priority: text().default("medium").notNull(),
|
|
status: text().default("pending").notNull(),
|
|
order: integer().default(0).notNull(),
|
|
createdAt: integer("created_at").notNull(),
|
|
updatedAt: integer("updated_at").notNull(),
|
|
});
|
|
|
|
export const phaseDependencies = sqliteTable("phase_dependencies", {
|
|
id: text().primaryKey().notNull(),
|
|
phaseId: text("phase_id").notNull().references(() => phases.id, { onDelete: "cascade" } ),
|
|
dependsOnPhaseId: text("depends_on_phase_id").notNull().references(() => phases.id, { onDelete: "cascade" } ),
|
|
createdAt: integer("created_at").notNull(),
|
|
});
|
|
|