feat: expand threads and npcs schema with deeper tracking fields

Adds detailed tracking columns to threads (stakes, origin, next beat,
etc.) and npcs (appearance, personality, secrets, disposition, etc.),
plus a migration script to add the columns to existing databases.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
claudecode
2026-07-01 11:56:35 -04:00
parent 85d2cb5581
commit 2e8de105b2
2 changed files with 98 additions and 13 deletions
+42 -13
View File
@@ -130,22 +130,51 @@ CREATE TABLE campaigns (
--- Trackers --- --- Trackers ---
CREATE TABLE threads ( CREATE TABLE threads (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
campaign_id INTEGER NOT NULL REFERENCES campaigns(id), campaign_id INTEGER NOT NULL REFERENCES campaigns(id),
title TEXT NOT NULL, title TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'active', status TEXT NOT NULL DEFAULT 'active',
notes TEXT, notes TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')) related_npcs TEXT,
related_location TEXT,
origin TEXT,
stakes TEXT,
last_development TEXT,
next_beat TEXT,
suspected_resolution TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
); );
CREATE TABLE npcs ( CREATE TABLE npcs (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
campaign_id INTEGER NOT NULL REFERENCES campaigns(id), campaign_id INTEGER NOT NULL REFERENCES campaigns(id),
name TEXT NOT NULL, name TEXT NOT NULL,
description TEXT, description TEXT,
notes TEXT, notes TEXT,
motivations TEXT, motivations TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')) appearance TEXT,
age TEXT,
gender TEXT,
pronouns TEXT,
voice TEXT,
distinguishing_features TEXT,
faction TEXT,
occupation TEXT,
social_status TEXT,
relationship_to_pc TEXT,
loyalty TEXT,
personality_traits TEXT,
fears TEXT,
desires TEXT,
secrets TEXT,
first_encountered TEXT,
last_seen TEXT,
current_location TEXT,
current_goal TEXT,
role_in_threads TEXT,
alive_status TEXT DEFAULT 'alive',
disposition TEXT DEFAULT 'unknown',
created_at TEXT NOT NULL DEFAULT (datetime('now'))
); );
--- Notes --- --- Notes ---
+56
View File
@@ -0,0 +1,56 @@
const Database = require('better-sqlite3');
const path = require('path');
const dbPath = path.join(__dirname, '..', 'data', 'mythic-oracle.db');
const db = new Database(dbPath);
const alterations = [
{ table: 'threads', column: 'related_npcs', sql: 'ALTER TABLE threads ADD COLUMN related_npcs TEXT' },
{ table: 'threads', column: 'related_location', sql: 'ALTER TABLE threads ADD COLUMN related_location TEXT' },
{ table: 'threads', column: 'origin', sql: 'ALTER TABLE threads ADD COLUMN origin TEXT' },
{ table: 'threads', column: 'stakes', sql: 'ALTER TABLE threads ADD COLUMN stakes TEXT' },
{ table: 'threads', column: 'last_development', sql: 'ALTER TABLE threads ADD COLUMN last_development TEXT' },
{ table: 'threads', column: 'next_beat', sql: 'ALTER TABLE threads ADD COLUMN next_beat TEXT' },
{ table: 'threads', column: 'suspected_resolution', sql: 'ALTER TABLE threads ADD COLUMN suspected_resolution TEXT' },
{ table: 'npcs', column: 'appearance', sql: 'ALTER TABLE npcs ADD COLUMN appearance TEXT' },
{ table: 'npcs', column: 'age', sql: 'ALTER TABLE npcs ADD COLUMN age TEXT' },
{ table: 'npcs', column: 'gender', sql: 'ALTER TABLE npcs ADD COLUMN gender TEXT' },
{ table: 'npcs', column: 'pronouns', sql: 'ALTER TABLE npcs ADD COLUMN pronouns TEXT' },
{ table: 'npcs', column: 'voice', sql: 'ALTER TABLE npcs ADD COLUMN voice TEXT' },
{ table: 'npcs', column: 'distinguishing_features', sql: 'ALTER TABLE npcs ADD COLUMN distinguishing_features TEXT' },
{ table: 'npcs', column: 'faction', sql: 'ALTER TABLE npcs ADD COLUMN faction TEXT' },
{ table: 'npcs', column: 'occupation', sql: 'ALTER TABLE npcs ADD COLUMN occupation TEXT' },
{ table: 'npcs', column: 'social_status', sql: 'ALTER TABLE npcs ADD COLUMN social_status TEXT' },
{ table: 'npcs', column: 'relationship_to_pc', sql: 'ALTER TABLE npcs ADD COLUMN relationship_to_pc TEXT' },
{ table: 'npcs', column: 'loyalty', sql: 'ALTER TABLE npcs ADD COLUMN loyalty TEXT' },
{ table: 'npcs', column: 'personality_traits', sql: 'ALTER TABLE npcs ADD COLUMN personality_traits TEXT' },
{ table: 'npcs', column: 'fears', sql: 'ALTER TABLE npcs ADD COLUMN fears TEXT' },
{ table: 'npcs', column: 'desires', sql: 'ALTER TABLE npcs ADD COLUMN desires TEXT' },
{ table: 'npcs', column: 'secrets', sql: 'ALTER TABLE npcs ADD COLUMN secrets TEXT' },
{ table: 'npcs', column: 'first_encountered', sql: 'ALTER TABLE npcs ADD COLUMN first_encountered TEXT' },
{ table: 'npcs', column: 'last_seen', sql: 'ALTER TABLE npcs ADD COLUMN last_seen TEXT' },
{ table: 'npcs', column: 'current_location', sql: 'ALTER TABLE npcs ADD COLUMN current_location TEXT' },
{ table: 'npcs', column: 'current_goal', sql: 'ALTER TABLE npcs ADD COLUMN current_goal TEXT' },
{ table: 'npcs', column: 'role_in_threads', sql: 'ALTER TABLE npcs ADD COLUMN role_in_threads TEXT' },
{ table: 'npcs', column: 'alive_status', sql: "ALTER TABLE npcs ADD COLUMN alive_status TEXT DEFAULT 'alive'" },
{ table: 'npcs', column: 'disposition', sql: "ALTER TABLE npcs ADD COLUMN disposition TEXT DEFAULT 'unknown'" },
];
let added = 0;
let skipped = 0;
for (const { table, column, sql } of alterations) {
try {
db.exec(sql);
console.log(`Added column ${column} to ${table}`);
added++;
} catch (err) {
console.log(`Skipped ${column} on ${table}: ${err.message}`);
skipped++;
}
}
console.log(`\nSummary: ${added} column(s) added, ${skipped} column(s) skipped`);
db.close();