diff --git a/ROADMAP.md b/ROADMAP.md index 1cbb110..97f74dc 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -4,6 +4,7 @@ ## Completed +- [x] Deduplicate DB schema: e2e seeders now reuse `migrate()` from `src/db/migrations.ts` instead of inline CREATE TABLE statements - [x] Display cost summary in dashboard stats bar (Overall$) and session cards - [x] Add comprehensive end-to-end tests for dashboard - [x] Auto-set npm version from release tag in CI publish workflow diff --git a/tests/e2e/seed-db.ts b/tests/e2e/seed-db.ts index 56b3739..b9ab03e 100644 --- a/tests/e2e/seed-db.ts +++ b/tests/e2e/seed-db.ts @@ -1,6 +1,7 @@ import { Database } from "bun:sqlite"; import { mkdirSync, rmSync } from "node:fs"; import { dirname } from "node:path"; +import { migrate } from "../../src/db/migrations"; const dbPath = process.env.OPENCODE_USAGE_STATS_DB; @@ -13,67 +14,7 @@ rmSync(dbPath, { force: true }); const db = new Database(dbPath); -// --- Schema --- - -db.run(` - CREATE TABLE IF NOT EXISTS sessions ( - session_id TEXT PRIMARY KEY, - project_id TEXT, - parent_id TEXT, - title TEXT, - directory TEXT, - first_seen TEXT NOT NULL DEFAULT (datetime('now')), - last_seen TEXT NOT NULL DEFAULT (datetime('now')) - ) -`); - -db.run(` - CREATE TABLE IF NOT EXISTS messages ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - timestamp TEXT NOT NULL DEFAULT (datetime('now')), - session_id TEXT NOT NULL, - message_id TEXT NOT NULL, - role TEXT NOT NULL, - model_id TEXT, - provider_id TEXT, - input_tokens INTEGER DEFAULT 0, - output_tokens INTEGER DEFAULT 0, - reasoning_tokens INTEGER DEFAULT 0, - cache_read_tokens INTEGER DEFAULT 0, - cache_write_tokens INTEGER DEFAULT 0, - cost REAL DEFAULT 0, - agent TEXT, - UNIQUE(session_id, message_id) - ) -`); - -db.run(` - CREATE TABLE IF NOT EXISTS tool_calls ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - timestamp TEXT NOT NULL DEFAULT (datetime('now')), - session_id TEXT NOT NULL, - call_id TEXT NOT NULL UNIQUE, - tool_name TEXT NOT NULL, - agent_type TEXT, - description TEXT, - duration_ms INTEGER, - agent TEXT, - model_id TEXT, - provider_id TEXT - ) -`); - -db.run(` - CREATE TABLE IF NOT EXISTS daily_usage ( - day TEXT PRIMARY KEY, - tokens_total INTEGER NOT NULL DEFAULT 0, - cost_total REAL NOT NULL DEFAULT 0, - sessions_count INTEGER NOT NULL DEFAULT 0, - messages_count INTEGER NOT NULL DEFAULT 0, - tool_calls_count INTEGER NOT NULL DEFAULT 0, - updated_at TEXT NOT NULL DEFAULT (datetime('now')) - ) -`); +migrate(db); // --- Helper: date strings relative to now --- diff --git a/tests/e2e/seed-empty-db.ts b/tests/e2e/seed-empty-db.ts index 59f770e..f830643 100644 --- a/tests/e2e/seed-empty-db.ts +++ b/tests/e2e/seed-empty-db.ts @@ -1,6 +1,7 @@ import { Database } from "bun:sqlite"; import { mkdirSync, rmSync } from "node:fs"; import { dirname } from "node:path"; +import { migrate } from "../../src/db/migrations"; const dbPath = process.env.OPENCODE_USAGE_STATS_DB; @@ -13,64 +14,6 @@ rmSync(dbPath, { force: true }); const db = new Database(dbPath); -db.run(` - CREATE TABLE IF NOT EXISTS sessions ( - session_id TEXT PRIMARY KEY, - project_id TEXT, - parent_id TEXT, - title TEXT, - directory TEXT, - first_seen TEXT NOT NULL DEFAULT (datetime('now')), - last_seen TEXT NOT NULL DEFAULT (datetime('now')) - ) -`); - -db.run(` - CREATE TABLE IF NOT EXISTS messages ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - timestamp TEXT NOT NULL DEFAULT (datetime('now')), - session_id TEXT NOT NULL, - message_id TEXT NOT NULL, - role TEXT NOT NULL, - model_id TEXT, - provider_id TEXT, - input_tokens INTEGER DEFAULT 0, - output_tokens INTEGER DEFAULT 0, - reasoning_tokens INTEGER DEFAULT 0, - cache_read_tokens INTEGER DEFAULT 0, - cache_write_tokens INTEGER DEFAULT 0, - cost REAL DEFAULT 0, - agent TEXT, - UNIQUE(session_id, message_id) - ) -`); - -db.run(` - CREATE TABLE IF NOT EXISTS tool_calls ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - timestamp TEXT NOT NULL DEFAULT (datetime('now')), - session_id TEXT NOT NULL, - call_id TEXT NOT NULL UNIQUE, - tool_name TEXT NOT NULL, - agent_type TEXT, - description TEXT, - duration_ms INTEGER, - agent TEXT, - model_id TEXT, - provider_id TEXT - ) -`); - -db.run(` - CREATE TABLE IF NOT EXISTS daily_usage ( - day TEXT PRIMARY KEY, - tokens_total INTEGER NOT NULL DEFAULT 0, - cost_total REAL NOT NULL DEFAULT 0, - sessions_count INTEGER NOT NULL DEFAULT 0, - messages_count INTEGER NOT NULL DEFAULT 0, - tool_calls_count INTEGER NOT NULL DEFAULT 0, - updated_at TEXT NOT NULL DEFAULT (datetime('now')) - ) -`); +migrate(db); db.close();