diff --git a/schema/schema.sql b/schema/schema.sql index 83a09e2..5f65955 100644 --- a/schema/schema.sql +++ b/schema/schema.sql @@ -46,6 +46,13 @@ CREATE TABLE IF NOT EXISTS task_tags ( PRIMARY KEY (task_id, tag_id) ); +CREATE TABLE IF NOT EXISTS list_config ( + list_id TEXT PRIMARY KEY REFERENCES lists(id) ON DELETE CASCADE, + model TEXT NULL, + system_prompt TEXT NULL, + agent_path TEXT NULL +); + CREATE TABLE IF NOT EXISTS worktrees ( task_id TEXT PRIMARY KEY REFERENCES tasks(id) ON DELETE CASCADE, path TEXT NOT NULL, @@ -57,6 +64,27 @@ CREATE TABLE IF NOT EXISTS worktrees ( created_at TIMESTAMP NOT NULL ); +CREATE TABLE IF NOT EXISTS task_runs ( + id TEXT PRIMARY KEY, + task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE, + run_number INTEGER NOT NULL, + session_id TEXT NULL, + is_retry INTEGER NOT NULL DEFAULT 0, + prompt TEXT NOT NULL, + result_markdown TEXT NULL, + structured_output TEXT NULL, + error_markdown TEXT NULL, + exit_code INTEGER NULL, + turn_count INTEGER NULL, + tokens_in INTEGER NULL, + tokens_out INTEGER NULL, + log_path TEXT NULL, + started_at TIMESTAMP NULL, + finished_at TIMESTAMP NULL +); + +CREATE INDEX IF NOT EXISTS idx_task_runs_task_id ON task_runs(task_id); + -- Seed: minimal tag set (ignored if already present) INSERT OR IGNORE INTO tags (name) VALUES ('agent'); INSERT OR IGNORE INTO tags (name) VALUES ('manual'); diff --git a/src/ClaudeDo.Data/SchemaInitializer.cs b/src/ClaudeDo.Data/SchemaInitializer.cs index 17eff67..65e4806 100644 --- a/src/ClaudeDo.Data/SchemaInitializer.cs +++ b/src/ClaudeDo.Data/SchemaInitializer.cs @@ -26,6 +26,32 @@ public static class SchemaInitializer cmd.CommandText = sql; cmd.ExecuteNonQuery(); tx.Commit(); + + ApplyMigrations(conn); + } + + private static void ApplyMigrations(SqliteConnection conn) + { + string[] alterStatements = + [ + "ALTER TABLE tasks ADD COLUMN model TEXT NULL", + "ALTER TABLE tasks ADD COLUMN system_prompt TEXT NULL", + "ALTER TABLE tasks ADD COLUMN agent_path TEXT NULL", + ]; + + foreach (var sql in alterStatements) + { + try + { + using var cmd = conn.CreateCommand(); + cmd.CommandText = sql; + cmd.ExecuteNonQuery(); + } + catch (SqliteException ex) when (ex.SqliteErrorCode == 1) + { + // Column already exists — safe to ignore. + } + } } private static string LoadScript()