import { homedir, platform } from 'node:os'; import { join } from 'node:path'; /** * Get the module storage path based on environment and platform * * @returns Absolute path to module storage directory */ export function getModuleStoragePath(): string { return join(getDataDir(), 'modules'); } /** * Get the base data directory for Celilo * * Priority: * 1. CELILO_DATA_DIR environment variable (explicit override) * 2. ENVIRONMENT=dev uses ./celilo-data/ (for testing) * 3. Platform defaults — always user-scoped so the CLI works without root: * - macOS: ~/Library/Application Support/celilo/ * - Linux: $XDG_DATA_HOME/celilo/ (defaults to ~/.local/share/celilo/) * * @returns Absolute path to base data directory */ export function getDataDir(): string { // Explicit override if (process.env.CELILO_DATA_DIR) { return process.env.CELILO_DATA_DIR; } // Development mode if (process.env.ENVIRONMENT === 'dev') { return join(process.cwd(), 'celilo-data'); } // macOS if (platform() === 'darwin') { return join(homedir(), 'Library', 'Application Support', 'celilo'); } // Linux/other — XDG Base Directory spec, user-scoped (no sudo needed). // System-wide installs can opt in via CELILO_DATA_DIR=/var/lib/celilo. const xdgDataHome = process.env.XDG_DATA_HOME || join(homedir(), '.local', 'share'); return join(xdgDataHome, 'celilo'); } /** * Get the master key file path * * @returns Absolute path to master key file */ export function getMasterKeyPath(): string { // Explicit override if (process.env.CELILO_MASTER_KEY_PATH) { return process.env.CELILO_MASTER_KEY_PATH; } // Use base data directory + master.key return join(getDataDir(), 'master.key'); } /** * Get database file path * * Priority: * 1. CELILO_DB_PATH environment variable (explicit override) * 2. /celilo.db (platform-specific) * * @returns Absolute path to database file */ export function getDbPath(): string { // Explicit override if (process.env.CELILO_DB_PATH) { return process.env.CELILO_DB_PATH; } // Use data directory + celilo.db return join(getDataDir(), 'celilo.db'); } /** * Get the SQLite event-bus database file path. * * Priority: * 1. EVENT_BUS_DB environment variable (the bus library's native name — * used by the event-bus CLI, defineHandler, and any standalone tool) * 2. /events.db (platform-specific) * * Kept separate from the main celilo.db so the bus library remains * standalone — the bus owns its own schema and migrations. * * @returns Absolute path to event-bus database */ export function getEventBusPath(): string { if (process.env.EVENT_BUS_DB) { return process.env.EVENT_BUS_DB; } return join(getDataDir(), 'events.db'); } /** * Shorten a path by replacing the celilo data directory with $CELILO_DATA * For display purposes in CLI output. * * @param absolutePath - Absolute path to shorten * @returns Shortened path with $CELILO_DATA prefix */ export function shortenPath(absolutePath: string): string { const dataDir = getDataDir(); if (absolutePath.startsWith(dataDir)) { return absolutePath.replace(dataDir, '$CELILO_DATA'); } return absolutePath; }