Workspace Database Creation & Migrations - Complete Overview Current System Architecture Your project uses two complementary approaches for database management: 1. syntaxis-core (Embedded Migrations) - Location: core/crates/syntaxis-core/migrations/ - Migration file: 20250101000001_init.sql - Approach: Embedded SQL schema (run programmatically) - Automatic: ✅ Runs on every PersistenceLayer::new() call 2. syntaxis-api (SQLx Migrations) - Location: core/crates/syntaxis-api/migrations/ - Migration files: - 20250113_001_initial_schema.sql - 20250114_enhanced_features.sql - 20250115_003_revoked_tokens.sql - Approach: Traditional SQLx migration files (not automatically run) - Automatic: ⚠️ Requires manual setup (see below) How Database Initialization Works syntaxis-core (Automatic) Code in syntaxis-core/src/persistence.rs:85-200: /// Run database migrations (called automatically) async fn run_migrations(pool: &SqlitePool) -> Result<()> { // 1. Enable foreign keys sqlx::query("PRAGMA foreign_keys = ON") .execute(pool) .await?; // 2. Create tables (IF NOT EXISTS - safe to run multiple times) sqlx::query("CREATE TABLE IF NOT EXISTS projects (...)") .execute(pool) .await?; // ... more tables ... } When it runs: - Automatically when you call PersistenceLayer::new(db_path) ✅ - Also when you use PersistenceLayer::global(tool_name) ✅ - Also when you use PersistenceLayer::new_memory() (for tests) ✅ Tables created: 1. projects - Main project metadata 2. checklist_items - Tasks and phases 3. phase_transitions - Audit trail of phase changes 4. security_assessments - Security scan results 5. tool_configurations - Tool settings per project 6. activity_logs - Change log 7. backup_history - Backup records syntaxis-api (Manual/Future) The migration files exist but aren't automatically run. This is intentional - syntaxis-api is designed to be optional and use syntaxis-core's schema. Database Locations After installation, databases are stored in: ~/.local/share/core/ ├── workspace.db # Main database (created by workspace CLI/TUI) ├── api-database.db # API database (if running syntaxis-api) └── ... (other data files) Configuration for paths: - Set in wrapper script by install-cli.nu - Env var: WORKSPACE_DATA_DIR=~/.local/share/syntaxis How to Create & Initialize the Database Option 1: Automatic (Recommended) Simply run any workspace command - database is created automatically: workspace project list # ✅ Creates ~/.local/share/core/workspace.db # ✅ Runs migrations automatically # ✅ Ready to use Option 2: Programmatic (for developers) use workspace_core::persistence::PersistenceLayer; #[tokio::main] async fn main() -> Result<()> { // Option A: Create at custom location let db = PersistenceLayer::new("/path/to/database.db").await?; // Option B: Create at standard location let db = PersistenceLayer::global("workspace").await?; // Option C: In-memory for testing let db = PersistenceLayer::new_memory().await?; // Database is ready with all tables created and migrations applied Ok(()) } Option 3: For syntaxis-api (Manual Setup - Future) If you want to use syntaxis-api with its own migrations: # Install sqlx-cli cargo install sqlx-cli --no-default-features --features sqlite # Run migrations sqlx migrate run \ --database-url "sqlite:///path/to/api.db" \ --source "core/crates/syntaxis-api/migrations" # API database is ready What Gets Created Schema (in syntaxis-core) -- All these tables with indexes: projects -- Core project data checklist_items -- Tasks (with phase, priority, due dates, etc) phase_transitions -- Audit trail security_assessments -- Security scan results tool_configurations -- Tool settings activity_logs -- Change tracking backup_history -- Backup records Pragmas (Best Practices) PRAGMA foreign_keys = ON; -- Enforce referential integrity -- All CREATE statements use: IF NOT EXISTS -- Safe to run multiple times ✅ Integration with Wrapper Scripts The wrapper scripts ensure database directory exists: In install-cli.nu, the wrapper sets: $env.WORKSPACE_DATA_DIR = "~/.local/share/syntaxis" Then syntaxis-core code uses this path to store the database. Testing & Development For tests, use in-memory database (no file I/O): #[tokio::test] async fn test_project_creation() { // In-memory database created on test startup let db = PersistenceLayer::new_memory().await.unwrap(); // Database is fully initialized with all tables // Test your code here // Database automatically cleaned up when test ends } What You Should Know ✅ Automatic: Database created on first use ✅ Idempotent: Migrations use IF NOT EXISTS - safe to run multiple times ✅ Type-safe: SQLx compile-time checked queries ✅ No setup needed: Just run workspace project list ⚠️ syntaxis-api migrations: Not auto-run (by design) - use manual setup if needed ✅ Standard locations: Uses ~/.local/share/ (XDG spec) Summary | Aspect | Status | |----------------|-----------------------------------------------------| | Auto-creation | ✅ Yes (syntaxis-core) | | Location | ~/.local/share/core/ | | Schema version | 20250101 (syntaxis-core), 20250115 (syntaxis-api) | | Tables | 8 tables with indexes | | Foreign keys | ✅ Enabled | | Migrations | Embedded in code (automatic) | | Manual setup | Not needed for syntaxis-core | | API setup | Optional (sqlx-cli required) | Everything is already set up and will work automatically when you run the workspace tools! 🎉