skills/seanchiuai/multishot/database-schema

database-schema

SKILL.md

Database Schema

STATUS: NOT IMPLEMENTED IN MVP This skill documents the planned schema for post-MVP persistence. MVP currently has no database - all state is in-memory.

Location: ~/.multishot/database.sqlite

Tables

CREATE TABLE runs (
  id TEXT PRIMARY KEY,
  name TEXT NOT NULL,
  created_at INTEGER NOT NULL,
  status TEXT NOT NULL,  -- 'active' | 'completed'
  current_round_id TEXT,
  FOREIGN KEY (current_round_id) REFERENCES rounds(id)
);

CREATE TABLE rounds (
  id TEXT PRIMARY KEY,
  run_id TEXT NOT NULL,
  round_number INTEGER NOT NULL,
  base_prompt TEXT NOT NULL,
  created_at INTEGER NOT NULL,
  winner_agent_id TEXT,
  winner_files_path TEXT,
  status TEXT NOT NULL,  -- 'running' | 'selecting' | 'completed'
  FOREIGN KEY (run_id) REFERENCES runs(id),
  FOREIGN KEY (winner_agent_id) REFERENCES agents(id)
);

CREATE TABLE agents (
  id TEXT PRIMARY KEY,
  round_id TEXT NOT NULL,
  agent_number INTEGER NOT NULL,  -- 1-4
  sandbox_id TEXT,
  variation_prompt TEXT NOT NULL,
  status TEXT NOT NULL,  -- 'initializing' | 'running' | 'completed' | 'failed' | 'selected'
  created_at INTEGER NOT NULL,
  completed_at INTEGER,
  error_message TEXT,
  FOREIGN KEY (round_id) REFERENCES rounds(id)
);

CREATE TABLE output_logs (
  id TEXT PRIMARY KEY,
  agent_id TEXT NOT NULL,
  timestamp INTEGER NOT NULL,
  content TEXT NOT NULL,
  FOREIGN KEY (agent_id) REFERENCES agents(id)
);

CREATE TABLE credentials (
  key TEXT PRIMARY KEY,
  value TEXT NOT NULL,  -- Reference to safeStorage, not plaintext
  updated_at INTEGER NOT NULL
);

Indexes

CREATE INDEX idx_runs_created_at ON runs(created_at DESC);
CREATE INDEX idx_agents_round_id ON agents(round_id);
CREATE INDEX idx_logs_agent_id ON output_logs(agent_id);

better-sqlite3 Usage

import Database from 'better-sqlite3'

const db = new Database(path.join(os.homedir(), '.multishot', 'database.sqlite'))

// Synchronous API (no async/await needed)
const run = db.prepare('SELECT * FROM runs WHERE id = ?').get(runId)
const agents = db.prepare('SELECT * FROM agents WHERE round_id = ?').all(roundId)

db.prepare('INSERT INTO runs (id, name, created_at, status) VALUES (?, ?, ?, ?)')
  .run(id, name, Date.now(), 'active')

File Storage

Winner files extracted to: ~/.multishot/runs/[run-uuid]/round-N-winner/

Logs archived to: ~/.multishot/runs/[run-uuid]/logs/agent-N.log

Weekly Installs
5
First Seen
Jan 28, 2026
Installed on
codex5
gemini-cli4
cline4
github-copilot4
continue4
cursor4