@vladimir-ks/aigile 0.1.1-alpha.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/config.ts","../../src/db/connection.ts","../../src/bin/aigile.ts","../../src/index.ts","../../src/commands/init.ts","../../src/utils/git.ts","../../src/services/output-formatter.ts","../../src/services/template-packs.ts","../../src/commands/project.ts","../../src/commands/epic.ts","../../src/services/workflow-engine.ts","../../src/commands/story.ts","../../src/commands/task.ts","../../src/commands/bug.ts","../../src/commands/sprint.ts","../../src/commands/status.ts","../../src/commands/initiative.ts","../../src/commands/sync.ts","../../src/services/file-scanner.ts","../../src/services/frontmatter-parser.ts","../../src/services/comment-parser.ts","../../src/commands/session.ts","../../src/services/session-service.ts","../../src/services/activity-logger.ts","../../src/commands/context.ts","../../src/services/context-loader.ts","../../src/commands/query.ts","../../src/services/query-service.ts","../../src/commands/ai.ts","../../src/services/ai-helper.ts","../../src/commands/component.ts","../../src/commands/version.ts","../../src/commands/persona.ts","../../src/commands/ux-journey.ts","../../src/commands/doc.ts","../../src/commands/daemon.ts","../../src/services/file-watcher.ts"],"sourcesContent":["/**\n * Configuration Loader\n *\n * Handles loading and saving AIGILE configuration files.\n *\n * @author Vladimir K.S.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\n\n/**\n * Global configuration structure (~/.aigile/config.yaml)\n */\nexport interface GlobalConfig {\n version: number;\n database: {\n path: string;\n backup_enabled: boolean;\n backup_frequency: 'daily' | 'weekly' | 'manual';\n max_backups: number;\n };\n default_project: {\n key: string | null;\n name: string | null;\n };\n preferences: {\n date_format: string;\n time_format: string;\n timezone: string;\n theme: string;\n };\n}\n\n/**\n * Local project configuration structure (.aigile/config.yaml)\n */\nexport interface ProjectConfig {\n project: {\n key: string;\n name: string;\n };\n sync: {\n enabled: boolean;\n patterns: string[];\n ignore: string[];\n };\n}\n\n/**\n * Get the AIGILE home directory (~/.aigile)\n */\nexport function getAigileHome(): string {\n const home = process.env.AIGILE_HOME ?? join(homedir(), '.aigile');\n return home;\n}\n\n/**\n * Get the database path\n */\nexport function getDbPath(): string {\n const dbPath = process.env.AIGILE_DB_PATH ?? join(getAigileHome(), 'aigile.db');\n return dbPath;\n}\n\n/**\n * Ensure the AIGILE home directory exists\n */\nexport function ensureAigileHome(): void {\n const home = getAigileHome();\n\n if (!existsSync(home)) {\n mkdirSync(home, { recursive: true });\n }\n\n // Create subdirectories\n const subdirs = ['fields', 'workflows', 'templates', 'backups'];\n for (const subdir of subdirs) {\n const path = join(home, subdir);\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n }\n}\n\n/**\n * Get default global configuration\n */\nexport function getDefaultGlobalConfig(): GlobalConfig {\n return {\n version: 1,\n database: {\n path: join(getAigileHome(), 'aigile.db'),\n backup_enabled: true,\n backup_frequency: 'daily',\n max_backups: 7\n },\n default_project: {\n key: null,\n name: null\n },\n preferences: {\n date_format: 'YYYY-MM-DD',\n time_format: 'HH:mm',\n timezone: 'UTC',\n theme: 'default'\n }\n };\n}\n\n/**\n * Load global configuration\n */\nexport function loadGlobalConfig(): GlobalConfig {\n const configPath = join(getAigileHome(), 'config.yaml');\n\n if (!existsSync(configPath)) {\n return getDefaultGlobalConfig();\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n const config = parseYaml(content) as Partial<GlobalConfig>;\n return { ...getDefaultGlobalConfig(), ...config };\n } catch {\n return getDefaultGlobalConfig();\n }\n}\n\n/**\n * Save global configuration\n */\nexport function saveGlobalConfig(config: GlobalConfig): void {\n ensureAigileHome();\n const configPath = join(getAigileHome(), 'config.yaml');\n const content = stringifyYaml(config);\n writeFileSync(configPath, content, 'utf-8');\n}\n\n/**\n * Get default project configuration\n */\nexport function getDefaultProjectConfig(key: string, name: string): ProjectConfig {\n return {\n project: {\n key,\n name\n },\n sync: {\n enabled: true,\n patterns: ['*.feature', '*.md'],\n ignore: ['node_modules', 'dist', '.git']\n }\n };\n}\n\n/**\n * Load project configuration from .aigile/config.yaml\n */\nexport function loadProjectConfig(projectPath: string): ProjectConfig | null {\n const configPath = join(projectPath, '.aigile', 'config.yaml');\n\n if (!existsSync(configPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n return parseYaml(content) as ProjectConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Save project configuration to .aigile/config.yaml\n */\nexport function saveProjectConfig(projectPath: string, config: ProjectConfig): void {\n const aigileDir = join(projectPath, '.aigile');\n\n if (!existsSync(aigileDir)) {\n mkdirSync(aigileDir, { recursive: true });\n }\n\n const configPath = join(aigileDir, 'config.yaml');\n const content = stringifyYaml(config);\n writeFileSync(configPath, content, 'utf-8');\n}\n\n/**\n * Find project root by looking for .aigile directory\n */\nexport function findProjectRoot(startPath: string = process.cwd()): string | null {\n let currentPath = startPath;\n\n while (currentPath !== '/') {\n if (existsSync(join(currentPath, '.aigile'))) {\n return currentPath;\n }\n currentPath = join(currentPath, '..');\n }\n\n return null;\n}\n","/**\n * Database Connection Manager\n *\n * Manages SQLite database connection for AIGILE CLI.\n * Uses sql.js for pure JavaScript SQLite (no native compilation needed).\n *\n * @author Vladimir K.S.\n */\n\nimport initSqlJs, { Database as SqlJsDatabase } from 'sql.js';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { dirname } from 'path';\nimport { getDbPath, ensureAigileHome } from '../utils/config.js';\n\nlet db: SqlJsDatabase | null = null;\nlet dbPath: string = '';\n\n/**\n * Initialize and get database connection\n */\nexport async function initDatabase(): Promise<SqlJsDatabase> {\n if (db) {\n return db;\n }\n\n ensureAigileHome();\n dbPath = getDbPath();\n\n // Ensure directory exists\n const dbDir = dirname(dbPath);\n if (!existsSync(dbDir)) {\n mkdirSync(dbDir, { recursive: true });\n }\n\n const SQL = await initSqlJs();\n\n if (existsSync(dbPath)) {\n const fileBuffer = readFileSync(dbPath);\n db = new SQL.Database(fileBuffer);\n // Run migrations on existing database\n runMigrations();\n } else {\n db = new SQL.Database();\n initializeSchema(db!);\n saveDatabase();\n }\n\n return db!;\n}\n\n/**\n * Get database (must call initDatabase first)\n */\nexport function getDatabase(): SqlJsDatabase {\n if (!db) {\n throw new Error('Database not initialized. Call initDatabase() first.');\n }\n return db;\n}\n\n/**\n * Save database to file\n */\nexport function saveDatabase(): void {\n if (db && dbPath) {\n const data = db.export();\n const buffer = Buffer.from(data);\n writeFileSync(dbPath, buffer);\n }\n}\n\n/**\n * Close database connection\n */\nexport function closeDatabase(): void {\n if (db) {\n saveDatabase();\n db.close();\n db = null;\n }\n}\n\n/**\n * Run a query and return all results\n */\nexport function queryAll<T>(sql: string, params: unknown[] = []): T[] {\n const database = getDatabase();\n const stmt = database.prepare(sql);\n stmt.bind(params);\n\n const results: T[] = [];\n while (stmt.step()) {\n const row = stmt.getAsObject();\n results.push(row as T);\n }\n stmt.free();\n\n return results;\n}\n\n/**\n * Run a query and return first result\n */\nexport function queryOne<T>(sql: string, params: unknown[] = []): T | undefined {\n const results = queryAll<T>(sql, params);\n return results[0];\n}\n\n/**\n * Run a statement (INSERT, UPDATE, DELETE)\n */\nexport function run(sql: string, params: unknown[] = []): void {\n const database = getDatabase();\n database.run(sql, params);\n saveDatabase();\n}\n\n/**\n * Initialize database schema\n */\nfunction initializeSchema(database: SqlJsDatabase): void {\n // Projects table\n database.run(`\n CREATE TABLE IF NOT EXISTS projects (\n id TEXT PRIMARY KEY,\n key TEXT NOT NULL UNIQUE,\n name TEXT NOT NULL,\n path TEXT NOT NULL UNIQUE,\n description TEXT,\n is_default INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Key sequences table\n database.run(`\n CREATE TABLE IF NOT EXISTS key_sequences (\n id TEXT PRIMARY KEY,\n prefix TEXT NOT NULL UNIQUE,\n current_value INTEGER NOT NULL DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Initiatives table\n database.run(`\n CREATE TABLE IF NOT EXISTS initiatives (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n summary TEXT NOT NULL,\n description TEXT,\n status TEXT DEFAULT 'draft',\n priority TEXT DEFAULT 'Medium',\n owner TEXT,\n start_date TEXT,\n target_date TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Epics table\n database.run(`\n CREATE TABLE IF NOT EXISTS epics (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n summary TEXT NOT NULL,\n description TEXT,\n initiative_id TEXT REFERENCES initiatives(id),\n status TEXT DEFAULT 'backlog',\n priority TEXT DEFAULT 'Medium',\n owner TEXT,\n reporter TEXT,\n labels TEXT,\n components TEXT,\n fix_versions TEXT,\n story_points INTEGER,\n start_date TEXT,\n due_date TEXT,\n persona_ids TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // User stories table\n database.run(`\n CREATE TABLE IF NOT EXISTS user_stories (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n epic_id TEXT REFERENCES epics(id),\n summary TEXT NOT NULL,\n description TEXT,\n as_a TEXT,\n i_want TEXT,\n so_that TEXT,\n acceptance_criteria TEXT,\n status TEXT DEFAULT 'backlog',\n priority TEXT DEFAULT 'Medium',\n story_points INTEGER,\n assignee TEXT,\n reporter TEXT,\n labels TEXT,\n components TEXT,\n fix_versions TEXT,\n sprint_id TEXT REFERENCES sprints(id),\n due_date TEXT,\n original_estimate REAL,\n remaining_estimate REAL,\n time_spent REAL DEFAULT 0,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Tasks table\n database.run(`\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n story_id TEXT REFERENCES user_stories(id),\n parent_id TEXT REFERENCES tasks(id),\n issue_type TEXT DEFAULT 'task',\n summary TEXT NOT NULL,\n description TEXT,\n status TEXT DEFAULT 'todo',\n priority TEXT DEFAULT 'Medium',\n assignee TEXT,\n reporter TEXT,\n labels TEXT,\n components TEXT,\n sprint_id TEXT REFERENCES sprints(id),\n original_estimate REAL,\n remaining_estimate REAL,\n time_spent REAL DEFAULT 0,\n blocked_reason TEXT,\n due_date TEXT,\n resolved_at TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Bugs table\n database.run(`\n CREATE TABLE IF NOT EXISTS bugs (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n story_id TEXT REFERENCES user_stories(id),\n epic_id TEXT REFERENCES epics(id),\n summary TEXT NOT NULL,\n description TEXT,\n steps_to_reproduce TEXT,\n expected_behavior TEXT,\n actual_behavior TEXT,\n status TEXT DEFAULT 'open',\n priority TEXT DEFAULT 'Medium',\n severity TEXT DEFAULT 'Major',\n resolution TEXT,\n environment TEXT,\n affected_versions TEXT,\n fix_versions TEXT,\n assignee TEXT,\n reporter TEXT,\n labels TEXT,\n components TEXT,\n resolved_at TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Sprints table\n database.run(`\n CREATE TABLE IF NOT EXISTS sprints (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n name TEXT NOT NULL,\n goal TEXT,\n status TEXT DEFAULT 'future',\n start_date TEXT NOT NULL,\n end_date TEXT NOT NULL,\n velocity INTEGER,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Components table\n database.run(`\n CREATE TABLE IF NOT EXISTS components (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n name TEXT NOT NULL,\n description TEXT,\n lead TEXT,\n default_assignee TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Versions table\n database.run(`\n CREATE TABLE IF NOT EXISTS versions (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n name TEXT NOT NULL,\n description TEXT,\n status TEXT DEFAULT 'unreleased',\n start_date TEXT,\n release_date TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Activity log table\n database.run(`\n CREATE TABLE IF NOT EXISTS activity_log (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n entity_type TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n action TEXT NOT NULL,\n old_value TEXT,\n new_value TEXT,\n actor TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Documents table (file tracking with frontmatter metadata)\n database.run(`\n CREATE TABLE IF NOT EXISTS documents (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n path TEXT NOT NULL,\n filename TEXT NOT NULL,\n extension TEXT,\n content_hash TEXT,\n size_bytes INTEGER,\n entity_type TEXT,\n entity_id TEXT,\n status TEXT DEFAULT 'tracked',\n last_scanned_at TEXT,\n -- Frontmatter metadata fields\n meta_status TEXT,\n meta_version TEXT,\n meta_tldr TEXT,\n meta_title TEXT,\n meta_modules TEXT,\n meta_dependencies TEXT,\n meta_code_refs TEXT,\n meta_authors TEXT,\n has_frontmatter INTEGER DEFAULT 0,\n frontmatter_raw TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(project_id, path)\n )\n `);\n\n // Document comments table (marker tracking)\n database.run(`\n CREATE TABLE IF NOT EXISTS doc_comments (\n id TEXT PRIMARY KEY,\n document_id TEXT REFERENCES documents(id),\n marker_type TEXT NOT NULL,\n line_number INTEGER,\n content TEXT NOT NULL,\n resolved INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Sessions table (AI session tracking)\n database.run(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n started_at TEXT DEFAULT (datetime('now')),\n ended_at TEXT,\n summary TEXT,\n entities_modified INTEGER DEFAULT 0,\n files_modified INTEGER DEFAULT 0,\n status TEXT DEFAULT 'active'\n )\n `);\n\n // Personas table (user archetypes)\n database.run(`\n CREATE TABLE IF NOT EXISTS personas (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n role TEXT,\n goals TEXT,\n frustrations TEXT,\n demographics TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // UX Journeys table (user experience flows)\n database.run(`\n CREATE TABLE IF NOT EXISTS ux_journeys (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n persona_id TEXT REFERENCES personas(id),\n stages TEXT,\n touchpoints TEXT,\n pain_points TEXT,\n opportunities TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n}\n\n/**\n * Generate a UUID\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Get next key for a project prefix\n */\nexport function getNextKey(projectKey: string): string {\n const row = queryOne<{ current_value: number }>(\n 'SELECT current_value FROM key_sequences WHERE prefix = ?',\n [projectKey]\n );\n\n const nextValue = (row?.current_value ?? 0) + 1;\n\n if (row) {\n run(\n `UPDATE key_sequences SET current_value = ?, updated_at = datetime('now') WHERE prefix = ?`,\n [nextValue, projectKey]\n );\n } else {\n run(\n `INSERT INTO key_sequences (id, prefix, current_value) VALUES (?, ?, ?)`,\n [generateId(), projectKey, nextValue]\n );\n }\n\n return `${projectKey}-${nextValue}`;\n}\n\n/**\n * Run database migrations for schema updates\n * Adds new columns to existing tables if they don't exist\n */\nexport function runMigrations(): void {\n const database = getDatabase();\n\n // Check if documents table has frontmatter columns\n const columns = queryAll<{ name: string }>(\n `PRAGMA table_info(documents)`\n );\n const columnNames = new Set(columns.map(c => c.name));\n\n // Add frontmatter metadata columns if missing\n const newColumns = [\n { name: 'meta_status', type: 'TEXT' },\n { name: 'meta_version', type: 'TEXT' },\n { name: 'meta_tldr', type: 'TEXT' },\n { name: 'meta_title', type: 'TEXT' },\n { name: 'meta_modules', type: 'TEXT' },\n { name: 'meta_dependencies', type: 'TEXT' },\n { name: 'meta_code_refs', type: 'TEXT' },\n { name: 'meta_authors', type: 'TEXT' },\n { name: 'has_frontmatter', type: 'INTEGER DEFAULT 0' },\n { name: 'frontmatter_raw', type: 'TEXT' },\n ];\n\n for (const col of newColumns) {\n if (!columnNames.has(col.name)) {\n try {\n database.run(`ALTER TABLE documents ADD COLUMN ${col.name} ${col.type}`);\n } catch {\n // Column might already exist, ignore error\n }\n }\n }\n\n saveDatabase();\n}\n","/**\n * AIGILE CLI Entry Point\n *\n * Main entry point for the aigile command-line interface.\n * Provides JIRA-compatible agile project management from the terminal.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { VERSION } from '../index.js';\nimport { initDatabase, closeDatabase } from '../db/connection.js';\nimport { initCommand } from '../commands/init.js';\nimport { projectCommand } from '../commands/project.js';\nimport { epicCommand } from '../commands/epic.js';\nimport { storyCommand } from '../commands/story.js';\nimport { taskCommand } from '../commands/task.js';\nimport { bugCommand } from '../commands/bug.js';\nimport { sprintCommand } from '../commands/sprint.js';\nimport { statusCommand } from '../commands/status.js';\nimport { initiativeCommand } from '../commands/initiative.js';\nimport { syncCommand } from '../commands/sync.js';\nimport { sessionCommand } from '../commands/session.js';\nimport { contextCommand } from '../commands/context.js';\nimport { queryCommand } from '../commands/query.js';\nimport { aiCommand } from '../commands/ai.js';\nimport { componentCommand } from '../commands/component.js';\nimport { versionCommand } from '../commands/version.js';\nimport { personaCommand } from '../commands/persona.js';\nimport { uxJourneyCommand } from '../commands/ux-journey.js';\nimport { docCommand } from '../commands/doc.js';\nimport { daemonCommand } from '../commands/daemon.js';\n\nasync function main() {\n const program = new Command();\n\n program\n .name('aigile')\n .description('JIRA-compatible Agile project management CLI for AI-assisted development')\n .version(VERSION, '-v, --version', 'Display version number')\n .option('--json', 'Output in JSON format for machine parsing')\n .option('--no-color', 'Disable colored output');\n\n // Initialize database before any command runs\n program.hook('preAction', async () => {\n await initDatabase();\n });\n\n // Close database after command completes\n program.hook('postAction', () => {\n closeDatabase();\n });\n\n // Register commands\n program.addCommand(initCommand);\n program.addCommand(projectCommand);\n program.addCommand(initiativeCommand);\n program.addCommand(epicCommand);\n program.addCommand(storyCommand);\n program.addCommand(taskCommand);\n program.addCommand(bugCommand);\n program.addCommand(sprintCommand);\n program.addCommand(statusCommand);\n program.addCommand(syncCommand);\n program.addCommand(sessionCommand);\n program.addCommand(contextCommand);\n program.addCommand(queryCommand);\n program.addCommand(aiCommand);\n program.addCommand(componentCommand);\n program.addCommand(versionCommand);\n program.addCommand(personaCommand);\n program.addCommand(uxJourneyCommand);\n program.addCommand(docCommand);\n program.addCommand(daemonCommand);\n\n // Parse arguments\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => {\n console.error('Error:', err.message);\n process.exit(1);\n});\n","/**\n * AIGILE - JIRA-compatible Agile Project Management Library\n *\n * @packageDocumentation\n * @module @vladimir-ks/aigile\n * @author Vladimir K.S.\n */\n\n// Entity exports (to be implemented)\nexport * from './entities/base';\n\n// Database exports (to be implemented)\n// export * from './db/connection';\n\n// Custom fields exports (to be implemented)\n// export * from './fields/loader';\n\n// Workflow exports (to be implemented)\n// export * from './workflows/engine';\n\n// Version\nexport const VERSION = '0.1.0';\n","/**\n * Init Command\n *\n * Initialize AIGILE in a git repository with profile support.\n * Supports three profiles: full-repo, subrepo, module.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { existsSync, mkdirSync, appendFileSync, readFileSync, writeFileSync } from 'fs';\nimport { resolve, join, relative, basename } from 'path';\nimport { isGitRepo, getGitRoot, getRepoName, generateProjectKey, getSuperprojectRoot } from '../utils/git.js';\nimport {\n saveProjectConfig,\n getDefaultProjectConfig,\n loadProjectConfig,\n ensureAigileHome\n} from '../utils/config.js';\nimport { queryOne, run, generateId } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n warning,\n blank,\n header,\n getOutputOptions,\n type OutputOptions\n} from '../services/output-formatter.js';\nimport {\n InitProfile,\n DbMode,\n getTemplatesForProfile,\n writeTemplates,\n generateConfigYaml,\n AigileConfig\n} from '../services/template-packs.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize AIGILE in current or specified directory')\n .argument('[path]', 'Directory path (defaults to current directory)')\n .option('-k, --key <key>', 'Project key (auto-generated if not specified)')\n .option('-n, --name <name>', 'Project name (auto-detected if not specified)')\n .option('-p, --profile <profile>', 'Init profile: full-repo, subrepo, module')\n .option('--db-mode <mode>', 'Database mode: local, shared (default based on profile)')\n .option('--module-kind <kind>', 'Module kind: library, service, ui, cli, other (for module profile)')\n .option('--skip-templates', 'Skip template file creation')\n .option('-f, --force', 'Reinitialize existing project')\n .action(async (pathArg: string | undefined, options) => {\n const opts = getOutputOptions(initCommand);\n const targetPath = resolve(pathArg ?? process.cwd());\n\n try {\n await initProject(targetPath, options, opts);\n } catch (err) {\n error(err instanceof Error ? err.message : String(err), opts);\n process.exit(1);\n }\n });\n\ninterface InitOptions {\n key?: string;\n name?: string;\n profile?: InitProfile;\n dbMode?: DbMode;\n moduleKind?: string;\n skipTemplates?: boolean;\n force?: boolean;\n}\n\n/**\n * Detect git context to determine appropriate profile\n */\nfunction detectGitContext(targetPath: string): {\n gitRoot: string;\n isSubmodule: boolean;\n isSubdirectory: boolean;\n superprojectRoot: string | null;\n relativePath: string;\n} {\n const gitRoot = getGitRoot(targetPath);\n if (!gitRoot) {\n throw new Error('Could not determine git root directory.');\n }\n\n const superprojectRoot = getSuperprojectRoot(targetPath);\n const isSubmodule = superprojectRoot !== null;\n const isSubdirectory = targetPath !== gitRoot;\n const relativePath = relative(gitRoot, targetPath);\n\n return {\n gitRoot,\n isSubmodule,\n isSubdirectory,\n superprojectRoot,\n relativePath\n };\n}\n\n/**\n * Determine profile based on context and options\n */\nfunction determineProfile(\n context: ReturnType<typeof detectGitContext>,\n options: InitOptions,\n opts: OutputOptions\n): InitProfile {\n // If explicitly specified, use that\n if (options.profile) {\n return options.profile;\n }\n\n // Auto-detect based on context\n if (context.isSubmodule) {\n info('Detected git submodule - using subrepo profile', opts);\n return 'subrepo';\n }\n\n if (context.isSubdirectory) {\n // Check if parent has .aigile\n const parentAigile = join(context.gitRoot, '.aigile');\n if (existsSync(parentAigile)) {\n info('Detected subdirectory with parent AIGILE - using module profile', opts);\n return 'module';\n }\n }\n\n // Default: full-repo at git root\n return 'full-repo';\n}\n\n/**\n * Determine database mode based on profile and options\n */\nfunction determineDbMode(\n profile: InitProfile,\n context: ReturnType<typeof detectGitContext>,\n options: InitOptions\n): { mode: DbMode; path: string } {\n if (options.dbMode) {\n const mode = options.dbMode;\n if (mode === 'local') {\n return { mode: 'local', path: '.aigile/aigile.db' };\n }\n // shared mode - need to find parent DB\n const parentDbPath = findParentDb(context);\n return { mode: 'shared', path: parentDbPath };\n }\n\n // Default based on profile\n switch (profile) {\n case 'full-repo':\n return { mode: 'local', path: '.aigile/aigile.db' };\n case 'subrepo':\n // Default to local for subrepo (isolated product)\n return { mode: 'local', path: '.aigile/aigile.db' };\n case 'module':\n // Modules always share parent DB\n const parentDbPath = findParentDb(context);\n return { mode: 'shared', path: parentDbPath };\n }\n}\n\n/**\n * Find parent database path\n */\nfunction findParentDb(context: ReturnType<typeof detectGitContext>): string {\n // For modules, parent is at git root\n const parentAigile = join(context.gitRoot, '.aigile', 'aigile.db');\n if (existsSync(parentAigile)) {\n // Calculate relative path from target to parent\n const depth = context.relativePath.split('/').filter(p => p).length;\n return '../'.repeat(depth) + '.aigile/aigile.db';\n }\n\n // For submodules, check superproject\n if (context.superprojectRoot) {\n const superprojectAigile = join(context.superprojectRoot, '.aigile', 'aigile.db');\n if (existsSync(superprojectAigile)) {\n return '../.aigile/aigile.db';\n }\n }\n\n // Fallback to local\n return '.aigile/aigile.db';\n}\n\nasync function initProject(\n targetPath: string,\n options: InitOptions,\n opts: OutputOptions\n): Promise<void> {\n // Step 1: Check for git repository\n if (!isGitRepo(targetPath)) {\n throw new Error('AIGILE requires a git repository. Run \"git init\" first.');\n }\n\n // Step 2: Detect git context\n const context = detectGitContext(targetPath);\n\n // Step 3: Check for existing initialization\n const aigileDir = join(targetPath, '.aigile');\n if (existsSync(aigileDir) && !options.force) {\n const existingConfig = loadProjectConfig(targetPath);\n if (existingConfig?.project?.key) {\n throw new Error(\n `AIGILE already initialized (project: ${existingConfig.project.key}). ` +\n 'Use --force to reinitialize.'\n );\n }\n }\n\n // Step 4: Determine profile\n const profile = determineProfile(context, options, opts);\n\n // Step 5: Validate profile for context\n if (profile === 'full-repo' && context.isSubdirectory) {\n const parentAigile = join(context.gitRoot, '.aigile');\n if (existsSync(parentAigile)) {\n throw new Error(\n 'Cannot use full-repo profile in subdirectory when parent has AIGILE. ' +\n 'Use --profile module instead.'\n );\n }\n }\n\n // Step 6: Determine database mode\n const dbConfig = determineDbMode(profile, context, options);\n\n // Step 7: Determine project key and name\n let moduleName = basename(targetPath);\n if (profile === 'module') {\n moduleName = options.name ?? moduleName;\n }\n\n const repoName = profile === 'module' ? moduleName : getRepoName(context.gitRoot);\n const projectKey = options.key ?? generateProjectKey(repoName);\n const projectName = options.name ?? repoName;\n\n // Step 8: Ensure global ~/.aigile/ exists\n ensureAigileHome();\n\n // Step 9: Create .aigile/ directory\n if (!existsSync(aigileDir)) {\n mkdirSync(aigileDir, { recursive: true });\n }\n\n // Step 10: Generate and write config.yaml\n const aigileConfig: AigileConfig = {\n db: {\n mode: dbConfig.mode,\n path: dbConfig.path\n },\n profile,\n repo_root: '.'\n };\n\n if (profile === 'module') {\n aigileConfig.module = {\n name: moduleName,\n kind: options.moduleKind ?? 'other',\n path: context.relativePath\n };\n aigileConfig.parent_repo_root = '../'.repeat(context.relativePath.split('/').filter(p => p).length);\n }\n\n if (profile === 'subrepo' && context.superprojectRoot) {\n aigileConfig.parent_repo_root = '..';\n }\n\n const configYaml = generateConfigYaml(aigileConfig, projectKey, projectName);\n writeFileSync(join(aigileDir, 'config.yaml'), configYaml, 'utf-8');\n\n // Step 11: Write template files (unless skipped)\n let templatesResult = { written: 0, skipped: 0 };\n if (!options.skipTemplates) {\n const templates = getTemplatesForProfile(profile, moduleName);\n templatesResult = writeTemplates(aigileDir, templates);\n }\n\n // Step 12: Register project in central database (only for local DB mode)\n if (dbConfig.mode === 'local') {\n registerProject(targetPath, projectId => {\n const existingProject = queryOne<{ id: string }>(\n 'SELECT id FROM projects WHERE path = ?',\n [targetPath]\n );\n\n const id = existingProject?.id ?? generateId();\n\n if (existingProject) {\n run(\n `UPDATE projects SET key = ?, name = ?, updated_at = datetime('now') WHERE id = ?`,\n [projectKey, projectName, id]\n );\n } else {\n run(\n `INSERT INTO projects (id, key, name, path, is_default) VALUES (?, ?, ?, ?, ?)`,\n [id, projectKey, projectName, targetPath, 0]\n );\n }\n\n // Set as default if no other default exists\n const defaultProject = queryOne<{ id: string }>(\n 'SELECT id FROM projects WHERE is_default = 1',\n []\n );\n\n if (!defaultProject) {\n run('UPDATE projects SET is_default = 1 WHERE id = ?', [id]);\n }\n\n return id;\n });\n }\n\n // Step 13: Update .gitignore\n updateGitignore(targetPath, opts);\n\n // Step 14: Output success message\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n project: {\n key: projectKey,\n name: projectName,\n path: targetPath,\n profile,\n dbMode: dbConfig.mode\n },\n templates: templatesResult\n }));\n } else {\n blank();\n success(`AIGILE initialized with ${profile} profile`, opts);\n blank();\n header('Project Configuration:', opts);\n console.log(` Key: ${projectKey}`);\n console.log(` Name: ${projectName}`);\n console.log(` Path: ${targetPath}`);\n console.log(` Profile: ${profile}`);\n console.log(` DB Mode: ${dbConfig.mode}`);\n\n if (templatesResult.written > 0 || templatesResult.skipped > 0) {\n blank();\n header('Templates:', opts);\n console.log(` Written: ${templatesResult.written} files`);\n console.log(` Skipped: ${templatesResult.skipped} files (already exist)`);\n }\n\n blank();\n header('Next steps:', opts);\n if (profile === 'full-repo' || profile === 'subrepo') {\n console.log(' 1. Fill in 00_DOCS/00_vision/01_mission-vision.md');\n console.log(' 2. Run \"aigile sync scan\" to index your files');\n console.log(' 3. Run \"aigile daemon install && aigile daemon start\" for auto-sync');\n } else {\n console.log(' 1. Fill in docs/01_module-overview.md');\n console.log(' 2. Run \"aigile sync scan\" from repo root to index files');\n }\n blank();\n }\n}\n\nfunction registerProject(\n projectPath: string,\n register: (existingId: string | null) => string\n): string {\n return register(null);\n}\n\nfunction updateGitignore(repoPath: string, opts: OutputOptions): void {\n const gitignorePath = join(repoPath, '.gitignore');\n const aigilePattern = '.aigile/';\n\n if (!existsSync(gitignorePath)) {\n info('No .gitignore found. Consider adding \".aigile/\" to ignore local config.', opts);\n return;\n }\n\n const content = readFileSync(gitignorePath, 'utf-8');\n\n // Check if already present\n const lines = content.split('\\n');\n const hasPattern = lines.some(line => {\n const trimmed = line.trim();\n return trimmed === '.aigile' || trimmed === '.aigile/' || trimmed === '/.aigile/';\n });\n\n if (hasPattern) {\n return; // Already in .gitignore\n }\n\n // Append to .gitignore\n const newLine = content.endsWith('\\n') ? '' : '\\n';\n appendFileSync(gitignorePath, `${newLine}# AIGILE local config\\n.aigile/\\n`);\n info('Added \".aigile/\" to .gitignore', opts);\n}\n","/**\n * Git Utility Functions\n *\n * Provides git-related utilities for AIGILE CLI.\n *\n * @author Vladimir K.S.\n */\n\nimport { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join, basename } from 'path';\n\n/**\n * Check if a directory is a git repository\n */\nexport function isGitRepo(path: string): boolean {\n try {\n execSync('git rev-parse --git-dir', {\n cwd: path,\n stdio: 'pipe'\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the git root directory\n */\nexport function getGitRoot(path: string): string | null {\n try {\n const result = execSync('git rev-parse --show-toplevel', {\n cwd: path,\n stdio: 'pipe',\n encoding: 'utf-8'\n });\n return result.trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Get the repository name from git remote or folder name\n */\nexport function getRepoName(path: string): string {\n try {\n // Try to get from git remote\n const remote = execSync('git config --get remote.origin.url', {\n cwd: path,\n stdio: 'pipe',\n encoding: 'utf-8'\n }).trim();\n\n if (remote) {\n // Extract repo name from URL\n // Handles: git@github.com:user/repo.git, https://github.com/user/repo.git\n const match = remote.match(/\\/([^/]+?)(\\.git)?$/);\n if (match) {\n return match[1];\n }\n }\n } catch {\n // No remote configured, use folder name\n }\n\n // Fall back to folder name\n return basename(path);\n}\n\n/**\n * Generate a project key from repository name\n * Converts \"my-project-name\" to \"MPN\" (uppercase initials)\n */\nexport function generateProjectKey(repoName: string): string {\n // Remove common prefixes/suffixes\n const cleaned = repoName\n .replace(/^(@[^/]+\\/)?/, '') // Remove npm scope\n .replace(/[-_.]?(cli|api|app|web|lib|pkg|core)$/i, '') // Remove common suffixes\n .replace(/^(the|a|an)[-_.]?/i, ''); // Remove articles\n\n // Split by separators\n const parts = cleaned.split(/[-_.]+/);\n\n if (parts.length === 1) {\n // Single word: use first 3-4 chars uppercase\n return cleaned.slice(0, 4).toUpperCase();\n }\n\n // Multiple words: use initials\n const initials = parts.map(p => p[0]).join('').toUpperCase();\n\n // Ensure at least 2 chars, max 5\n if (initials.length < 2) {\n return cleaned.slice(0, 4).toUpperCase();\n }\n\n return initials.slice(0, 5);\n}\n\n/**\n * Get the superproject root if in a git submodule\n * Returns null if not in a submodule\n */\nexport function getSuperprojectRoot(path: string): string | null {\n try {\n const result = execSync('git rev-parse --show-superproject-working-tree', {\n cwd: path,\n stdio: 'pipe',\n encoding: 'utf-8'\n }).trim();\n\n return result || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if path is in .gitignore\n */\nexport function isInGitignore(repoPath: string, pattern: string): boolean {\n const gitignorePath = join(repoPath, '.gitignore');\n\n if (!existsSync(gitignorePath)) {\n return false;\n }\n\n try {\n const result = execSync(`git check-ignore -q \"${pattern}\"`, {\n cwd: repoPath,\n stdio: 'pipe'\n });\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Output Formatter Service\n *\n * Handles output formatting for both human-readable and JSON formats.\n * Provides consistent output across all commands.\n *\n * @author Vladimir K.S.\n */\n\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\n\nexport interface OutputOptions {\n json?: boolean;\n noColor?: boolean;\n}\n\nexport interface TableColumn {\n header: string;\n key: string;\n width?: number;\n}\n\n/**\n * Get global output options from command\n */\nexport function getOutputOptions(cmd: { parent?: { opts?: () => OutputOptions } | null }): OutputOptions {\n return cmd.parent?.opts?.() ?? {};\n}\n\n/**\n * Output success message\n */\nexport function success(message: string, opts: OutputOptions = {}): void {\n if (opts.json) {\n console.log(JSON.stringify({ success: true, message }));\n } else {\n const prefix = opts.noColor ? '✓' : chalk.green('✓');\n console.log(`${prefix} ${message}`);\n }\n}\n\n/**\n * Output error message\n */\nexport function error(message: string, opts: OutputOptions = {}): void {\n if (opts.json) {\n console.log(JSON.stringify({ success: false, error: message }));\n } else {\n const prefix = opts.noColor ? '✗' : chalk.red('✗');\n console.error(`${prefix} ${message}`);\n }\n}\n\n/**\n * Output warning message\n */\nexport function warning(message: string, opts: OutputOptions = {}): void {\n if (opts.json) {\n console.log(JSON.stringify({ warning: message }));\n } else {\n const prefix = opts.noColor ? '!' : chalk.yellow('!');\n console.log(`${prefix} ${message}`);\n }\n}\n\n/**\n * Output info message\n */\nexport function info(message: string, opts: OutputOptions = {}): void {\n if (opts.json) {\n console.log(JSON.stringify({ info: message }));\n } else {\n const prefix = opts.noColor ? 'ℹ' : chalk.blue('ℹ');\n console.log(`${prefix} ${message}`);\n }\n}\n\n/**\n * Output data as JSON or formatted table\n */\nexport function data<T extends Record<string, unknown>>(\n items: T[],\n columns: TableColumn[],\n opts: OutputOptions = {}\n): void {\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: items }));\n return;\n }\n\n if (items.length === 0) {\n console.log('No items found.');\n return;\n }\n\n const table = new Table({\n head: columns.map(c => opts.noColor ? c.header : chalk.cyan(c.header)),\n colWidths: columns.map(c => c.width ?? null),\n wordWrap: true,\n style: {\n head: opts.noColor ? [] : ['cyan'],\n border: opts.noColor ? [] : ['gray']\n }\n });\n\n for (const item of items) {\n table.push(columns.map(c => String(item[c.key] ?? '')));\n }\n\n console.log(table.toString());\n}\n\n/**\n * Output single item details\n */\nexport function details(\n item: Record<string, unknown>,\n fields: { label: string; key: string }[],\n opts: OutputOptions = {}\n): void {\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: item }));\n return;\n }\n\n const maxLabelLength = Math.max(...fields.map(f => f.label.length));\n\n for (const field of fields) {\n const label = field.label.padEnd(maxLabelLength);\n const value = item[field.key] ?? '';\n const formattedLabel = opts.noColor ? label : chalk.gray(label);\n console.log(` ${formattedLabel} ${value}`);\n }\n}\n\n/**\n * Output a blank line\n */\nexport function blank(): void {\n console.log();\n}\n\n/**\n * Output a header/title\n */\nexport function header(title: string, opts: OutputOptions = {}): void {\n if (opts.json) return;\n const formatted = opts.noColor ? title : chalk.bold(title);\n console.log(formatted);\n}\n","/**\n * Template Packs Service\n *\n * Manages template packs for different init profiles.\n * Templates are data-driven, not hardcoded in logic.\n *\n * @author Vladimir K.S.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join, dirname } from 'path';\n\nexport type InitProfile = 'full-repo' | 'subrepo' | 'module';\n\nexport type DbMode = 'local' | 'shared';\n\n/**\n * Template file definition\n */\nexport interface TemplateFile {\n path: string;\n content: string;\n}\n\n/**\n * Config.yaml structure for AIGILE\n */\nexport interface AigileConfig {\n db: {\n mode: DbMode;\n path: string;\n };\n profile: InitProfile;\n repo_root: string;\n parent_repo_root?: string;\n module?: {\n name: string;\n kind: string;\n path: string;\n };\n}\n\n/**\n * Standard frontmatter template for documents\n */\nfunction createFrontmatter(title: string, tldr: string, modules: string[] = []): string {\n return `---\nmetadata:\n status: TEMPLATE\n version: \"1.0\"\n tldr: \"${tldr}\"\n title: \"${title}\"\n modules: [${modules.map(m => `\"${m}\"`).join(', ')}]\n authors: []\n dependencies: []\n---\n\n`;\n}\n\n/**\n * Get template files for full-repo profile\n */\nexport function getFullRepoTemplates(): TemplateFile[] {\n return [\n // 00_DOCS hierarchy\n {\n path: '00_DOCS/00_vision/01_mission-vision.md',\n content: createFrontmatter(\n 'Mission & Vision',\n 'Define company mission, vision, values, and elevator pitch',\n ['vision']\n ) + `# Mission & Vision\n\n## Mission Statement\n<!-- Why does this company/product exist? -->\n\n## Vision Statement\n<!-- What future are we creating? -->\n\n## Core Values\n<!-- What principles guide our decisions? -->\n\n## Elevator Pitch\n<!-- One sentence: What do we do? -->\n`\n },\n {\n path: '00_DOCS/01_strategy/01_strategic-analysis.md',\n content: createFrontmatter(\n 'Strategic Analysis',\n 'SWOT analysis and strategic pillars',\n ['strategy']\n ) + `# Strategic Analysis\n\n## SWOT Analysis\n\n### Strengths\n-\n\n### Weaknesses\n-\n\n### Opportunities\n-\n\n### Threats\n-\n\n## Strategic Pillars\n<!-- Key focus areas for the next 1-3 years -->\n\n`\n },\n {\n path: '00_DOCS/02_target-audience/01_personas.md',\n content: createFrontmatter(\n 'User Personas',\n 'Define ideal customer profile and user personas',\n ['personas', 'ux']\n ) + `# User Personas\n\n## Ideal Customer Profile (ICP)\n<!-- Who is our primary customer? -->\n\n## Primary Personas\n\n### Persona 1: [Name]\n- **Role:**\n- **Goals:**\n- **Frustrations:**\n- **Key Tasks:**\n\n`\n },\n {\n path: '00_DOCS/03_finance-legal/01_model.md',\n content: createFrontmatter(\n 'Business Model',\n 'Revenue model and financial overview',\n ['finance']\n ) + `# Business Model\n\n## Revenue Model\n<!-- How do we make money? -->\n\n## Pricing Strategy\n<!-- How do we price our offerings? -->\n\n## Key Metrics\n<!-- What metrics matter most? -->\n\n`\n },\n {\n path: '00_DOCS/04_raw-inputs/README.md',\n content: createFrontmatter(\n 'Raw Inputs',\n 'Repository for raw user feedback, interviews, and research data',\n ['research']\n ) + `# Raw Inputs\n\nThis directory contains raw, unprocessed input from users, stakeholders, and research.\n\n## Contents\n- User interviews\n- Survey responses\n- Support tickets\n- Feature requests\n- Competitive intelligence\n\n`\n },\n {\n path: '00_DOCS/05_research/README.md',\n content: createFrontmatter(\n 'Research',\n 'Market research and analysis documents',\n ['research']\n ) + `# Research\n\nThis directory contains research and analysis documents.\n\n## Contents\n- Market analysis\n- User research\n- Technical research\n- Competitive analysis\n\n`\n },\n {\n path: '00_DOCS/06_product-specs/01_prd.md',\n content: createFrontmatter(\n 'Product Requirements Document',\n 'Main PRD template for product features',\n ['product', 'specs']\n ) + `# Product Requirements Document (PRD)\n\n## Overview\n<!-- Brief description of the product/feature -->\n\n## Problem Statement\n<!-- What problem are we solving? -->\n\n## Goals & Success Metrics\n<!-- How will we measure success? -->\n\n## User Stories\n<!-- Link to user stories -->\n\n## Requirements\n### Functional Requirements\n-\n\n### Non-Functional Requirements\n-\n\n## Out of Scope\n-\n\n`\n },\n {\n path: '00_DOCS/06_product-specs/epics/README.md',\n content: createFrontmatter(\n 'Epics Directory',\n 'Contains epic-level product specifications',\n ['product', 'epics']\n ) + `# Epics\n\nThis directory contains epic-level specifications.\n\n`\n },\n {\n path: '00_DOCS/06_product-specs/stories/README.md',\n content: createFrontmatter(\n 'User Stories Directory',\n 'Contains user story specifications',\n ['product', 'stories']\n ) + `# User Stories\n\nThis directory contains user story specifications.\n\n`\n },\n {\n path: '00_DOCS/07_ux-design/00_README.md',\n content: createFrontmatter(\n 'UX Design',\n 'UX design documentation and journey maps',\n ['ux']\n ) + `# UX Design\n\n## Contents\n- User journeys\n- Wireframes\n- Design system references\n- Interaction patterns\n\n`\n },\n {\n path: '00_DOCS/07_ux-design/journeys/README.md',\n content: createFrontmatter(\n 'User Journeys',\n 'User journey maps and flow documentation',\n ['ux', 'journeys']\n ) + `# User Journeys\n\nThis directory contains user journey maps.\n\n`\n },\n {\n path: '00_DOCS/08_go-to-market/01_launch-plan.md',\n content: createFrontmatter(\n 'Launch Plan',\n 'Go-to-market strategy and launch checklist',\n ['gtm']\n ) + `# Launch Plan\n\n## Launch Goals\n-\n\n## Target Audience\n-\n\n## Channels\n-\n\n## Timeline\n-\n\n## Checklist\n- [ ] Marketing materials ready\n- [ ] Documentation complete\n- [ ] Support trained\n- [ ] Analytics configured\n\n`\n },\n {\n path: '00_DOCS/11_people-ops/ai-agents/README.md',\n content: createFrontmatter(\n 'AI Agents',\n 'AI agent configurations and prompts',\n ['ai', 'agents']\n ) + `# AI Agents\n\nThis directory contains AI agent configurations and prompts.\n\n`\n },\n {\n path: '00_DOCS/11_people-ops/sops/README.md',\n content: createFrontmatter(\n 'Standard Operating Procedures',\n 'Team SOPs and process documentation',\n ['sops']\n ) + `# Standard Operating Procedures\n\nThis directory contains team SOPs and process documentation.\n\n`\n },\n {\n path: '00_DOCS/12_customer-success/installation.md',\n content: createFrontmatter(\n 'Installation Guide',\n 'Installation and setup instructions',\n ['docs', 'installation']\n ) + `# Installation Guide\n\n## Prerequisites\n-\n\n## Installation Steps\n1.\n2.\n3.\n\n## Verification\n-\n\n`\n },\n {\n path: '00_DOCS/12_customer-success/quick-start.md',\n content: createFrontmatter(\n 'Quick Start Guide',\n 'Getting started guide for new users',\n ['docs', 'quickstart']\n ) + `# Quick Start Guide\n\n## Overview\n<!-- Brief intro -->\n\n## Step 1: Setup\n<!-- First step -->\n\n## Step 2: First Action\n<!-- Second step -->\n\n## Next Steps\n<!-- What to do next -->\n\n`\n },\n {\n path: '00_DOCS/12_customer-success/troubleshooting.md',\n content: createFrontmatter(\n 'Troubleshooting Guide',\n 'Common issues and solutions',\n ['docs', 'troubleshooting']\n ) + `# Troubleshooting\n\n## Common Issues\n\n### Issue: [Description]\n**Symptoms:**\n**Solution:**\n\n`\n },\n {\n path: '00_DOCS/99_archive/00_README.md',\n content: createFrontmatter(\n 'Archive',\n 'Archived documents no longer in active use',\n ['archive']\n ) + `# Archive\n\nThis directory contains archived documents that are no longer in active use but are kept for reference.\n\n`\n },\n\n // 01_SPECS hierarchy\n {\n path: '01_SPECS/00_adr/README.md',\n content: createFrontmatter(\n 'Architecture Decision Records',\n 'ADRs documenting key technical decisions',\n ['specs', 'adr']\n ) + `# Architecture Decision Records (ADRs)\n\nThis directory contains ADRs for documenting key technical decisions.\n\n## Template\nUse the template in \\`template.md\\` for new ADRs.\n\n`\n },\n {\n path: '01_SPECS/01_domain-models/README.md',\n content: createFrontmatter(\n 'Domain Models',\n 'Domain model specifications',\n ['specs', 'domain']\n ) + `# Domain Models\n\nThis directory contains domain model specifications.\n\n`\n },\n {\n path: '01_SPECS/02_api-contracts/README.md',\n content: createFrontmatter(\n 'API Contracts',\n 'API specifications and contracts',\n ['specs', 'api']\n ) + `# API Contracts\n\nThis directory contains API specifications and contracts.\n\n`\n },\n {\n path: '01_SPECS/03_c4-components/README.md',\n content: createFrontmatter(\n 'C4 Architecture',\n 'C4 model component diagrams',\n ['specs', 'architecture']\n ) + `# C4 Architecture Components\n\nThis directory contains C4 model architecture diagrams.\n\n`\n },\n {\n path: '01_SPECS/04_ui-ux-specs/README.md',\n content: createFrontmatter(\n 'UI/UX Specifications',\n 'UI/UX technical specifications',\n ['specs', 'ux']\n ) + `# UI/UX Specifications\n\nThis directory contains UI/UX technical specifications.\n\n`\n },\n {\n path: '01_SPECS/05_infrastructure/README.md',\n content: createFrontmatter(\n 'Infrastructure',\n 'Infrastructure and deployment specifications',\n ['specs', 'infra']\n ) + `# Infrastructure\n\nThis directory contains infrastructure and deployment specifications.\n\n`\n },\n\n // 02_FEATURES hierarchy\n {\n path: '02_FEATURES/00_smoke-tests/README.md',\n content: createFrontmatter(\n 'Smoke Tests',\n 'Critical path smoke test scenarios',\n ['features', 'tests']\n ) + `# Smoke Tests\n\nThis directory contains smoke test feature files for critical paths.\n\n`\n },\n {\n path: '02_FEATURES/01_epics/README.md',\n content: createFrontmatter(\n 'Epic Features',\n 'BDD feature files organized by epic',\n ['features', 'epics']\n ) + `# Epic Features\n\nThis directory contains BDD feature files organized by epic.\n\n`\n },\n {\n path: '02_FEATURES/02_end-to-end/README.md',\n content: createFrontmatter(\n 'End-to-End Features',\n 'End-to-end scenario feature files',\n ['features', 'e2e']\n ) + `# End-to-End Features\n\nThis directory contains end-to-end scenario feature files.\n\n`\n },\n {\n path: '02_FEATURES/03_nfr/README.md',\n content: createFrontmatter(\n 'Non-Functional Requirements',\n 'NFR feature files (performance, security, etc.)',\n ['features', 'nfr']\n ) + `# Non-Functional Requirements\n\nThis directory contains NFR feature files:\n- Performance\n- Security\n- Scalability\n- Accessibility\n\n`\n },\n\n // 03_TESTING_INFRA hierarchy\n {\n path: '03_TESTING_INFRA/00_governance/README.md',\n content: createFrontmatter(\n 'Test Governance',\n 'Testing standards and policies',\n ['testing', 'governance']\n ) + `# Test Governance\n\nThis directory contains testing standards and policies.\n\n`\n },\n {\n path: '03_TESTING_INFRA/01_unit-layer/README.md',\n content: createFrontmatter(\n 'Unit Testing Layer',\n 'Unit test infrastructure and guides',\n ['testing', 'unit']\n ) + `# Unit Testing Layer\n\nThis directory contains unit test infrastructure.\n\n`\n },\n {\n path: '03_TESTING_INFRA/02_integration-layer/README.md',\n content: createFrontmatter(\n 'Integration Testing Layer',\n 'Integration test infrastructure and guides',\n ['testing', 'integration']\n ) + `# Integration Testing Layer\n\nThis directory contains integration test infrastructure.\n\n`\n },\n {\n path: '03_TESTING_INFRA/03_e2e-layer/README.md',\n content: createFrontmatter(\n 'E2E Testing Layer',\n 'End-to-end test infrastructure and guides',\n ['testing', 'e2e']\n ) + `# E2E Testing Layer\n\nThis directory contains E2E test infrastructure.\n\n`\n },\n {\n path: '03_TESTING_INFRA/04_manual-qa-layer/README.md',\n content: createFrontmatter(\n 'Manual QA Layer',\n 'Manual QA procedures and checklists',\n ['testing', 'qa']\n ) + `# Manual QA Layer\n\nThis directory contains manual QA procedures and checklists.\n\n`\n },\n {\n path: '03_TESTING_INFRA/qa/README.md',\n content: createFrontmatter(\n 'QA Documentation',\n 'QA procedures and documentation',\n ['testing', 'qa']\n ) + `# QA Documentation\n\nThis directory contains QA procedures and documentation.\n\n`\n },\n {\n path: '03_TESTING_INFRA/reports/README.md',\n content: createFrontmatter(\n 'Test Reports',\n 'Test execution reports',\n ['testing', 'reports']\n ) + `# Test Reports\n\nThis directory contains test execution reports.\n\n`\n }\n ];\n}\n\n/**\n * Get template files for subrepo profile (same as full-repo)\n */\nexport function getSubrepoTemplates(): TemplateFile[] {\n return getFullRepoTemplates();\n}\n\n/**\n * Get template files for module profile (minimal structure)\n */\nexport function getModuleTemplates(moduleName: string): TemplateFile[] {\n return [\n {\n path: 'docs/01_module-overview.md',\n content: createFrontmatter(\n `${moduleName} Overview`,\n `Overview documentation for ${moduleName} module`,\n [moduleName]\n ) + `# ${moduleName} Module Overview\n\n## Purpose\n<!-- What does this module do? -->\n\n## Key Concepts\n<!-- Core concepts and terminology -->\n\n## Dependencies\n<!-- What does this module depend on? -->\n\n## API\n<!-- Public API surface -->\n\n`\n },\n {\n path: 'docs/02_mini-prd.md',\n content: createFrontmatter(\n `${moduleName} Requirements`,\n `Module-level requirements for ${moduleName}`,\n [moduleName, 'specs']\n ) + `# ${moduleName} Module Requirements\n\n## Goals\n<!-- What should this module achieve? -->\n\n## Requirements\n### Functional\n-\n\n### Non-Functional\n-\n\n## Out of Scope\n-\n\n`\n },\n {\n path: 'specs/01_spec-template.md',\n content: createFrontmatter(\n `${moduleName} Spec Template`,\n `Specification template for ${moduleName}`,\n [moduleName, 'specs']\n ) + `# ${moduleName} Specification\n\n## Overview\n<!-- Brief description -->\n\n## Design\n<!-- Technical design -->\n\n## Implementation Notes\n<!-- Key implementation details -->\n\n`\n },\n {\n path: 'features/01_happy-path.feature',\n content: `Feature: ${moduleName} Happy Path\n As a user\n I want to use ${moduleName}\n So that I can achieve my goals\n\n Scenario: Basic usage\n Given I have configured ${moduleName}\n When I perform the main action\n Then I should see the expected result\n`\n },\n {\n path: 'features/02_edge-cases.feature',\n content: `Feature: ${moduleName} Edge Cases\n As a user\n I want ${moduleName} to handle edge cases gracefully\n So that I don't encounter errors\n\n Scenario: Empty input\n Given I have configured ${moduleName}\n When I provide empty input\n Then I should see a helpful error message\n`\n }\n ];\n}\n\n/**\n * Get templates for a given profile\n */\nexport function getTemplatesForProfile(profile: InitProfile, moduleName?: string): TemplateFile[] {\n switch (profile) {\n case 'full-repo':\n return getFullRepoTemplates();\n case 'subrepo':\n return getSubrepoTemplates();\n case 'module':\n return getModuleTemplates(moduleName ?? 'module');\n default:\n return [];\n }\n}\n\n/**\n * Write templates to a target directory\n * Only writes files that don't already exist (non-destructive)\n */\nexport function writeTemplates(\n targetDir: string,\n templates: TemplateFile[]\n): { written: number; skipped: number } {\n let written = 0;\n let skipped = 0;\n\n for (const template of templates) {\n const fullPath = join(targetDir, template.path);\n const dir = dirname(fullPath);\n\n // Ensure directory exists\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Only write if file doesn't exist\n if (!existsSync(fullPath)) {\n writeFileSync(fullPath, template.content, 'utf-8');\n written++;\n } else {\n skipped++;\n }\n }\n\n return { written, skipped };\n}\n\n/**\n * Generate config.yaml content\n */\nexport function generateConfigYaml(config: AigileConfig, projectKey: string, projectName: string): string {\n let yaml = `# AIGILE Project Configuration\n# Auto-generated by aigile init\n\ndb:\n mode: ${config.db.mode}\n path: ${config.db.path}\n\nprofile: ${config.profile}\nrepo_root: ${config.repo_root}\n`;\n\n if (config.parent_repo_root) {\n yaml += `parent_repo_root: ${config.parent_repo_root}\\n`;\n }\n\n if (config.module) {\n yaml += `\nmodule:\n name: ${config.module.name}\n kind: ${config.module.kind}\n path: ${config.module.path}\n`;\n }\n\n yaml += `\nproject:\n key: ${projectKey}\n name: ${projectName}\n\nsync:\n enabled: true\n patterns:\n - \"**/*.md\"\n - \"**/*.feature\"\n - \"**/*.yaml\"\n - \"**/*.yml\"\n ignore:\n - node_modules\n - dist\n - .git\n - coverage\n`;\n\n return yaml;\n}\n","/**\n * Project Command\n *\n * Manage registered projects.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n blank,\n getOutputOptions\n} from '../services/output-formatter.js';\n\nexport const projectCommand = new Command('project')\n .description('Manage registered projects');\n\n// List all projects\nprojectCommand\n .command('list')\n .alias('ls')\n .description('List all registered projects')\n .action(() => {\n const opts = getOutputOptions(projectCommand);\n\n const projects = queryAll<{\n key: string;\n name: string;\n path: string;\n is_default: number;\n created_at: string;\n }>(`\n SELECT key, name, path, is_default,\n datetime(created_at) as created_at\n FROM projects\n ORDER BY is_default DESC, name\n `);\n\n if (projects.length === 0) {\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: [] }));\n } else {\n console.log('No projects registered. Run \"aigile init\" in a git repo.');\n }\n return;\n }\n\n const formattedProjects = projects.map(p => ({\n key: p.is_default ? `${p.key} *` : p.key,\n name: p.name,\n path: p.path\n }));\n\n data(\n formattedProjects,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Name', key: 'name', width: 30 },\n { header: 'Path', key: 'path', width: 50 }\n ],\n opts\n );\n\n if (!opts.json) {\n blank();\n console.log(' * = default project');\n }\n });\n\n// Show project details\nprojectCommand\n .command('show')\n .argument('[key]', 'Project key (uses default if not specified)')\n .description('Show project details')\n .action((key?: string) => {\n const opts = getOutputOptions(projectCommand);\n\n let project;\n if (key) {\n project = queryOne('SELECT * FROM projects WHERE key = ?', [key]);\n } else {\n project = queryOne('SELECT * FROM projects WHERE is_default = 1');\n }\n\n if (!project) {\n error(key ? `Project \"${key}\" not found.` : 'No default project set.', opts);\n process.exit(1);\n }\n\n details(\n project as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Name', key: 'name' },\n { label: 'Path', key: 'path' },\n { label: 'Default', key: 'is_default' },\n { label: 'Created', key: 'created_at' }\n ],\n opts\n );\n });\n\n// Set default project\nprojectCommand\n .command('set-default')\n .argument('<key>', 'Project key to set as default')\n .description('Set default project')\n .action((key: string) => {\n const opts = getOutputOptions(projectCommand);\n\n const project = queryOne('SELECT id FROM projects WHERE key = ?', [key]);\n\n if (!project) {\n error(`Project \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('UPDATE projects SET is_default = 0');\n run('UPDATE projects SET is_default = 1 WHERE key = ?', [key]);\n\n success(`Default project set to \"${key}\".`, opts);\n });\n\n// Remove project\nprojectCommand\n .command('remove')\n .alias('rm')\n .argument('<key>', 'Project key to remove')\n .option('--force', 'Remove without confirmation')\n .description('Remove project from registry (does not delete files)')\n .action((key: string, options: { force?: boolean }) => {\n const opts = getOutputOptions(projectCommand);\n\n const project = queryOne('SELECT id FROM projects WHERE key = ?', [key]);\n\n if (!project) {\n error(`Project \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM projects WHERE key = ?', [key]);\n success(`Project \"${key}\" removed from registry.`, opts);\n });\n","/**\n * Epic Command\n *\n * CRUD operations for epics.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\n\nexport const epicCommand = new Command('epic')\n .description('Manage epics');\n\n// Create epic\nepicCommand\n .command('create')\n .argument('<summary>', 'Epic summary')\n .option('-d, --description <description>', 'Epic description')\n .option('-p, --priority <priority>', 'Priority (P0/P1/P2/P3 or Highest/High/Medium/Low/Lowest)', 'Medium')\n .option('-i, --initiative <key>', 'Parent initiative key')\n .description('Create a new epic')\n .action((summary: string, options) => {\n const opts = getOutputOptions(epicCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const epicId = generateId();\n const epicKey = getNextKey(config.project.key);\n\n run(\n `INSERT INTO epics (id, project_id, key, summary, description, priority, status) VALUES (?, ?, ?, ?, ?, ?, 'backlog')`,\n [epicId, project.id, epicKey, summary, options.description ?? null, options.priority]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key: epicKey, summary } }));\n } else {\n success(`Created epic ${epicKey}: ${summary}`, opts);\n }\n });\n\n// List epics\nepicCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status')\n .option('-a, --all', 'Show all projects')\n .description('List epics')\n .action((options) => {\n const opts = getOutputOptions(epicCommand);\n\n let query = `\n SELECT e.key, e.summary, e.status, e.priority,\n (SELECT COUNT(*) FROM user_stories WHERE epic_id = e.id) as story_count\n FROM epics e\n `;\n const params: unknown[] = [];\n\n if (!options.all) {\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n query += ' JOIN projects p ON e.project_id = p.id WHERE p.key = ?';\n params.push(config.project.key);\n }\n }\n }\n\n if (options.status) {\n query += params.length > 0 ? ' AND' : ' WHERE';\n query += ' e.status = ?';\n params.push(options.status);\n }\n\n query += ' ORDER BY e.created_at DESC';\n\n const epics = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n story_count: number;\n }>(query, params);\n\n data(\n epics,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 40 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Priority', key: 'priority', width: 10 },\n { header: 'Stories', key: 'story_count', width: 8 }\n ],\n opts\n );\n });\n\n// Show epic details\nepicCommand\n .command('show')\n .argument('<key>', 'Epic key')\n .description('Show epic details')\n .action((key: string) => {\n const opts = getOutputOptions(epicCommand);\n\n const epic = queryOne(`\n SELECT e.*, p.key as project_key\n FROM epics e\n JOIN projects p ON e.project_id = p.id\n WHERE e.key = ?\n `, [key]);\n\n if (!epic) {\n error(`Epic \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n details(\n epic as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Summary', key: 'summary' },\n { label: 'Status', key: 'status' },\n { label: 'Priority', key: 'priority' },\n { label: 'Description', key: 'description' },\n { label: 'Owner', key: 'owner' },\n { label: 'Created', key: 'created_at' }\n ],\n opts\n );\n });\n\n// Update epic\nepicCommand\n .command('update')\n .argument('<key>', 'Epic key')\n .option('-s, --summary <summary>', 'New summary')\n .option('-d, --description <description>', 'New description')\n .option('-p, --priority <priority>', 'New priority')\n .option('--owner <owner>', 'New owner')\n .description('Update epic')\n .action((key: string, options) => {\n const opts = getOutputOptions(epicCommand);\n\n const epic = queryOne('SELECT id FROM epics WHERE key = ?', [key]);\n if (!epic) {\n error(`Epic \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n\n if (options.summary) {\n updates.push('summary = ?');\n params.push(options.summary);\n }\n if (options.description) {\n updates.push('description = ?');\n params.push(options.description);\n }\n if (options.priority) {\n updates.push('priority = ?');\n params.push(options.priority);\n }\n if (options.owner) {\n updates.push('owner = ?');\n params.push(options.owner);\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(key);\n\n run(`UPDATE epics SET ${updates.join(', ')} WHERE key = ?`, params);\n success(`Epic \"${key}\" updated.`, opts);\n });\n\n// Transition epic status\nepicCommand\n .command('transition')\n .argument('<key>', 'Epic key')\n .argument('<status>', 'New status (backlog/analysis/ready/in_progress/done/closed)')\n .description('Transition epic to new status')\n .action((key: string, status: string) => {\n const opts = getOutputOptions(epicCommand);\n\n const epic = queryOne<{ id: string; status: string }>('SELECT id, status FROM epics WHERE key = ?', [key]);\n if (!epic) {\n error(`Epic \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('epic', epic.status, status);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('epic', epic.status);\n error(formatTransitionError('epic', key, epic.status, status, validTransitions), opts);\n process.exit(1);\n }\n\n run(`UPDATE epics SET status = ?, updated_at = datetime('now') WHERE key = ?`, [status, key]);\n success(`Epic \"${key}\" transitioned from \"${epic.status}\" to \"${status}\".`, opts);\n });\n\n// Delete epic\nepicCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Epic key')\n .option('--force', 'Delete without confirmation')\n .description('Delete epic')\n .action((key: string) => {\n const opts = getOutputOptions(epicCommand);\n\n const epic = queryOne('SELECT id FROM epics WHERE key = ?', [key]);\n if (!epic) {\n error(`Epic \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM epics WHERE key = ?', [key]);\n success(`Epic \"${key}\" deleted.`, opts);\n });\n","/**\n * Workflow Validation Engine\n *\n * Enforces valid status transitions for all entity types.\n * Based on JIRA-like workflow conventions.\n *\n * @author Vladimir K.S.\n */\n\nexport type WorkflowEntityType = 'initiative' | 'epic' | 'story' | 'task' | 'bug' | 'sprint' | 'version';\n\nexport interface TransitionResult {\n valid: boolean;\n error?: string;\n validTransitions?: string[];\n}\n\n/**\n * Valid status transitions per entity type.\n * Map from current status to array of valid target statuses.\n */\nconst WORKFLOWS: Record<WorkflowEntityType, Record<string, string[]>> = {\n initiative: {\n draft: ['active'],\n active: ['draft', 'done'],\n done: ['active', 'archived'],\n archived: []\n },\n\n epic: {\n backlog: ['analysis'],\n analysis: ['backlog', 'ready'],\n ready: ['in_progress'],\n in_progress: ['backlog', 'done'],\n done: ['in_progress', 'closed'],\n closed: []\n },\n\n story: {\n backlog: ['selected'],\n selected: ['backlog', 'in_progress'],\n in_progress: ['backlog', 'in_review'],\n in_review: ['in_progress', 'done'],\n done: ['in_progress', 'closed'],\n closed: []\n },\n\n task: {\n todo: ['in_progress'],\n in_progress: ['todo', 'in_review', 'blocked'],\n blocked: ['in_progress'],\n in_review: ['in_progress', 'done'],\n done: ['in_progress']\n },\n\n bug: {\n open: ['in_progress'],\n in_progress: ['open', 'resolved'],\n resolved: ['reopened', 'closed'],\n reopened: ['in_progress', 'closed'],\n closed: []\n },\n\n sprint: {\n future: ['active'],\n active: ['closed'],\n closed: []\n },\n\n version: {\n unreleased: ['released'],\n released: ['archived'],\n archived: []\n }\n};\n\n/**\n * Default (initial) status for each entity type\n */\nexport const DEFAULT_STATUS: Record<WorkflowEntityType, string> = {\n initiative: 'draft',\n epic: 'backlog',\n story: 'backlog',\n task: 'todo',\n bug: 'open',\n sprint: 'future',\n version: 'unreleased'\n};\n\n/**\n * All valid statuses for each entity type\n */\nexport function getAllStatuses(entityType: WorkflowEntityType): string[] {\n const workflow = WORKFLOWS[entityType];\n if (!workflow) {\n return [];\n }\n return Object.keys(workflow);\n}\n\n/**\n * Check if a status is valid for an entity type\n */\nexport function isValidStatus(entityType: WorkflowEntityType, status: string): boolean {\n const workflow = WORKFLOWS[entityType];\n if (!workflow) {\n return false;\n }\n return status in workflow;\n}\n\n/**\n * Get valid transitions from the current status\n */\nexport function getValidTransitions(entityType: WorkflowEntityType, currentStatus: string): string[] {\n const workflow = WORKFLOWS[entityType];\n if (!workflow) {\n return [];\n }\n return workflow[currentStatus] ?? [];\n}\n\n/**\n * Validate a status transition\n *\n * @param entityType - Type of entity (initiative, epic, story, task, bug, sprint, version)\n * @param currentStatus - Current status of the entity\n * @param newStatus - Target status to transition to\n * @returns TransitionResult with validation result\n */\nexport function validateTransition(\n entityType: WorkflowEntityType,\n currentStatus: string,\n newStatus: string\n): TransitionResult {\n const workflow = WORKFLOWS[entityType];\n\n if (!workflow) {\n return {\n valid: false,\n error: `Unknown entity type: ${entityType}`\n };\n }\n\n // Check if current status is valid\n if (!(currentStatus in workflow)) {\n return {\n valid: false,\n error: `Invalid current status \"${currentStatus}\" for ${entityType}`,\n validTransitions: []\n };\n }\n\n // Check if new status is valid for this entity type\n if (!(newStatus in workflow)) {\n return {\n valid: false,\n error: `Invalid target status \"${newStatus}\" for ${entityType}`,\n validTransitions: workflow[currentStatus]\n };\n }\n\n // Same status - no transition needed\n if (currentStatus === newStatus) {\n return { valid: true };\n }\n\n // Check if transition is allowed\n const validTransitions = workflow[currentStatus];\n if (!validTransitions.includes(newStatus)) {\n return {\n valid: false,\n error: `Cannot transition ${entityType} from \"${currentStatus}\" to \"${newStatus}\"`,\n validTransitions\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Format transition error message for CLI output\n */\nexport function formatTransitionError(\n entityType: WorkflowEntityType,\n key: string,\n currentStatus: string,\n newStatus: string,\n validTransitions: string[]\n): string {\n const validStr = validTransitions.length > 0\n ? validTransitions.join(', ')\n : '(none - terminal status)';\n\n return `Cannot transition ${entityType} \"${key}\" from \"${currentStatus}\" to \"${newStatus}\".\\n` +\n `Valid transitions from \"${currentStatus}\": ${validStr}`;\n}\n\n/**\n * Check if entity type supports workflow validation\n */\nexport function hasWorkflow(entityType: string): entityType is WorkflowEntityType {\n return entityType in WORKFLOWS;\n}\n\n/**\n * Get workflow definition for an entity type\n */\nexport function getWorkflow(entityType: WorkflowEntityType): Record<string, string[]> | null {\n return WORKFLOWS[entityType] ?? null;\n}\n","/**\n * Story Command\n *\n * CRUD operations for user stories.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\n\nexport const storyCommand = new Command('story')\n .description('Manage user stories');\n\n// Create story\nstoryCommand\n .command('create')\n .argument('<summary>', 'Story summary')\n .option('-e, --epic <key>', 'Parent epic key')\n .option('-d, --description <description>', 'Story description')\n .option('-p, --priority <priority>', 'Priority', 'Medium')\n .option('--points <points>', 'Story points (1,2,3,5,8,13,21)')\n .description('Create a new user story')\n .action((summary: string, options) => {\n const opts = getOutputOptions(storyCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n let epicId: string | null = null;\n if (options.epic) {\n const epic = queryOne<{ id: string }>('SELECT id FROM epics WHERE key = ?', [options.epic]);\n if (!epic) {\n error(`Epic \"${options.epic}\" not found.`, opts);\n process.exit(1);\n }\n epicId = epic.id;\n }\n\n const storyId = generateId();\n const storyKey = getNextKey(config.project.key);\n\n run(\n `INSERT INTO user_stories (id, project_id, key, epic_id, summary, description, priority, story_points, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'backlog')`,\n [storyId, project.id, storyKey, epicId, summary, options.description ?? null, options.priority, options.points ? parseInt(options.points) : null]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key: storyKey, summary } }));\n } else {\n success(`Created story ${storyKey}: ${summary}`, opts);\n }\n });\n\n// List stories\nstoryCommand\n .command('list')\n .alias('ls')\n .option('-e, --epic <key>', 'Filter by epic')\n .option('-s, --status <status>', 'Filter by status')\n .option('--sprint <name>', 'Filter by sprint')\n .description('List user stories')\n .action((options) => {\n const opts = getOutputOptions(storyCommand);\n\n let query = `\n SELECT s.key, s.summary, s.status, s.priority, s.story_points,\n e.key as epic_key\n FROM user_stories s\n LEFT JOIN epics e ON s.epic_id = e.id\n `;\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n conditions.push('s.project_id = (SELECT id FROM projects WHERE key = ?)');\n params.push(config.project.key);\n }\n }\n\n if (options.epic) {\n conditions.push('e.key = ?');\n params.push(options.epic);\n }\n if (options.status) {\n conditions.push('s.status = ?');\n params.push(options.status);\n }\n\n if (conditions.length > 0) {\n query += ' WHERE ' + conditions.join(' AND ');\n }\n\n query += ' ORDER BY s.created_at DESC';\n\n const stories = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n story_points: number | null;\n epic_key: string | null;\n }>(query, params);\n\n data(\n stories,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 35 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Points', key: 'story_points', width: 8 },\n { header: 'Epic', key: 'epic_key', width: 12 }\n ],\n opts\n );\n });\n\n// Show story details\nstoryCommand\n .command('show')\n .argument('<key>', 'Story key')\n .description('Show story details')\n .action((key: string) => {\n const opts = getOutputOptions(storyCommand);\n\n const story = queryOne('SELECT * FROM user_stories WHERE key = ?', [key]);\n if (!story) {\n error(`Story \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n details(\n story as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Summary', key: 'summary' },\n { label: 'Status', key: 'status' },\n { label: 'Priority', key: 'priority' },\n { label: 'Points', key: 'story_points' },\n { label: 'Assignee', key: 'assignee' },\n { label: 'Description', key: 'description' }\n ],\n opts\n );\n });\n\n// Transition story\nstoryCommand\n .command('transition')\n .argument('<key>', 'Story key')\n .argument('<status>', 'New status')\n .description('Transition story to new status')\n .action((key: string, status: string) => {\n const opts = getOutputOptions(storyCommand);\n\n const story = queryOne<{ status: string }>('SELECT status FROM user_stories WHERE key = ?', [key]);\n if (!story) {\n error(`Story \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('story', story.status, status);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('story', story.status);\n error(formatTransitionError('story', key, story.status, status, validTransitions), opts);\n process.exit(1);\n }\n\n run(`UPDATE user_stories SET status = ?, updated_at = datetime('now') WHERE key = ?`, [status, key]);\n success(`Story \"${key}\" transitioned from \"${story.status}\" to \"${status}\".`, opts);\n });\n\n// Update story\nstoryCommand\n .command('update')\n .argument('<key>', 'Story key')\n .option('-s, --summary <summary>', 'New summary')\n .option('-d, --description <description>', 'New description')\n .option('-p, --priority <priority>', 'New priority')\n .option('--points <points>', 'New story points')\n .option('--assignee <assignee>', 'New assignee')\n .option('-e, --epic <key>', 'New parent epic')\n .description('Update story')\n .action((key: string, options) => {\n const opts = getOutputOptions(storyCommand);\n\n const story = queryOne('SELECT id FROM user_stories WHERE key = ?', [key]);\n if (!story) {\n error(`Story \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n\n if (options.summary) {\n updates.push('summary = ?');\n params.push(options.summary);\n }\n if (options.description) {\n updates.push('description = ?');\n params.push(options.description);\n }\n if (options.priority) {\n updates.push('priority = ?');\n params.push(options.priority);\n }\n if (options.points) {\n updates.push('story_points = ?');\n params.push(parseInt(options.points));\n }\n if (options.assignee) {\n updates.push('assignee = ?');\n params.push(options.assignee);\n }\n if (options.epic) {\n const epic = queryOne<{ id: string }>('SELECT id FROM epics WHERE key = ?', [options.epic]);\n if (!epic) {\n error(`Epic \"${options.epic}\" not found.`, opts);\n process.exit(1);\n }\n updates.push('epic_id = ?');\n params.push(epic.id);\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(key);\n\n run(`UPDATE user_stories SET ${updates.join(', ')} WHERE key = ?`, params);\n success(`Story \"${key}\" updated.`, opts);\n });\n\n// Delete story\nstoryCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Story key')\n .option('--force', 'Delete without confirmation')\n .description('Delete story')\n .action((key: string) => {\n const opts = getOutputOptions(storyCommand);\n\n const story = queryOne('SELECT id FROM user_stories WHERE key = ?', [key]);\n if (!story) {\n error(`Story \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM user_stories WHERE key = ?', [key]);\n success(`Story \"${key}\" deleted.`, opts);\n });\n","/**\n * Task Command\n *\n * CRUD operations for tasks.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\n\nexport const taskCommand = new Command('task')\n .description('Manage tasks');\n\n// Create task\ntaskCommand\n .command('create')\n .argument('<summary>', 'Task summary')\n .option('-s, --story <key>', 'Parent story key')\n .option('--parent <key>', 'Parent task key (creates subtask)')\n .option('-d, --description <description>', 'Task description')\n .option('-p, --priority <priority>', 'Priority', 'Medium')\n .option('--assignee <name>', 'Assignee')\n .description('Create a new task (use --parent for subtask)')\n .action((summary: string, options) => {\n const opts = getOutputOptions(taskCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n let storyId: string | null = null;\n if (options.story) {\n const story = queryOne<{ id: string }>('SELECT id FROM user_stories WHERE key = ?', [options.story]);\n if (!story) {\n error(`Story \"${options.story}\" not found.`, opts);\n process.exit(1);\n }\n storyId = story.id;\n }\n\n let parentId: string | null = null;\n let issueType = 'task';\n if (options.parent) {\n const parentTask = queryOne<{ id: string }>('SELECT id FROM tasks WHERE key = ?', [options.parent]);\n if (!parentTask) {\n error(`Parent task \"${options.parent}\" not found.`, opts);\n process.exit(1);\n }\n parentId = parentTask.id;\n issueType = 'subtask';\n }\n\n const taskId = generateId();\n const taskKey = getNextKey(config.project.key);\n\n run(\n `INSERT INTO tasks (id, project_id, key, story_id, parent_id, issue_type, summary, description, priority, assignee, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'todo')`,\n [taskId, project.id, taskKey, storyId, parentId, issueType, summary, options.description ?? null, options.priority, options.assignee ?? null]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key: taskKey, summary } }));\n } else {\n success(`Created task ${taskKey}: ${summary}`, opts);\n }\n });\n\n// List tasks\ntaskCommand\n .command('list')\n .alias('ls')\n .option('-s, --story <key>', 'Filter by story')\n .option('--status <status>', 'Filter by status')\n .option('--assignee <name>', 'Filter by assignee')\n .description('List tasks')\n .action((options) => {\n const opts = getOutputOptions(taskCommand);\n\n let query = `\n SELECT t.key, t.summary, t.status, t.priority, t.assignee,\n s.key as story_key\n FROM tasks t\n LEFT JOIN user_stories s ON t.story_id = s.id\n `;\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n conditions.push('t.project_id = (SELECT id FROM projects WHERE key = ?)');\n params.push(config.project.key);\n }\n }\n\n if (options.story) {\n conditions.push('s.key = ?');\n params.push(options.story);\n }\n if (options.status) {\n conditions.push('t.status = ?');\n params.push(options.status);\n }\n if (options.assignee) {\n conditions.push('t.assignee = ?');\n params.push(options.assignee);\n }\n\n if (conditions.length > 0) {\n query += ' WHERE ' + conditions.join(' AND ');\n }\n\n query += ' ORDER BY t.created_at DESC';\n\n const tasks = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n story_key: string | null;\n }>(query, params);\n\n data(\n tasks,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 35 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Assignee', key: 'assignee', width: 15 },\n { header: 'Story', key: 'story_key', width: 12 }\n ],\n opts\n );\n });\n\n// Show task\ntaskCommand\n .command('show')\n .argument('<key>', 'Task key')\n .description('Show task details')\n .action((key: string) => {\n const opts = getOutputOptions(taskCommand);\n\n const task = queryOne('SELECT * FROM tasks WHERE key = ?', [key]);\n if (!task) {\n error(`Task \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n details(\n task as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Summary', key: 'summary' },\n { label: 'Status', key: 'status' },\n { label: 'Priority', key: 'priority' },\n { label: 'Assignee', key: 'assignee' },\n { label: 'Description', key: 'description' }\n ],\n opts\n );\n });\n\n// Transition task\ntaskCommand\n .command('transition')\n .argument('<key>', 'Task key')\n .argument('<status>', 'New status')\n .description('Transition task to new status')\n .action((key: string, status: string) => {\n const opts = getOutputOptions(taskCommand);\n\n const task = queryOne<{ status: string }>('SELECT status FROM tasks WHERE key = ?', [key]);\n if (!task) {\n error(`Task \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('task', task.status, status);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('task', task.status);\n error(formatTransitionError('task', key, task.status, status, validTransitions), opts);\n process.exit(1);\n }\n\n run(`UPDATE tasks SET status = ?, updated_at = datetime('now') WHERE key = ?`, [status, key]);\n success(`Task \"${key}\" transitioned from \"${task.status}\" to \"${status}\".`, opts);\n });\n\n// Update task\ntaskCommand\n .command('update')\n .argument('<key>', 'Task key')\n .option('-s, --summary <summary>', 'New summary')\n .option('-d, --description <description>', 'New description')\n .option('-p, --priority <priority>', 'New priority')\n .option('--assignee <assignee>', 'New assignee')\n .option('--story <key>', 'New parent story')\n .option('--blocked-reason <reason>', 'Blocked reason')\n .description('Update task')\n .action((key: string, options) => {\n const opts = getOutputOptions(taskCommand);\n\n const task = queryOne('SELECT id FROM tasks WHERE key = ?', [key]);\n if (!task) {\n error(`Task \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n\n if (options.summary) {\n updates.push('summary = ?');\n params.push(options.summary);\n }\n if (options.description) {\n updates.push('description = ?');\n params.push(options.description);\n }\n if (options.priority) {\n updates.push('priority = ?');\n params.push(options.priority);\n }\n if (options.assignee) {\n updates.push('assignee = ?');\n params.push(options.assignee);\n }\n if (options.story) {\n const story = queryOne<{ id: string }>('SELECT id FROM user_stories WHERE key = ?', [options.story]);\n if (!story) {\n error(`Story \"${options.story}\" not found.`, opts);\n process.exit(1);\n }\n updates.push('story_id = ?');\n params.push(story.id);\n }\n if (options.blockedReason) {\n updates.push('blocked_reason = ?');\n params.push(options.blockedReason);\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(key);\n\n run(`UPDATE tasks SET ${updates.join(', ')} WHERE key = ?`, params);\n success(`Task \"${key}\" updated.`, opts);\n });\n\n// Delete task\ntaskCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Task key')\n .option('--force', 'Delete without confirmation')\n .description('Delete task')\n .action((key: string) => {\n const opts = getOutputOptions(taskCommand);\n\n const task = queryOne('SELECT id FROM tasks WHERE key = ?', [key]);\n if (!task) {\n error(`Task \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM tasks WHERE key = ?', [key]);\n success(`Task \"${key}\" deleted.`, opts);\n });\n","/**\n * Bug Command\n *\n * CRUD operations for bugs.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\n\nexport const bugCommand = new Command('bug')\n .description('Manage bugs');\n\n// Create bug\nbugCommand\n .command('create')\n .argument('<summary>', 'Bug summary')\n .option('-d, --description <description>', 'Bug description')\n .option('-p, --priority <priority>', 'Priority', 'Medium')\n .option('--severity <severity>', 'Severity (Blocker/Critical/Major/Minor/Trivial)', 'Major')\n .option('--assignee <name>', 'Assignee')\n .description('Create a new bug')\n .action((summary: string, options) => {\n const opts = getOutputOptions(bugCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const bugId = generateId();\n const bugKey = getNextKey(config.project.key);\n\n run(\n `INSERT INTO bugs (id, project_id, key, summary, description, priority, severity, assignee, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'open')`,\n [bugId, project.id, bugKey, summary, options.description ?? null, options.priority, options.severity, options.assignee ?? null]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key: bugKey, summary } }));\n } else {\n success(`Created bug ${bugKey}: ${summary}`, opts);\n }\n });\n\n// List bugs\nbugCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status')\n .option('--severity <severity>', 'Filter by severity')\n .option('--assignee <name>', 'Filter by assignee')\n .description('List bugs')\n .action((options) => {\n const opts = getOutputOptions(bugCommand);\n\n let query = 'SELECT key, summary, status, severity, priority, assignee FROM bugs';\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n conditions.push('project_id = (SELECT id FROM projects WHERE key = ?)');\n params.push(config.project.key);\n }\n }\n\n if (options.status) {\n conditions.push('status = ?');\n params.push(options.status);\n }\n if (options.severity) {\n conditions.push('severity = ?');\n params.push(options.severity);\n }\n if (options.assignee) {\n conditions.push('assignee = ?');\n params.push(options.assignee);\n }\n\n if (conditions.length > 0) {\n query += ' WHERE ' + conditions.join(' AND ');\n }\n\n query += ' ORDER BY CASE severity WHEN \"Blocker\" THEN 1 WHEN \"Critical\" THEN 2 WHEN \"Major\" THEN 3 WHEN \"Minor\" THEN 4 ELSE 5 END, created_at DESC';\n\n const bugs = queryAll<{\n key: string;\n summary: string;\n status: string;\n severity: string;\n priority: string;\n assignee: string | null;\n }>(query, params);\n\n data(\n bugs,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 35 },\n { header: 'Status', key: 'status', width: 10 },\n { header: 'Severity', key: 'severity', width: 10 },\n { header: 'Assignee', key: 'assignee', width: 15 }\n ],\n opts\n );\n });\n\n// Show bug\nbugCommand\n .command('show')\n .argument('<key>', 'Bug key')\n .description('Show bug details')\n .action((key: string) => {\n const opts = getOutputOptions(bugCommand);\n\n const bug = queryOne('SELECT * FROM bugs WHERE key = ?', [key]);\n if (!bug) {\n error(`Bug \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n details(\n bug as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Summary', key: 'summary' },\n { label: 'Status', key: 'status' },\n { label: 'Severity', key: 'severity' },\n { label: 'Priority', key: 'priority' },\n { label: 'Assignee', key: 'assignee' },\n { label: 'Description', key: 'description' }\n ],\n opts\n );\n });\n\n// Transition bug\nbugCommand\n .command('transition')\n .argument('<key>', 'Bug key')\n .argument('<status>', 'New status')\n .option('-r, --resolution <resolution>', 'Resolution (for resolved status)')\n .description('Transition bug to new status')\n .action((key: string, status: string, options) => {\n const opts = getOutputOptions(bugCommand);\n\n const bug = queryOne<{ status: string }>('SELECT status FROM bugs WHERE key = ?', [key]);\n if (!bug) {\n error(`Bug \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('bug', bug.status, status);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('bug', bug.status);\n error(formatTransitionError('bug', key, bug.status, status, validTransitions), opts);\n process.exit(1);\n }\n\n if (status === 'resolved' && options.resolution) {\n run(`UPDATE bugs SET status = ?, resolution = ?, resolved_at = datetime('now'), updated_at = datetime('now') WHERE key = ?`, [status, options.resolution, key]);\n } else {\n run(`UPDATE bugs SET status = ?, updated_at = datetime('now') WHERE key = ?`, [status, key]);\n }\n\n success(`Bug \"${key}\" transitioned from \"${bug.status}\" to \"${status}\".`, opts);\n });\n\n// Update bug\nbugCommand\n .command('update')\n .argument('<key>', 'Bug key')\n .option('-s, --summary <summary>', 'New summary')\n .option('-d, --description <description>', 'New description')\n .option('-p, --priority <priority>', 'New priority')\n .option('--severity <severity>', 'New severity')\n .option('--assignee <assignee>', 'New assignee')\n .option('--steps <steps>', 'Steps to reproduce')\n .option('--expected <expected>', 'Expected behavior')\n .option('--actual <actual>', 'Actual behavior')\n .description('Update bug')\n .action((key: string, options) => {\n const opts = getOutputOptions(bugCommand);\n\n const bug = queryOne('SELECT id FROM bugs WHERE key = ?', [key]);\n if (!bug) {\n error(`Bug \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n\n if (options.summary) {\n updates.push('summary = ?');\n params.push(options.summary);\n }\n if (options.description) {\n updates.push('description = ?');\n params.push(options.description);\n }\n if (options.priority) {\n updates.push('priority = ?');\n params.push(options.priority);\n }\n if (options.severity) {\n updates.push('severity = ?');\n params.push(options.severity);\n }\n if (options.assignee) {\n updates.push('assignee = ?');\n params.push(options.assignee);\n }\n if (options.steps) {\n updates.push('steps_to_reproduce = ?');\n params.push(options.steps);\n }\n if (options.expected) {\n updates.push('expected_behavior = ?');\n params.push(options.expected);\n }\n if (options.actual) {\n updates.push('actual_behavior = ?');\n params.push(options.actual);\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(key);\n\n run(`UPDATE bugs SET ${updates.join(', ')} WHERE key = ?`, params);\n success(`Bug \"${key}\" updated.`, opts);\n });\n\n// Delete bug\nbugCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Bug key')\n .option('--force', 'Delete without confirmation')\n .description('Delete bug')\n .action((key: string) => {\n const opts = getOutputOptions(bugCommand);\n\n const bug = queryOne('SELECT id FROM bugs WHERE key = ?', [key]);\n if (!bug) {\n error(`Bug \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM bugs WHERE key = ?', [key]);\n success(`Bug \"${key}\" deleted.`, opts);\n });\n","/**\n * Sprint Command\n *\n * Manage sprints.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n header,\n blank,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\n\nexport const sprintCommand = new Command('sprint')\n .description('Manage sprints');\n\n// Create sprint\nsprintCommand\n .command('create')\n .argument('<name>', 'Sprint name')\n .requiredOption('--start <date>', 'Start date (YYYY-MM-DD)')\n .requiredOption('--end <date>', 'End date (YYYY-MM-DD)')\n .option('-g, --goal <goal>', 'Sprint goal')\n .description('Create a new sprint')\n .action((name: string, options) => {\n const opts = getOutputOptions(sprintCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const sprintId = generateId();\n\n run(\n `INSERT INTO sprints (id, project_id, name, goal, start_date, end_date, status)\n VALUES (?, ?, ?, ?, ?, ?, 'future')`,\n [sprintId, project.id, name, options.goal ?? null, options.start, options.end]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name, start: options.start, end: options.end } }));\n } else {\n success(`Created sprint \"${name}\" (${options.start} - ${options.end})`, opts);\n }\n });\n\n// List sprints\nsprintCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status (future/active/closed)')\n .description('List sprints')\n .action((options) => {\n const opts = getOutputOptions(sprintCommand);\n\n let query = 'SELECT name, goal, status, start_date, end_date, velocity FROM sprints';\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n conditions.push('project_id = (SELECT id FROM projects WHERE key = ?)');\n params.push(config.project.key);\n }\n }\n\n if (options.status) {\n conditions.push('status = ?');\n params.push(options.status);\n }\n\n if (conditions.length > 0) {\n query += ' WHERE ' + conditions.join(' AND ');\n }\n\n query += ' ORDER BY start_date DESC';\n\n const sprints = queryAll<{\n name: string;\n goal: string | null;\n status: string;\n start_date: string;\n end_date: string;\n velocity: number | null;\n }>(query, params);\n\n data(\n sprints,\n [\n { header: 'Name', key: 'name', width: 15 },\n { header: 'Status', key: 'status', width: 10 },\n { header: 'Start', key: 'start_date', width: 12 },\n { header: 'End', key: 'end_date', width: 12 },\n { header: 'Velocity', key: 'velocity', width: 10 },\n { header: 'Goal', key: 'goal', width: 30 }\n ],\n opts\n );\n });\n\n// Start sprint\nsprintCommand\n .command('start')\n .argument('<name>', 'Sprint name')\n .description('Start a sprint (make it active)')\n .action((name: string) => {\n const opts = getOutputOptions(sprintCommand);\n\n const sprint = queryOne<{ id: string; status: string }>('SELECT id, status FROM sprints WHERE name = ?', [name]);\n if (!sprint) {\n error(`Sprint \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n if (sprint.status !== 'future') {\n error(`Sprint \"${name}\" is not in \"future\" status.`, opts);\n process.exit(1);\n }\n\n // Check for existing active sprint\n const activeSprint = queryOne<{ name: string }>('SELECT name FROM sprints WHERE status = \"active\"');\n if (activeSprint) {\n error(`Sprint \"${activeSprint.name}\" is already active. Close it first.`, opts);\n process.exit(1);\n }\n\n run(`UPDATE sprints SET status = 'active', updated_at = datetime('now') WHERE name = ?`, [name]);\n success(`Sprint \"${name}\" started.`, opts);\n });\n\n// Close sprint\nsprintCommand\n .command('close')\n .argument('<name>', 'Sprint name')\n .description('Close a sprint')\n .action((name: string) => {\n const opts = getOutputOptions(sprintCommand);\n\n const sprint = queryOne<{ id: string; status: string }>('SELECT id, status FROM sprints WHERE name = ?', [name]);\n if (!sprint) {\n error(`Sprint \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n if (sprint.status !== 'active') {\n error(`Sprint \"${name}\" is not active.`, opts);\n process.exit(1);\n }\n\n // Calculate velocity\n const velocity = queryOne<{ velocity: number }>(`\n SELECT COALESCE(SUM(story_points), 0) as velocity\n FROM user_stories\n WHERE sprint_id = ? AND status = 'done'\n `, [sprint.id]);\n\n run(`UPDATE sprints SET status = 'closed', velocity = ?, updated_at = datetime('now') WHERE name = ?`, [velocity?.velocity ?? 0, name]);\n success(`Sprint \"${name}\" closed with velocity ${velocity?.velocity ?? 0}.`, opts);\n });\n\n// Sprint board\nsprintCommand\n .command('board')\n .argument('[name]', 'Sprint name (uses active sprint if not specified)')\n .description('Show sprint board')\n .action((name?: string) => {\n const opts = getOutputOptions(sprintCommand);\n\n let sprint;\n if (name) {\n sprint = queryOne<{ id: string; name: string; status: string }>('SELECT id, name, status FROM sprints WHERE name = ?', [name]);\n } else {\n sprint = queryOne<{ id: string; name: string; status: string }>('SELECT id, name, status FROM sprints WHERE status = \"active\"');\n }\n\n if (!sprint) {\n error(name ? `Sprint \"${name}\" not found.` : 'No active sprint.', opts);\n process.exit(1);\n }\n\n const stories = queryAll<{\n key: string;\n summary: string;\n status: string;\n story_points: number | null;\n }>(`\n SELECT key, summary, status, story_points\n FROM user_stories\n WHERE sprint_id = ?\n ORDER BY status, key\n `, [sprint.id]);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, sprint: sprint.name, data: stories }));\n return;\n }\n\n blank();\n header(`Sprint: ${sprint.name} (${sprint.status})`, opts);\n blank();\n\n if (stories.length === 0) {\n console.log(' No stories in this sprint.');\n return;\n }\n\n const columns = ['backlog', 'selected', 'in_progress', 'in_review', 'done'];\n\n for (const status of columns) {\n const statusStories = stories.filter(s => s.status === status);\n console.log(` ${status.toUpperCase()} (${statusStories.length}):`);\n for (const story of statusStories) {\n const points = story.story_points ? ` [${story.story_points}pts]` : '';\n console.log(` - ${story.key}: ${story.summary}${points}`);\n }\n blank();\n }\n });\n\n// Add story to sprint\nsprintCommand\n .command('add-story')\n .argument('<sprint-name>', 'Sprint name')\n .argument('<story-key>', 'Story key')\n .description('Add a story to a sprint')\n .action((sprintName: string, storyKey: string) => {\n const opts = getOutputOptions(sprintCommand);\n\n const sprint = queryOne<{ id: string }>('SELECT id FROM sprints WHERE name = ?', [sprintName]);\n if (!sprint) {\n error(`Sprint \"${sprintName}\" not found.`, opts);\n process.exit(1);\n }\n\n const story = queryOne<{ id: string }>('SELECT id FROM user_stories WHERE key = ?', [storyKey]);\n if (!story) {\n error(`Story \"${storyKey}\" not found.`, opts);\n process.exit(1);\n }\n\n run(`UPDATE user_stories SET sprint_id = ?, updated_at = datetime('now') WHERE key = ?`, [sprint.id, storyKey]);\n success(`Story \"${storyKey}\" added to sprint \"${sprintName}\".`, opts);\n });\n","/**\n * Status Command\n *\n * Display project dashboard/status overview.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryOne } from '../db/connection.js';\nimport {\n error,\n header,\n blank,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\n\nexport const statusCommand = new Command('status')\n .description('Show project status dashboard')\n .action(() => {\n const opts = getOutputOptions(statusCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{\n id: string;\n key: string;\n name: string;\n }>('SELECT * FROM projects WHERE key = ?', [config.project.key]);\n\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Get counts\n const epicCount = queryOne<{ count: number }>('SELECT COUNT(*) as count FROM epics WHERE project_id = ?', [project.id]);\n const storyCount = queryOne<{ count: number }>('SELECT COUNT(*) as count FROM user_stories WHERE project_id = ?', [project.id]);\n const taskCount = queryOne<{ count: number }>('SELECT COUNT(*) as count FROM tasks WHERE project_id = ?', [project.id]);\n const bugCount = queryOne<{ count: number }>('SELECT COUNT(*) as count FROM bugs WHERE project_id = ?', [project.id]);\n\n // Get active sprint\n const activeSprint = queryOne<{ name: string; start_date: string; end_date: string }>(`\n SELECT name, start_date, end_date\n FROM sprints\n WHERE project_id = ? AND status = 'active'\n `, [project.id]);\n\n // Get in-progress items\n const inProgressStories = queryOne<{ count: number }>(`\n SELECT COUNT(*) as count\n FROM user_stories\n WHERE project_id = ? AND status = 'in_progress'\n `, [project.id]);\n\n const blockedTasks = queryOne<{ count: number }>(`\n SELECT COUNT(*) as count\n FROM tasks\n WHERE project_id = ? AND status = 'blocked'\n `, [project.id]);\n\n const openBugs = queryOne<{ count: number }>(`\n SELECT COUNT(*) as count\n FROM bugs\n WHERE project_id = ? AND status IN ('open', 'in_progress')\n `, [project.id]);\n\n const criticalBugs = queryOne<{ count: number }>(`\n SELECT COUNT(*) as count\n FROM bugs\n WHERE project_id = ? AND status IN ('open', 'in_progress') AND severity IN ('Blocker', 'Critical')\n `, [project.id]);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n project: { key: project.key, name: project.name },\n counts: {\n epics: epicCount?.count ?? 0,\n stories: storyCount?.count ?? 0,\n tasks: taskCount?.count ?? 0,\n bugs: bugCount?.count ?? 0\n },\n active_sprint: activeSprint ?? null,\n status: {\n in_progress_stories: inProgressStories?.count ?? 0,\n blocked_tasks: blockedTasks?.count ?? 0,\n open_bugs: openBugs?.count ?? 0,\n critical_bugs: criticalBugs?.count ?? 0\n }\n }\n }));\n return;\n }\n\n // Human-readable output\n blank();\n header(`Project: ${project.name} (${project.key})`, opts);\n blank();\n\n // Sprint info\n if (activeSprint) {\n console.log(` Active Sprint: ${activeSprint.name}`);\n console.log(` Sprint Period: ${activeSprint.start_date} - ${activeSprint.end_date}`);\n } else {\n console.log(' No active sprint');\n }\n blank();\n\n // Entity counts\n header('Entities:', opts);\n console.log(` Epics: ${epicCount?.count ?? 0}`);\n console.log(` Stories: ${storyCount?.count ?? 0}`);\n console.log(` Tasks: ${taskCount?.count ?? 0}`);\n console.log(` Bugs: ${bugCount?.count ?? 0}`);\n blank();\n\n // Status summary\n header('Status:', opts);\n console.log(` Stories in progress: ${inProgressStories?.count ?? 0}`);\n console.log(` Blocked tasks: ${blockedTasks?.count ?? 0}`);\n console.log(` Open bugs: ${openBugs?.count ?? 0}`);\n if ((criticalBugs?.count ?? 0) > 0) {\n console.log(` Critical/Blocker: ${criticalBugs?.count ?? 0} !!!`);\n }\n blank();\n });\n","/**\n * Initiative Command\n *\n * CRUD operations for initiatives (portfolio-level objectives).\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\n\nexport const initiativeCommand = new Command('initiative')\n .description('Manage initiatives (portfolio-level objectives)');\n\n// Create initiative\ninitiativeCommand\n .command('create')\n .argument('<summary>', 'Initiative summary')\n .option('-d, --description <description>', 'Initiative description')\n .option('-p, --priority <priority>', 'Priority (Highest/High/Medium/Low/Lowest)', 'Medium')\n .option('--owner <owner>', 'Owner')\n .option('--start <date>', 'Start date (YYYY-MM-DD)')\n .option('--target <date>', 'Target date (YYYY-MM-DD)')\n .description('Create a new initiative')\n .action((summary: string, options) => {\n const opts = getOutputOptions(initiativeCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const initiativeId = generateId();\n const initiativeKey = getNextKey(config.project.key);\n\n run(\n `INSERT INTO initiatives (id, project_id, key, summary, description, priority, owner, start_date, target_date, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'draft')`,\n [\n initiativeId,\n project.id,\n initiativeKey,\n summary,\n options.description ?? null,\n options.priority,\n options.owner ?? null,\n options.start ?? null,\n options.target ?? null\n ]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key: initiativeKey, summary } }));\n } else {\n success(`Created initiative ${initiativeKey}: ${summary}`, opts);\n }\n });\n\n// List initiatives\ninitiativeCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status (draft/active/done/archived)')\n .option('-a, --all', 'Show all projects')\n .description('List initiatives')\n .action((options) => {\n const opts = getOutputOptions(initiativeCommand);\n\n let query = `\n SELECT i.key, i.summary, i.status, i.priority, i.owner,\n (SELECT COUNT(*) FROM epics WHERE initiative_id = i.id) as epic_count\n FROM initiatives i\n `;\n const params: unknown[] = [];\n\n if (!options.all) {\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n query += ' JOIN projects p ON i.project_id = p.id WHERE p.key = ?';\n params.push(config.project.key);\n }\n }\n }\n\n if (options.status) {\n query += params.length > 0 ? ' AND' : ' WHERE';\n query += ' i.status = ?';\n params.push(options.status);\n }\n\n query += ' ORDER BY i.created_at DESC';\n\n const initiatives = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n owner: string | null;\n epic_count: number;\n }>(query, params);\n\n data(\n initiatives,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 40 },\n { header: 'Status', key: 'status', width: 10 },\n { header: 'Priority', key: 'priority', width: 10 },\n { header: 'Owner', key: 'owner', width: 15 },\n { header: 'Epics', key: 'epic_count', width: 8 }\n ],\n opts\n );\n });\n\n// Show initiative details\ninitiativeCommand\n .command('show')\n .argument('<key>', 'Initiative key')\n .description('Show initiative details')\n .action((key: string) => {\n const opts = getOutputOptions(initiativeCommand);\n\n const initiative = queryOne(`\n SELECT i.*, p.key as project_key\n FROM initiatives i\n JOIN projects p ON i.project_id = p.id\n WHERE i.key = ?\n `, [key]);\n\n if (!initiative) {\n error(`Initiative \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n details(\n initiative as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Summary', key: 'summary' },\n { label: 'Status', key: 'status' },\n { label: 'Priority', key: 'priority' },\n { label: 'Owner', key: 'owner' },\n { label: 'Start Date', key: 'start_date' },\n { label: 'Target Date', key: 'target_date' },\n { label: 'Description', key: 'description' },\n { label: 'Created', key: 'created_at' }\n ],\n opts\n );\n });\n\n// Update initiative\ninitiativeCommand\n .command('update')\n .argument('<key>', 'Initiative key')\n .option('-s, --summary <summary>', 'New summary')\n .option('-d, --description <description>', 'New description')\n .option('-p, --priority <priority>', 'New priority')\n .option('--owner <owner>', 'New owner')\n .option('--start <date>', 'New start date')\n .option('--target <date>', 'New target date')\n .description('Update initiative')\n .action((key: string, options) => {\n const opts = getOutputOptions(initiativeCommand);\n\n const initiative = queryOne('SELECT id FROM initiatives WHERE key = ?', [key]);\n if (!initiative) {\n error(`Initiative \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n\n if (options.summary) {\n updates.push('summary = ?');\n params.push(options.summary);\n }\n if (options.description) {\n updates.push('description = ?');\n params.push(options.description);\n }\n if (options.priority) {\n updates.push('priority = ?');\n params.push(options.priority);\n }\n if (options.owner) {\n updates.push('owner = ?');\n params.push(options.owner);\n }\n if (options.start) {\n updates.push('start_date = ?');\n params.push(options.start);\n }\n if (options.target) {\n updates.push('target_date = ?');\n params.push(options.target);\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(key);\n\n run(`UPDATE initiatives SET ${updates.join(', ')} WHERE key = ?`, params);\n success(`Initiative \"${key}\" updated.`, opts);\n });\n\n// Transition initiative status\ninitiativeCommand\n .command('transition')\n .argument('<key>', 'Initiative key')\n .argument('<status>', 'New status (draft/active/done/archived)')\n .description('Transition initiative to new status')\n .action((key: string, status: string) => {\n const opts = getOutputOptions(initiativeCommand);\n\n const initiative = queryOne<{ id: string; status: string }>('SELECT id, status FROM initiatives WHERE key = ?', [key]);\n if (!initiative) {\n error(`Initiative \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('initiative', initiative.status, status);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('initiative', initiative.status);\n error(formatTransitionError('initiative', key, initiative.status, status, validTransitions), opts);\n process.exit(1);\n }\n\n run(`UPDATE initiatives SET status = ?, updated_at = datetime('now') WHERE key = ?`, [status, key]);\n success(`Initiative \"${key}\" transitioned from \"${initiative.status}\" to \"${status}\".`, opts);\n });\n\n// Delete initiative\ninitiativeCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Initiative key')\n .option('--force', 'Delete without confirmation')\n .description('Delete initiative')\n .action((key: string) => {\n const opts = getOutputOptions(initiativeCommand);\n\n const initiative = queryOne('SELECT id FROM initiatives WHERE key = ?', [key]);\n if (!initiative) {\n error(`Initiative \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM initiatives WHERE key = ?', [key]);\n success(`Initiative \"${key}\" deleted.`, opts);\n });\n","/**\n * Sync Command\n *\n * File synchronization and document tracking commands.\n * Scans repository files, tracks changes, and parses comments.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { join } from 'path';\nimport { queryOne } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n scanDirectory,\n syncFilesToDatabase,\n getSyncStatus,\n getDocuments,\n ScanOptions\n} from '../services/file-scanner.js';\nimport {\n parseComments,\n syncCommentsToDatabase,\n getCommentStats\n} from '../services/comment-parser.js';\n\nexport const syncCommand = new Command('sync')\n .description('File synchronization and document tracking');\n\n// Scan command - scan and sync files\nsyncCommand\n .command('scan')\n .option('--patterns <patterns>', 'Comma-separated glob patterns (e.g., \"**/*.md,**/*.feature\")')\n .option('--ignore <dirs>', 'Comma-separated directories to ignore')\n .option('--comments', 'Also parse and sync comments from files')\n .description('Scan repository files and sync to database')\n .action((options) => {\n const opts = getOutputOptions(syncCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Build scan options\n const scanOptions: ScanOptions = {};\n if (options.patterns) {\n scanOptions.patterns = options.patterns.split(',').map((p: string) => p.trim());\n }\n if (options.ignore) {\n scanOptions.ignore = options.ignore.split(',').map((d: string) => d.trim());\n }\n\n // Scan files\n info('Scanning files...', opts);\n const files = scanDirectory(projectRoot, scanOptions);\n\n // Sync to database\n const result = syncFilesToDatabase(project.id, projectRoot, files);\n\n // Parse comments if requested\n let commentStats = { new: 0, resolved: 0 };\n if (options.comments) {\n info('Parsing comments...', opts);\n for (const file of files) {\n if (['md', 'feature', 'yaml', 'yml'].includes(file.extension)) {\n try {\n const fullPath = join(projectRoot, file.path);\n const comments = parseComments(fullPath);\n\n // Get document ID\n const doc = queryOne<{ id: string }>(\n 'SELECT id FROM documents WHERE project_id = ? AND path = ?',\n [project.id, file.path]\n );\n\n if (doc && comments.length > 0) {\n const syncResult = syncCommentsToDatabase(doc.id, comments);\n commentStats.new += syncResult.new;\n commentStats.resolved += syncResult.resolved;\n }\n } catch {\n // Skip files that can't be parsed\n }\n }\n }\n }\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n files: {\n total: result.total,\n new: result.new,\n modified: result.modified,\n deleted: result.deleted,\n unchanged: result.unchanged\n },\n comments: options.comments ? commentStats : undefined\n }\n }));\n } else {\n success(`Scan complete: ${result.total} files`, opts);\n console.log(` New: ${result.new}`);\n console.log(` Modified: ${result.modified}`);\n console.log(` Deleted: ${result.deleted}`);\n console.log(` Unchanged: ${result.unchanged}`);\n if (options.comments) {\n console.log(` Comments: ${commentStats.new} new, ${commentStats.resolved} resolved`);\n }\n }\n });\n\n// Status command - show sync status\nsyncCommand\n .command('status')\n .description('Show file sync status')\n .action(() => {\n const opts = getOutputOptions(syncCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const status = getSyncStatus(project.id);\n const comments = getCommentStats(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n files: status,\n comments\n }\n }));\n } else {\n details(\n {\n total_files: status.total,\n tracked: status.tracked,\n modified: status.modified,\n deleted: status.deleted,\n last_scan: status.lastScan ?? 'Never',\n total_comments: comments.totalComments,\n user_comments: comments.userComments,\n ai_comments: comments.aiComments,\n docs_with_comments: comments.documentsWithComments\n },\n [\n { label: 'Total Files', key: 'total_files' },\n { label: 'Tracked', key: 'tracked' },\n { label: 'Modified', key: 'modified' },\n { label: 'Deleted', key: 'deleted' },\n { label: 'Last Scan', key: 'last_scan' },\n { label: 'Total Comments', key: 'total_comments' },\n { label: 'User Comments', key: 'user_comments' },\n { label: 'AI Comments', key: 'ai_comments' },\n { label: 'Docs with Comments', key: 'docs_with_comments' }\n ],\n opts\n );\n }\n });\n\n// List command - list tracked documents\nsyncCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status (tracked/modified/deleted)')\n .option('-e, --extension <ext>', 'Filter by extension (md/feature/yaml)')\n .description('List tracked documents')\n .action((options) => {\n const opts = getOutputOptions(syncCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n let documents = getDocuments(project.id, options.status);\n\n // Filter by extension if specified\n if (options.extension) {\n documents = documents.filter((d) => d.extension === options.extension);\n }\n\n data(\n documents,\n [\n { header: 'Path', key: 'path', width: 50 },\n { header: 'Extension', key: 'extension', width: 10 },\n { header: 'Status', key: 'status', width: 10 },\n { header: 'Size', key: 'size_bytes', width: 10 },\n { header: 'Last Scan', key: 'last_scanned_at', width: 20 }\n ],\n opts\n );\n });\n\n// Comments command - list comments across documents\nsyncCommand\n .command('comments')\n .option('-t, --type <type>', 'Filter by type (user/ai)')\n .description('List all unresolved comments')\n .action((options) => {\n const opts = getOutputOptions(syncCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n let query = `\n SELECT dc.id, dc.marker_type as type, dc.line_number, dc.content, d.path\n FROM doc_comments dc\n JOIN documents d ON dc.document_id = d.id\n WHERE d.project_id = ? AND dc.resolved = 0\n `;\n const params: unknown[] = [project.id];\n\n if (options.type) {\n query += ' AND dc.marker_type = ?';\n params.push(options.type);\n }\n\n query += ' ORDER BY d.path, dc.line_number';\n\n const { queryAll } = require('../db/connection.js');\n const comments = queryAll(query, params);\n\n data(\n comments,\n [\n { header: 'Path', key: 'path', width: 40 },\n { header: 'Line', key: 'line_number', width: 6 },\n { header: 'Type', key: 'type', width: 6 },\n { header: 'Content', key: 'content', width: 50 }\n ],\n opts\n );\n });\n","/**\n * File Scanner Service\n *\n * Scans repository files, computes hashes, and tracks changes.\n * Supports glob patterns for filtering files.\n *\n * @author Vladimir K.S.\n */\n\nimport { createHash } from 'crypto';\nimport { readFileSync, statSync, readdirSync, existsSync } from 'fs';\nimport { join, relative, extname } from 'path';\nimport { queryOne, queryAll, run, generateId } from '../db/connection.js';\nimport { parseFrontmatterFromFile, type FrontmatterMetadata } from './frontmatter-parser.js';\n\nexport interface FileInfo {\n path: string;\n filename: string;\n extension: string;\n size: number;\n hash: string;\n // Frontmatter metadata (if present)\n hasFrontmatter: boolean;\n frontmatterRaw?: string;\n metadata?: FrontmatterMetadata;\n}\n\nexport interface ScanResult {\n total: number;\n new: number;\n modified: number;\n deleted: number;\n unchanged: number;\n files: FileInfo[];\n}\n\nexport interface ScanOptions {\n patterns?: string[];\n ignore?: string[];\n}\n\nconst DEFAULT_PATTERNS = ['**/*.md', '**/*.feature', '**/*.yaml', '**/*.yml'];\nconst DEFAULT_IGNORE = ['node_modules', '.git', 'dist', 'coverage', '.aigile'];\n\n/**\n * Compute SHA256 hash of file content\n */\nexport function computeFileHash(filePath: string): string {\n const content = readFileSync(filePath);\n return createHash('sha256').update(content).digest('hex');\n}\n\n/**\n * Check if a path matches any of the ignore patterns\n */\nfunction shouldIgnore(relativePath: string, ignorePatterns: string[]): boolean {\n for (const pattern of ignorePatterns) {\n if (relativePath.includes(pattern) || relativePath.startsWith(pattern)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a file matches any of the include patterns\n */\nfunction matchesPattern(filename: string, patterns: string[]): boolean {\n const ext = extname(filename).toLowerCase();\n\n for (const pattern of patterns) {\n // Simple extension matching: **/*.md -> .md\n if (pattern.includes('*.')) {\n const patternExt = '.' + pattern.split('*.').pop();\n if (ext === patternExt) {\n return true;\n }\n }\n // Direct filename match\n if (pattern === filename) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Recursively collect files from a directory\n */\nfunction collectFiles(\n dir: string,\n rootDir: string,\n patterns: string[],\n ignore: string[],\n files: FileInfo[] = []\n): FileInfo[] {\n if (!existsSync(dir)) {\n return files;\n }\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = relative(rootDir, fullPath);\n\n if (shouldIgnore(relativePath, ignore)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n collectFiles(fullPath, rootDir, patterns, ignore, files);\n } else if (entry.isFile() && matchesPattern(entry.name, patterns)) {\n try {\n const stats = statSync(fullPath);\n const hash = computeFileHash(fullPath);\n\n // Parse frontmatter for markdown files\n let hasFrontmatter = false;\n let frontmatterRaw: string | undefined;\n let metadata: FrontmatterMetadata | undefined;\n\n const ext = extname(entry.name).toLowerCase();\n if (ext === '.md' || ext === '.markdown') {\n const parsed = parseFrontmatterFromFile(fullPath);\n if (parsed) {\n hasFrontmatter = true;\n frontmatterRaw = parsed.raw;\n metadata = parsed.metadata;\n }\n }\n\n files.push({\n path: relativePath,\n filename: entry.name,\n extension: ext.slice(1),\n size: stats.size,\n hash,\n hasFrontmatter,\n frontmatterRaw,\n metadata\n });\n } catch {\n // Skip files that can't be read\n }\n }\n }\n\n return files;\n}\n\n/**\n * Scan a project directory for tracked files\n */\nexport function scanDirectory(\n projectPath: string,\n options: ScanOptions = {}\n): FileInfo[] {\n const patterns = options.patterns ?? DEFAULT_PATTERNS;\n const ignore = options.ignore ?? DEFAULT_IGNORE;\n\n return collectFiles(projectPath, projectPath, patterns, ignore);\n}\n\n/**\n * Sync scanned files with the database\n */\nexport function syncFilesToDatabase(\n projectId: string,\n projectPath: string,\n files: FileInfo[]\n): ScanResult {\n const result: ScanResult = {\n total: files.length,\n new: 0,\n modified: 0,\n deleted: 0,\n unchanged: 0,\n files\n };\n\n const now = new Date().toISOString();\n const processedPaths = new Set<string>();\n\n // Process each scanned file\n for (const file of files) {\n processedPaths.add(file.path);\n\n const existing = queryOne<{\n id: string;\n content_hash: string;\n status: string;\n }>(\n 'SELECT id, content_hash, status FROM documents WHERE project_id = ? AND path = ?',\n [projectId, file.path]\n );\n\n // Serialize arrays to JSON for storage\n const metaModules = file.metadata?.modules ? JSON.stringify(file.metadata.modules) : null;\n const metaDependencies = file.metadata?.dependencies ? JSON.stringify(file.metadata.dependencies) : null;\n const metaCodeRefs = file.metadata?.code_refs ? JSON.stringify(file.metadata.code_refs) : null;\n const metaAuthors = file.metadata?.authors ? JSON.stringify(file.metadata.authors) : null;\n\n if (!existing) {\n // New file - include frontmatter metadata\n run(\n `INSERT INTO documents (\n id, project_id, path, filename, extension, content_hash, size_bytes, status, last_scanned_at,\n has_frontmatter, frontmatter_raw, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'tracked', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n generateId(), projectId, file.path, file.filename, file.extension, file.hash, file.size, now,\n file.hasFrontmatter ? 1 : 0, file.frontmatterRaw ?? null,\n file.metadata?.status ?? null, file.metadata?.version ?? null,\n file.metadata?.tldr ?? null, file.metadata?.title ?? null,\n metaModules, metaDependencies, metaCodeRefs, metaAuthors\n ]\n );\n result.new++;\n } else if (existing.content_hash !== file.hash) {\n // Modified file - update with new frontmatter metadata\n run(\n `UPDATE documents SET\n content_hash = ?, size_bytes = ?, status = 'modified', last_scanned_at = ?, updated_at = datetime('now'),\n has_frontmatter = ?, frontmatter_raw = ?, meta_status = ?, meta_version = ?, meta_tldr = ?, meta_title = ?,\n meta_modules = ?, meta_dependencies = ?, meta_code_refs = ?, meta_authors = ?\n WHERE id = ?`,\n [\n file.hash, file.size, now,\n file.hasFrontmatter ? 1 : 0, file.frontmatterRaw ?? null,\n file.metadata?.status ?? null, file.metadata?.version ?? null,\n file.metadata?.tldr ?? null, file.metadata?.title ?? null,\n metaModules, metaDependencies, metaCodeRefs, metaAuthors,\n existing.id\n ]\n );\n result.modified++;\n } else {\n // Unchanged file\n run(\n `UPDATE documents SET last_scanned_at = ?, status = 'tracked' WHERE id = ?`,\n [now, existing.id]\n );\n result.unchanged++;\n }\n }\n\n // Mark deleted files (files in DB but not found in scan)\n const dbFiles = queryAll<{ id: string; path: string }>(\n 'SELECT id, path FROM documents WHERE project_id = ? AND status != ?',\n [projectId, 'deleted']\n );\n\n for (const dbFile of dbFiles) {\n if (!processedPaths.has(dbFile.path)) {\n run(\n `UPDATE documents SET status = 'deleted', updated_at = datetime('now') WHERE id = ?`,\n [dbFile.id]\n );\n result.deleted++;\n }\n }\n\n return result;\n}\n\n/**\n * Get sync status for a project\n */\nexport function getSyncStatus(projectId: string): {\n total: number;\n tracked: number;\n modified: number;\n deleted: number;\n lastScan: string | null;\n} {\n const stats = queryOne<{\n total: number;\n tracked: number;\n modified: number;\n deleted: number;\n }>(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'tracked' THEN 1 ELSE 0 END) as tracked,\n SUM(CASE WHEN status = 'modified' THEN 1 ELSE 0 END) as modified,\n SUM(CASE WHEN status = 'deleted' THEN 1 ELSE 0 END) as deleted\n FROM documents\n WHERE project_id = ?\n `, [projectId]);\n\n const lastScan = queryOne<{ last_scanned_at: string }>(\n 'SELECT MAX(last_scanned_at) as last_scanned_at FROM documents WHERE project_id = ?',\n [projectId]\n );\n\n return {\n total: stats?.total ?? 0,\n tracked: stats?.tracked ?? 0,\n modified: stats?.modified ?? 0,\n deleted: stats?.deleted ?? 0,\n lastScan: lastScan?.last_scanned_at ?? null\n };\n}\n\n/**\n * Get list of documents for a project\n */\nexport function getDocuments(\n projectId: string,\n status?: string\n): Array<{\n path: string;\n filename: string;\n extension: string;\n status: string;\n size_bytes: number;\n last_scanned_at: string;\n}> {\n let query = `\n SELECT path, filename, extension, status, size_bytes, last_scanned_at\n FROM documents\n WHERE project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n if (status) {\n query += ' AND status = ?';\n params.push(status);\n }\n\n query += ' ORDER BY path';\n\n return queryAll(query, params);\n}\n\n/**\n * Document with frontmatter metadata\n */\nexport interface DocumentWithMetadata {\n id: string;\n path: string;\n filename: string;\n extension: string;\n status: string;\n size_bytes: number;\n last_scanned_at: string;\n has_frontmatter: number;\n meta_status: string | null;\n meta_version: string | null;\n meta_tldr: string | null;\n meta_title: string | null;\n meta_modules: string | null;\n meta_dependencies: string | null;\n meta_code_refs: string | null;\n meta_authors: string | null;\n}\n\n/**\n * Get documents by frontmatter status (e.g., DRAFT, IN-REVIEW, APPROVED, TEMPLATE)\n */\nexport function getDocumentsByMetaStatus(\n projectId: string,\n metaStatus: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_status = ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, metaStatus]\n );\n}\n\n/**\n * Get documents that contain a specific module\n * Modules are stored as JSON arrays, so we use LIKE for matching\n */\nexport function getDocumentsByModule(\n projectId: string,\n module: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_modules LIKE ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, `%\"${module}\"%`]\n );\n}\n\n/**\n * Get documents that depend on a specific file path\n * Dependencies are stored as JSON arrays\n */\nexport function getDocumentsByDependency(\n projectId: string,\n dependencyPath: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_dependencies LIKE ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, `%\"${dependencyPath}\"%`]\n );\n}\n\n/**\n * Get documents that reference a specific code directory\n */\nexport function getDocumentsByCodeRef(\n projectId: string,\n codeRef: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_code_refs LIKE ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, `%\"${codeRef}\"%`]\n );\n}\n\n/**\n * Get all documents with valid frontmatter\n */\nexport function getDocumentsWithFrontmatter(\n projectId: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND has_frontmatter = 1 AND status != 'deleted'\n ORDER BY path`,\n [projectId]\n );\n}\n\n/**\n * Get all documents without frontmatter (shadow mode candidates)\n */\nexport function getDocumentsWithoutFrontmatter(\n projectId: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND (has_frontmatter = 0 OR has_frontmatter IS NULL) AND status != 'deleted'\n ORDER BY path`,\n [projectId]\n );\n}\n\n/**\n * Get document by path with full metadata\n */\nexport function getDocumentByPath(\n projectId: string,\n filePath: string\n): DocumentWithMetadata | undefined {\n return queryOne<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND path = ?`,\n [projectId, filePath]\n );\n}\n\n/**\n * Get TEMPLATE documents for workplan (ordered by path)\n */\nexport function getTemplateDocuments(\n projectId: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_status = 'TEMPLATE' AND status != 'deleted'\n ORDER BY path`,\n [projectId]\n );\n}\n\n/**\n * Search documents by tldr content\n */\nexport function searchDocumentsByTldr(\n projectId: string,\n searchTerm: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_tldr LIKE ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, `%${searchTerm}%`]\n );\n}\n","/**\n * Frontmatter Parser Service\n *\n * Extracts and parses YAML frontmatter from markdown files.\n * Supports the standard AIGILE metadata schema.\n *\n * @author Vladimir K.S.\n */\n\nimport { readFileSync } from 'fs';\nimport { parse as parseYaml } from 'yaml';\n\n/**\n * AIGILE standard frontmatter metadata structure\n */\nexport interface FrontmatterMetadata {\n status?: string; // DRAFT, IN-REVIEW, APPROVED, TEMPLATE, PRODUCTION\n version?: string; // e.g., \"1.0\", \"0.1\"\n tldr?: string; // One-sentence summary\n modules?: string[]; // e.g., [\"auth\", \"auth/oauth\"]\n dependencies?: string[]; // Relative paths to dependent docs\n code_refs?: string[]; // Relative paths to code directories\n authors?: string[]; // Author names\n title?: string; // Document title\n}\n\n/**\n * Full frontmatter structure (may contain nested metadata object)\n */\nexport interface Frontmatter {\n metadata?: FrontmatterMetadata;\n // Allow other top-level keys\n [key: string]: unknown;\n}\n\n/**\n * Result of parsing a file's frontmatter\n */\nexport interface ParsedFrontmatter {\n raw: string; // Raw YAML string\n data: Frontmatter; // Parsed object\n metadata: FrontmatterMetadata; // Extracted metadata (flattened)\n contentStart: number; // Line number where content starts (after frontmatter)\n hasMetadata: boolean; // Whether file has valid frontmatter\n}\n\nconst FRONTMATTER_REGEX = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\n/**\n * Extract frontmatter from markdown content\n */\nexport function extractFrontmatter(content: string): ParsedFrontmatter | null {\n const match = content.match(FRONTMATTER_REGEX);\n\n if (!match) {\n return null;\n }\n\n const raw = match[1];\n const contentStart = content.substring(0, match[0].length).split('\\n').length;\n\n try {\n const data = parseYaml(raw) as Frontmatter;\n\n // Extract metadata - may be nested under 'metadata' key or at root\n let metadata: FrontmatterMetadata = {};\n\n if (data?.metadata && typeof data.metadata === 'object') {\n // Nested metadata object (preferred format)\n metadata = data.metadata as FrontmatterMetadata;\n } else {\n // Check for metadata fields at root level (legacy support)\n metadata = {\n status: data?.status as string | undefined,\n version: data?.version as string | undefined,\n tldr: data?.tldr as string | undefined,\n modules: data?.modules as string[] | undefined,\n dependencies: data?.dependencies as string[] | undefined,\n code_refs: data?.code_refs as string[] | undefined,\n authors: data?.authors as string[] | undefined,\n title: data?.title as string | undefined,\n };\n }\n\n // Normalize arrays\n if (metadata.modules && !Array.isArray(metadata.modules)) {\n metadata.modules = [String(metadata.modules)];\n }\n if (metadata.dependencies && !Array.isArray(metadata.dependencies)) {\n metadata.dependencies = [String(metadata.dependencies)];\n }\n if (metadata.code_refs && !Array.isArray(metadata.code_refs)) {\n metadata.code_refs = [String(metadata.code_refs)];\n }\n if (metadata.authors && !Array.isArray(metadata.authors)) {\n metadata.authors = [String(metadata.authors)];\n }\n\n return {\n raw,\n data,\n metadata,\n contentStart,\n hasMetadata: true\n };\n } catch {\n // Invalid YAML - return null\n return null;\n }\n}\n\n/**\n * Parse frontmatter from a file path\n */\nexport function parseFrontmatterFromFile(filePath: string): ParsedFrontmatter | null {\n try {\n const content = readFileSync(filePath, 'utf-8');\n return extractFrontmatter(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Check if a file has valid frontmatter\n */\nexport function hasFrontmatter(filePath: string): boolean {\n const result = parseFrontmatterFromFile(filePath);\n return result !== null && result.hasMetadata;\n}\n\n/**\n * Get just the metadata from a file (convenience function)\n */\nexport function getFileMetadata(filePath: string): FrontmatterMetadata | null {\n const result = parseFrontmatterFromFile(filePath);\n return result?.metadata ?? null;\n}\n\n/**\n * Serialize metadata back to YAML frontmatter string\n */\nexport function serializeMetadata(metadata: FrontmatterMetadata): string {\n // Build YAML manually for clean output\n const lines: string[] = ['---', 'metadata:'];\n\n if (metadata.status) {\n lines.push(` status: ${metadata.status}`);\n }\n if (metadata.version) {\n lines.push(` version: ${metadata.version}`);\n }\n if (metadata.tldr) {\n lines.push(` tldr: \"${metadata.tldr.replace(/\"/g, '\\\\\"')}\"`);\n }\n if (metadata.title) {\n lines.push(` title: \"${metadata.title.replace(/\"/g, '\\\\\"')}\"`);\n }\n if (metadata.authors && metadata.authors.length > 0) {\n lines.push(` authors: [${metadata.authors.map(a => `\"${a}\"`).join(', ')}]`);\n }\n if (metadata.modules && metadata.modules.length > 0) {\n lines.push(` modules: [${metadata.modules.join(', ')}]`);\n }\n if (metadata.dependencies && metadata.dependencies.length > 0) {\n lines.push(` dependencies: [${metadata.dependencies.join(', ')}]`);\n }\n if (metadata.code_refs && metadata.code_refs.length > 0) {\n lines.push(` code_refs: [${metadata.code_refs.join(', ')}]`);\n }\n\n lines.push('---');\n return lines.join('\\n');\n}\n\n/**\n * Update metadata in a file's content (returns new content)\n */\nexport function updateFrontmatterContent(\n content: string,\n updates: Partial<FrontmatterMetadata>\n): string {\n const existing = extractFrontmatter(content);\n\n if (!existing) {\n // No existing frontmatter - add it\n const metadata: FrontmatterMetadata = {\n status: updates.status ?? 'DRAFT',\n version: updates.version ?? '0.1',\n tldr: updates.tldr ?? '',\n modules: updates.modules ?? [],\n dependencies: updates.dependencies ?? [],\n code_refs: updates.code_refs ?? [],\n };\n return serializeMetadata(metadata) + '\\n\\n' + content;\n }\n\n // Merge updates with existing metadata\n const merged: FrontmatterMetadata = {\n ...existing.metadata,\n ...updates\n };\n\n // Handle array merging for dependencies, modules, code_refs\n if (updates.dependencies && existing.metadata.dependencies) {\n merged.dependencies = [...new Set([\n ...existing.metadata.dependencies,\n ...updates.dependencies\n ])];\n }\n if (updates.modules && existing.metadata.modules) {\n merged.modules = [...new Set([\n ...existing.metadata.modules,\n ...updates.modules\n ])];\n }\n if (updates.code_refs && existing.metadata.code_refs) {\n merged.code_refs = [...new Set([\n ...existing.metadata.code_refs,\n ...updates.code_refs\n ])];\n }\n\n // Replace frontmatter in content\n const newFrontmatter = serializeMetadata(merged);\n return content.replace(FRONTMATTER_REGEX, newFrontmatter + '\\n\\n');\n}\n","/**\n * Comment Parser Service\n *\n * Parses document files for special comment markers:\n * - [[! ... ]] - User comments/questions\n * - [{! ... }] - AI suggestions/responses\n *\n * Supports both single-line and multi-line comments.\n *\n * @author Vladimir K.S.\n */\n\nimport { readFileSync } from 'fs';\nimport { run, queryAll, queryOne, generateId } from '../db/connection.js';\n\nexport type MarkerType = 'user' | 'ai';\n\nexport interface ParsedComment {\n type: MarkerType;\n content: string;\n lineNumber: number;\n raw: string;\n}\n\nexport interface CommentSyncResult {\n total: number;\n new: number;\n resolved: number;\n}\n\n// Regex patterns for comment markers\nconst USER_COMMENT_PATTERN = /\\[\\[!\\s*([\\s\\S]*?)\\s*\\]\\]/g;\nconst AI_COMMENT_PATTERN = /\\[\\{!\\s*([\\s\\S]*?)\\s*\\}]/g;\n\n/**\n * Parse a file for comment markers\n */\nexport function parseComments(filePath: string): ParsedComment[] {\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n');\n const comments: ParsedComment[] = [];\n\n // Track which line each character position maps to\n const positionToLine: number[] = [];\n let pos = 0;\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const lineLength = lines[lineNum].length + 1; // +1 for newline\n for (let i = 0; i < lineLength; i++) {\n positionToLine[pos++] = lineNum + 1; // 1-indexed line numbers\n }\n }\n\n // Find user comments [[! ... ]]\n let match: RegExpExecArray | null;\n USER_COMMENT_PATTERN.lastIndex = 0;\n while ((match = USER_COMMENT_PATTERN.exec(content)) !== null) {\n comments.push({\n type: 'user',\n content: match[1].trim(),\n lineNumber: positionToLine[match.index] ?? 1,\n raw: match[0]\n });\n }\n\n // Find AI comments [{! ... }]\n AI_COMMENT_PATTERN.lastIndex = 0;\n while ((match = AI_COMMENT_PATTERN.exec(content)) !== null) {\n comments.push({\n type: 'ai',\n content: match[1].trim(),\n lineNumber: positionToLine[match.index] ?? 1,\n raw: match[0]\n });\n }\n\n // Sort by line number\n comments.sort((a, b) => a.lineNumber - b.lineNumber);\n\n return comments;\n}\n\n/**\n * Sync parsed comments to the database\n */\nexport function syncCommentsToDatabase(\n documentId: string,\n comments: ParsedComment[]\n): CommentSyncResult {\n const result: CommentSyncResult = {\n total: comments.length,\n new: 0,\n resolved: 0\n };\n\n // Get existing unresolved comments for this document\n const existingComments = queryAll<{\n id: string;\n marker_type: string;\n line_number: number;\n content: string;\n }>(\n 'SELECT id, marker_type, line_number, content FROM doc_comments WHERE document_id = ? AND resolved = 0',\n [documentId]\n );\n\n const processedIds = new Set<string>();\n\n // Process each parsed comment\n for (const comment of comments) {\n const markerType = comment.type === 'user' ? 'user' : 'ai';\n\n // Check if this comment already exists (match by type and content)\n const existing = existingComments.find(\n (e) => e.marker_type === markerType && e.content === comment.content\n );\n\n if (existing) {\n processedIds.add(existing.id);\n // Update line number if changed\n if (existing.line_number !== comment.lineNumber) {\n run(\n 'UPDATE doc_comments SET line_number = ? WHERE id = ?',\n [comment.lineNumber, existing.id]\n );\n }\n } else {\n // New comment\n run(\n `INSERT INTO doc_comments (id, document_id, marker_type, line_number, content)\n VALUES (?, ?, ?, ?, ?)`,\n [generateId(), documentId, markerType, comment.lineNumber, comment.content]\n );\n result.new++;\n }\n }\n\n // Mark comments as resolved if they no longer exist in the file\n for (const existing of existingComments) {\n if (!processedIds.has(existing.id)) {\n run('UPDATE doc_comments SET resolved = 1 WHERE id = ?', [existing.id]);\n result.resolved++;\n }\n }\n\n return result;\n}\n\n/**\n * Get all unresolved comments for a document\n */\nexport function getDocumentComments(documentId: string): Array<{\n id: string;\n type: MarkerType;\n lineNumber: number;\n content: string;\n}> {\n const comments = queryAll<{\n id: string;\n marker_type: string;\n line_number: number;\n content: string;\n }>(\n 'SELECT id, marker_type, line_number, content FROM doc_comments WHERE document_id = ? AND resolved = 0 ORDER BY line_number',\n [documentId]\n );\n\n return comments.map((c) => ({\n id: c.id,\n type: c.marker_type as MarkerType,\n lineNumber: c.line_number,\n content: c.content\n }));\n}\n\n/**\n * Get comment statistics for a project\n */\nexport function getCommentStats(projectId: string): {\n totalComments: number;\n userComments: number;\n aiComments: number;\n documentsWithComments: number;\n} {\n const stats = queryOne<{\n total: number;\n user_count: number;\n ai_count: number;\n doc_count: number;\n }>(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN dc.marker_type = 'user' THEN 1 ELSE 0 END) as user_count,\n SUM(CASE WHEN dc.marker_type = 'ai' THEN 1 ELSE 0 END) as ai_count,\n COUNT(DISTINCT dc.document_id) as doc_count\n FROM doc_comments dc\n JOIN documents d ON dc.document_id = d.id\n WHERE d.project_id = ? AND dc.resolved = 0\n `, [projectId]);\n\n return {\n totalComments: stats?.total ?? 0,\n userComments: stats?.user_count ?? 0,\n aiComments: stats?.ai_count ?? 0,\n documentsWithComments: stats?.doc_count ?? 0\n };\n}\n\n/**\n * Mark a comment as resolved\n */\nexport function resolveComment(commentId: string): boolean {\n const comment = queryOne('SELECT id FROM doc_comments WHERE id = ?', [commentId]);\n if (!comment) {\n return false;\n }\n\n run('UPDATE doc_comments SET resolved = 1 WHERE id = ?', [commentId]);\n return true;\n}\n","/**\n * Session Command\n *\n * Manages AI work sessions for context continuity.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryOne } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n startSession,\n endSession,\n getActiveSession,\n listSessions,\n getSession\n} from '../services/session-service.js';\nimport {\n getActivityLog,\n getActivitySummary\n} from '../services/activity-logger.js';\n\nexport const sessionCommand = new Command('session')\n .description('Manage AI work sessions');\n\n// Start a new session\nsessionCommand\n .command('start')\n .description('Start a new AI work session')\n .action(() => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const session = startSession(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n sessionId: session.id,\n startedAt: session.startedAt\n }\n }));\n } else {\n success(`Session started: ${session.id.slice(0, 8)}...`, opts);\n info(`Started at: ${session.startedAt}`, opts);\n }\n });\n\n// End the current session\nsessionCommand\n .command('end')\n .option('-s, --summary <summary>', 'Session summary')\n .description('End the current AI work session')\n .action((options) => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const session = endSession(project.id, options.summary);\n\n if (!session) {\n error('No active session to end.', opts);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n sessionId: session.id,\n startedAt: session.startedAt,\n endedAt: session.endedAt,\n entitiesModified: session.entitiesModified,\n filesModified: session.filesModified\n }\n }));\n } else {\n success(`Session ended: ${session.id.slice(0, 8)}...`, opts);\n console.log(` Duration: ${calculateDuration(session.startedAt, session.endedAt)}`);\n console.log(` Entities modified: ${session.entitiesModified}`);\n console.log(` Files modified: ${session.filesModified}`);\n }\n });\n\n// Show current session status\nsessionCommand\n .command('status')\n .description('Show current session status')\n .action(() => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const session = getActiveSession(project.id);\n\n if (!session) {\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { active: false } }));\n } else {\n info('No active session.', opts);\n }\n return;\n }\n\n const activitySummary = getActivitySummary(project.id, session.startedAt);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n active: true,\n sessionId: session.id,\n startedAt: session.startedAt,\n duration: calculateDuration(session.startedAt, null),\n entitiesModified: session.entitiesModified,\n filesModified: session.filesModified,\n activity: activitySummary\n }\n }));\n } else {\n details(\n {\n session_id: session.id.slice(0, 8) + '...',\n started_at: session.startedAt,\n duration: calculateDuration(session.startedAt, null),\n entities_modified: session.entitiesModified,\n files_modified: session.filesModified,\n creates: activitySummary.creates,\n updates: activitySummary.updates,\n transitions: activitySummary.transitions\n },\n [\n { label: 'Session ID', key: 'session_id' },\n { label: 'Started', key: 'started_at' },\n { label: 'Duration', key: 'duration' },\n { label: 'Entities Modified', key: 'entities_modified' },\n { label: 'Files Modified', key: 'files_modified' },\n { label: 'Creates', key: 'creates' },\n { label: 'Updates', key: 'updates' },\n { label: 'Transitions', key: 'transitions' }\n ],\n opts\n );\n }\n });\n\n// List sessions\nsessionCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status (active/completed/abandoned)')\n .option('-n, --limit <n>', 'Limit number of results', '10')\n .description('List sessions')\n .action((options) => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const sessions = listSessions(project.id, {\n status: options.status,\n limit: parseInt(options.limit, 10)\n });\n\n data(\n sessions.map((s) => ({\n id: s.id.slice(0, 8) + '...',\n started: s.startedAt,\n duration: s.duration,\n status: s.status,\n entities: s.entitiesModified,\n files: s.filesModified\n })),\n [\n { header: 'ID', key: 'id', width: 12 },\n { header: 'Started', key: 'started', width: 20 },\n { header: 'Duration', key: 'duration', width: 10 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Entities', key: 'entities', width: 10 },\n { header: 'Files', key: 'files', width: 8 }\n ],\n opts\n );\n });\n\n// Show session details with activity\nsessionCommand\n .command('show')\n .argument('<id>', 'Session ID (or partial ID)')\n .description('Show session details and activity')\n .action((id: string) => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Try to find session by full or partial ID\n const sessions = listSessions(project.id, { limit: 100 });\n const session = sessions.find((s) => s.id.startsWith(id) || s.id === id);\n\n if (!session) {\n error(`Session \"${id}\" not found.`, opts);\n process.exit(1);\n }\n\n const fullSession = getSession(session.id);\n if (!fullSession) {\n error(`Session \"${id}\" not found.`, opts);\n process.exit(1);\n }\n\n const activity = getActivityLog(project.id, {\n since: fullSession.startedAt,\n limit: 20\n });\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n session: fullSession,\n activity\n }\n }));\n } else {\n details(\n {\n id: fullSession.id,\n status: fullSession.status,\n started: fullSession.startedAt,\n ended: fullSession.endedAt ?? 'Active',\n duration: calculateDuration(fullSession.startedAt, fullSession.endedAt),\n entities: fullSession.entitiesModified,\n files: fullSession.filesModified,\n summary: fullSession.summary ?? '-'\n },\n [\n { label: 'Session ID', key: 'id' },\n { label: 'Status', key: 'status' },\n { label: 'Started', key: 'started' },\n { label: 'Ended', key: 'ended' },\n { label: 'Duration', key: 'duration' },\n { label: 'Entities Modified', key: 'entities' },\n { label: 'Files Modified', key: 'files' },\n { label: 'Summary', key: 'summary' }\n ],\n opts\n );\n\n if (activity.length > 0) {\n console.log('\\nRecent Activity:');\n data(\n activity.map((a) => ({\n time: a.createdAt.split('T')[1]?.split('.')[0] ?? a.createdAt,\n type: a.entityType,\n action: a.action,\n entity: a.entityId.slice(0, 8) + '...'\n })),\n [\n { header: 'Time', key: 'time', width: 10 },\n { header: 'Type', key: 'type', width: 12 },\n { header: 'Action', key: 'action', width: 12 },\n { header: 'Entity', key: 'entity', width: 12 }\n ],\n opts\n );\n }\n }\n });\n\n// Activity log command\nsessionCommand\n .command('activity')\n .option('-t, --type <type>', 'Filter by entity type')\n .option('-a, --action <action>', 'Filter by action (create/update/delete/transition)')\n .option('-n, --limit <n>', 'Limit number of results', '20')\n .description('Show recent activity log')\n .action((options) => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const activity = getActivityLog(project.id, {\n entityType: options.type,\n action: options.action,\n limit: parseInt(options.limit, 10)\n });\n\n data(\n activity.map((a) => ({\n time: a.createdAt,\n type: a.entityType,\n action: a.action,\n entity: a.entityId.slice(0, 8) + '...',\n actor: a.actor ?? '-'\n })),\n [\n { header: 'Time', key: 'time', width: 20 },\n { header: 'Type', key: 'type', width: 12 },\n { header: 'Action', key: 'action', width: 12 },\n { header: 'Entity', key: 'entity', width: 12 },\n { header: 'Actor', key: 'actor', width: 15 }\n ],\n opts\n );\n });\n\n/**\n * Calculate duration string\n */\nfunction calculateDuration(start: string, end: string | null): string {\n const startDate = new Date(start);\n const endDate = end ? new Date(end) : new Date();\n\n const diffMs = endDate.getTime() - startDate.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) {\n return '<1m';\n } else if (diffMins < 60) {\n return `${diffMins}m`;\n } else {\n const hours = Math.floor(diffMins / 60);\n const mins = diffMins % 60;\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n}\n","/**\n * Session Service\n *\n * Manages AI work sessions for context continuity.\n * Tracks session duration, entities modified, and files changed.\n *\n * @author Vladimir K.S.\n */\n\nimport { queryOne, queryAll, run, generateId } from '../db/connection.js';\n\nexport interface Session {\n id: string;\n projectId: string;\n startedAt: string;\n endedAt: string | null;\n summary: string | null;\n entitiesModified: number;\n filesModified: number;\n status: 'active' | 'completed' | 'abandoned';\n}\n\nexport interface SessionSummary {\n id: string;\n startedAt: string;\n endedAt: string | null;\n duration: string;\n status: string;\n entitiesModified: number;\n filesModified: number;\n summary: string | null;\n}\n\n/**\n * Start a new session\n */\nexport function startSession(projectId: string): Session {\n // Check for existing active session\n const existing = queryOne<{ id: string }>(\n 'SELECT id FROM sessions WHERE project_id = ? AND status = ?',\n [projectId, 'active']\n );\n\n if (existing) {\n // End the existing session as abandoned\n run(\n `UPDATE sessions SET status = 'abandoned', ended_at = datetime('now') WHERE id = ?`,\n [existing.id]\n );\n }\n\n const sessionId = generateId();\n const now = new Date().toISOString();\n\n run(\n `INSERT INTO sessions (id, project_id, started_at, status, entities_modified, files_modified)\n VALUES (?, ?, ?, 'active', 0, 0)`,\n [sessionId, projectId, now]\n );\n\n return {\n id: sessionId,\n projectId,\n startedAt: now,\n endedAt: null,\n summary: null,\n entitiesModified: 0,\n filesModified: 0,\n status: 'active'\n };\n}\n\n/**\n * End the current active session\n */\nexport function endSession(projectId: string, summary?: string): Session | null {\n const session = queryOne<{\n id: string;\n started_at: string;\n entities_modified: number;\n files_modified: number;\n }>(\n 'SELECT id, started_at, entities_modified, files_modified FROM sessions WHERE project_id = ? AND status = ?',\n [projectId, 'active']\n );\n\n if (!session) {\n return null;\n }\n\n const now = new Date().toISOString();\n\n run(\n `UPDATE sessions SET status = 'completed', ended_at = ?, summary = ? WHERE id = ?`,\n [now, summary ?? null, session.id]\n );\n\n return {\n id: session.id,\n projectId,\n startedAt: session.started_at,\n endedAt: now,\n summary: summary ?? null,\n entitiesModified: session.entities_modified,\n filesModified: session.files_modified,\n status: 'completed'\n };\n}\n\n/**\n * Get the current active session\n */\nexport function getActiveSession(projectId: string): Session | null {\n const session = queryOne<{\n id: string;\n project_id: string;\n started_at: string;\n ended_at: string | null;\n summary: string | null;\n entities_modified: number;\n files_modified: number;\n status: string;\n }>(\n 'SELECT * FROM sessions WHERE project_id = ? AND status = ?',\n [projectId, 'active']\n );\n\n if (!session) {\n return null;\n }\n\n return {\n id: session.id,\n projectId: session.project_id,\n startedAt: session.started_at,\n endedAt: session.ended_at,\n summary: session.summary,\n entitiesModified: session.entities_modified,\n filesModified: session.files_modified,\n status: session.status as 'active'\n };\n}\n\n/**\n * Increment entity count for active session\n */\nexport function incrementSessionEntities(projectId: string, count: number = 1): void {\n run(\n `UPDATE sessions SET entities_modified = entities_modified + ? WHERE project_id = ? AND status = 'active'`,\n [count, projectId]\n );\n}\n\n/**\n * Increment file count for active session\n */\nexport function incrementSessionFiles(projectId: string, count: number = 1): void {\n run(\n `UPDATE sessions SET files_modified = files_modified + ? WHERE project_id = ? AND status = 'active'`,\n [count, projectId]\n );\n}\n\n/**\n * List sessions for a project\n */\nexport function listSessions(\n projectId: string,\n options: { status?: string; limit?: number } = {}\n): SessionSummary[] {\n let query = `\n SELECT id, started_at, ended_at, status, entities_modified, files_modified, summary\n FROM sessions\n WHERE project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n if (options.status) {\n query += ' AND status = ?';\n params.push(options.status);\n }\n\n query += ' ORDER BY started_at DESC';\n\n if (options.limit) {\n query += ' LIMIT ?';\n params.push(options.limit);\n }\n\n const sessions = queryAll<{\n id: string;\n started_at: string;\n ended_at: string | null;\n status: string;\n entities_modified: number;\n files_modified: number;\n summary: string | null;\n }>(query, params);\n\n return sessions.map((s) => ({\n id: s.id,\n startedAt: s.started_at,\n endedAt: s.ended_at,\n duration: calculateDuration(s.started_at, s.ended_at),\n status: s.status,\n entitiesModified: s.entities_modified,\n filesModified: s.files_modified,\n summary: s.summary\n }));\n}\n\n/**\n * Get session by ID\n */\nexport function getSession(sessionId: string): Session | null {\n const session = queryOne<{\n id: string;\n project_id: string;\n started_at: string;\n ended_at: string | null;\n summary: string | null;\n entities_modified: number;\n files_modified: number;\n status: string;\n }>('SELECT * FROM sessions WHERE id = ?', [sessionId]);\n\n if (!session) {\n return null;\n }\n\n return {\n id: session.id,\n projectId: session.project_id,\n startedAt: session.started_at,\n endedAt: session.ended_at,\n summary: session.summary,\n entitiesModified: session.entities_modified,\n filesModified: session.files_modified,\n status: session.status as Session['status']\n };\n}\n\n/**\n * Calculate human-readable duration\n */\nfunction calculateDuration(start: string, end: string | null): string {\n const startDate = new Date(start);\n const endDate = end ? new Date(end) : new Date();\n\n const diffMs = endDate.getTime() - startDate.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) {\n return '<1m';\n } else if (diffMins < 60) {\n return `${diffMins}m`;\n } else {\n const hours = Math.floor(diffMins / 60);\n const mins = diffMins % 60;\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n}\n","/**\n * Activity Logger Service\n *\n * Logs all entity changes for audit trail and AI context.\n * Tracks create, update, delete, and transition actions.\n *\n * @author Vladimir K.S.\n */\n\nimport { queryAll, run, generateId } from '../db/connection.js';\nimport { incrementSessionEntities } from './session-service.js';\n\nexport type EntityType = 'initiative' | 'epic' | 'story' | 'task' | 'bug' | 'sprint' | 'document' | 'component' | 'version' | 'persona' | 'ux_journey';\nexport type ActionType = 'create' | 'update' | 'delete' | 'transition' | 'link' | 'unlink';\n\nexport interface ActivityEntry {\n id: string;\n projectId: string;\n entityType: EntityType;\n entityId: string;\n action: ActionType;\n oldValue: string | null;\n newValue: string | null;\n actor: string | null;\n createdAt: string;\n}\n\nexport interface ActivityLogOptions {\n entityType?: EntityType;\n entityId?: string;\n action?: ActionType;\n limit?: number;\n since?: string;\n}\n\n/**\n * Log an activity\n */\nexport function logActivity(\n projectId: string,\n entityType: EntityType,\n entityId: string,\n action: ActionType,\n options: {\n oldValue?: string | Record<string, unknown>;\n newValue?: string | Record<string, unknown>;\n actor?: string;\n } = {}\n): void {\n const id = generateId();\n\n const oldVal = options.oldValue\n ? typeof options.oldValue === 'string'\n ? options.oldValue\n : JSON.stringify(options.oldValue)\n : null;\n\n const newVal = options.newValue\n ? typeof options.newValue === 'string'\n ? options.newValue\n : JSON.stringify(options.newValue)\n : null;\n\n run(\n `INSERT INTO activity_log (id, project_id, entity_type, entity_id, action, old_value, new_value, actor)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, projectId, entityType, entityId, action, oldVal, newVal, options.actor ?? null]\n );\n\n // Increment session entity count\n incrementSessionEntities(projectId, 1);\n}\n\n/**\n * Log a create action\n */\nexport function logCreate(\n projectId: string,\n entityType: EntityType,\n entityId: string,\n data: Record<string, unknown>,\n actor?: string\n): void {\n logActivity(projectId, entityType, entityId, 'create', {\n newValue: data,\n actor\n });\n}\n\n/**\n * Log an update action\n */\nexport function logUpdate(\n projectId: string,\n entityType: EntityType,\n entityId: string,\n changes: { field: string; oldValue: unknown; newValue: unknown }[],\n actor?: string\n): void {\n const oldValue: Record<string, unknown> = {};\n const newValue: Record<string, unknown> = {};\n\n for (const change of changes) {\n oldValue[change.field] = change.oldValue;\n newValue[change.field] = change.newValue;\n }\n\n logActivity(projectId, entityType, entityId, 'update', {\n oldValue,\n newValue,\n actor\n });\n}\n\n/**\n * Log a transition action\n */\nexport function logTransition(\n projectId: string,\n entityType: EntityType,\n entityId: string,\n oldStatus: string,\n newStatus: string,\n actor?: string\n): void {\n logActivity(projectId, entityType, entityId, 'transition', {\n oldValue: oldStatus,\n newValue: newStatus,\n actor\n });\n}\n\n/**\n * Log a delete action\n */\nexport function logDelete(\n projectId: string,\n entityType: EntityType,\n entityId: string,\n data: Record<string, unknown>,\n actor?: string\n): void {\n logActivity(projectId, entityType, entityId, 'delete', {\n oldValue: data,\n actor\n });\n}\n\n/**\n * Get activity log entries\n */\nexport function getActivityLog(\n projectId: string,\n options: ActivityLogOptions = {}\n): ActivityEntry[] {\n let query = `\n SELECT id, project_id, entity_type, entity_id, action, old_value, new_value, actor, created_at\n FROM activity_log\n WHERE project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n if (options.entityType) {\n query += ' AND entity_type = ?';\n params.push(options.entityType);\n }\n\n if (options.entityId) {\n query += ' AND entity_id = ?';\n params.push(options.entityId);\n }\n\n if (options.action) {\n query += ' AND action = ?';\n params.push(options.action);\n }\n\n if (options.since) {\n query += ' AND created_at >= ?';\n params.push(options.since);\n }\n\n query += ' ORDER BY created_at DESC';\n\n if (options.limit) {\n query += ' LIMIT ?';\n params.push(options.limit);\n }\n\n const entries = queryAll<{\n id: string;\n project_id: string;\n entity_type: string;\n entity_id: string;\n action: string;\n old_value: string | null;\n new_value: string | null;\n actor: string | null;\n created_at: string;\n }>(query, params);\n\n return entries.map((e) => ({\n id: e.id,\n projectId: e.project_id,\n entityType: e.entity_type as EntityType,\n entityId: e.entity_id,\n action: e.action as ActionType,\n oldValue: e.old_value,\n newValue: e.new_value,\n actor: e.actor,\n createdAt: e.created_at\n }));\n}\n\n/**\n * Get activity summary for a project\n */\nexport function getActivitySummary(\n projectId: string,\n since?: string\n): {\n totalActions: number;\n creates: number;\n updates: number;\n deletes: number;\n transitions: number;\n byEntityType: Record<string, number>;\n} {\n let query = `\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN action = 'create' THEN 1 ELSE 0 END) as creates,\n SUM(CASE WHEN action = 'update' THEN 1 ELSE 0 END) as updates,\n SUM(CASE WHEN action = 'delete' THEN 1 ELSE 0 END) as deletes,\n SUM(CASE WHEN action = 'transition' THEN 1 ELSE 0 END) as transitions\n FROM activity_log\n WHERE project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n if (since) {\n query += ' AND created_at >= ?';\n params.push(since);\n }\n\n const stats = queryAll<{\n total: number;\n creates: number;\n updates: number;\n deletes: number;\n transitions: number;\n }>(query, params)[0] ?? { total: 0, creates: 0, updates: 0, deletes: 0, transitions: 0 };\n\n // Get counts by entity type\n let typeQuery = `\n SELECT entity_type, COUNT(*) as count\n FROM activity_log\n WHERE project_id = ?\n `;\n const typeParams: unknown[] = [projectId];\n\n if (since) {\n typeQuery += ' AND created_at >= ?';\n typeParams.push(since);\n }\n\n typeQuery += ' GROUP BY entity_type';\n\n const typeCounts = queryAll<{ entity_type: string; count: number }>(typeQuery, typeParams);\n const byEntityType: Record<string, number> = {};\n for (const tc of typeCounts) {\n byEntityType[tc.entity_type] = tc.count;\n }\n\n return {\n totalActions: stats.total,\n creates: stats.creates,\n updates: stats.updates,\n deletes: stats.deletes,\n transitions: stats.transitions,\n byEntityType\n };\n}\n\n/**\n * Get recent activity for an entity\n */\nexport function getEntityHistory(\n entityType: EntityType,\n entityId: string,\n limit: number = 10\n): ActivityEntry[] {\n const entries = queryAll<{\n id: string;\n project_id: string;\n entity_type: string;\n entity_id: string;\n action: string;\n old_value: string | null;\n new_value: string | null;\n actor: string | null;\n created_at: string;\n }>(\n `SELECT * FROM activity_log WHERE entity_type = ? AND entity_id = ? ORDER BY created_at DESC LIMIT ?`,\n [entityType, entityId, limit]\n );\n\n return entries.map((e) => ({\n id: e.id,\n projectId: e.project_id,\n entityType: e.entity_type as EntityType,\n entityId: e.entity_id,\n action: e.action as ActionType,\n oldValue: e.old_value,\n newValue: e.new_value,\n actor: e.actor,\n createdAt: e.created_at\n }));\n}\n","/**\n * Context Command\n *\n * Progressive context loading for AI agents.\n * Provides structured project context at different detail levels.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryOne } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n loadContext,\n getEntityContext,\n getResumeContext,\n ContextLevel\n} from '../services/context-loader.js';\n\nexport const contextCommand = new Command('context')\n .description('Load project context for AI agents');\n\n// Load context at specified level\ncontextCommand\n .command('load')\n .option('-l, --level <level>', 'Context level (minimal/summary/standard/full)', 'standard')\n .description('Load project context at specified detail level')\n .action((options) => {\n const opts = getOutputOptions(contextCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const validLevels: ContextLevel[] = ['minimal', 'summary', 'standard', 'full'];\n if (!validLevels.includes(options.level as ContextLevel)) {\n error(`Invalid level. Valid values: ${validLevels.join(', ')}`, opts);\n process.exit(1);\n }\n\n const context = loadContext(project.id, options.level as ContextLevel);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: context }));\n } else {\n // Human-readable output\n console.log(`\\n=== Project Context (${context.level}) ===\\n`);\n\n console.log(`Project: ${context.project.name} (${context.project.key})`);\n console.log(`Path: ${context.project.path}`);\n console.log(`Session: ${context.session.active ? `Active (${context.session.duration})` : 'None'}`);\n\n if ('counts' in context) {\n console.log('\\nEntity Counts:');\n console.log(` Initiatives: ${context.counts.initiatives}`);\n console.log(` Epics: ${context.counts.epics}`);\n console.log(` Stories: ${context.counts.stories}`);\n console.log(` Tasks: ${context.counts.tasks}`);\n console.log(` Bugs: ${context.counts.bugs}`);\n console.log(` Documents: ${context.counts.documents}`);\n console.log(` Comments: ${context.counts.comments}`);\n\n console.log('\\nRecent Activity (24h):');\n console.log(` Total: ${context.recentActivity.totalActions}`);\n console.log(` Creates: ${context.recentActivity.creates}`);\n console.log(` Updates: ${context.recentActivity.updates}`);\n console.log(` Transitions: ${context.recentActivity.transitions}`);\n }\n\n if ('activeSprint' in context && context.activeSprint) {\n console.log('\\nActive Sprint:');\n console.log(` Name: ${context.activeSprint.name}`);\n console.log(` Goal: ${context.activeSprint.goal ?? '-'}`);\n console.log(` Stories: ${context.activeSprint.storiesCount}`);\n console.log(` Tasks: ${context.activeSprint.tasksCount}`);\n }\n\n if ('inProgress' in context) {\n const total =\n context.inProgress.stories.length +\n context.inProgress.tasks.length +\n context.inProgress.bugs.length;\n console.log(`\\nIn Progress: ${total} items`);\n\n if (context.inProgress.stories.length > 0) {\n console.log(' Stories:');\n for (const s of context.inProgress.stories.slice(0, 5)) {\n console.log(` - ${s.key}: ${s.summary}`);\n }\n }\n\n if (context.blockers.length > 0) {\n console.log(`\\nBlockers: ${context.blockers.length}`);\n for (const b of context.blockers) {\n console.log(` - ${b.key}: ${b.summary}`);\n }\n }\n }\n\n if ('initiatives' in context) {\n console.log(`\\nInitiatives: ${context.initiatives.length}`);\n for (const i of context.initiatives.slice(0, 5)) {\n console.log(` - ${i.key}: ${i.summary} (${i.status})`);\n }\n\n console.log(`\\nEpics: ${context.epics.length}`);\n for (const e of context.epics.slice(0, 5)) {\n console.log(` - ${e.key}: ${e.summary} (${e.status})`);\n }\n\n if (context.pendingComments.length > 0) {\n console.log(`\\nPending Comments: ${context.pendingComments.length}`);\n for (const c of context.pendingComments.slice(0, 5)) {\n console.log(` - ${c.path}:${c.line} [${c.type}]: ${c.content.slice(0, 50)}...`);\n }\n }\n }\n\n console.log('');\n }\n });\n\n// Get resume context for continuing work\ncontextCommand\n .command('resume')\n .description('Get context for resuming work from previous session')\n .action(() => {\n const opts = getOutputOptions(contextCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const resumeContext = getResumeContext(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: resumeContext }));\n } else {\n console.log('\\n=== Resume Context ===\\n');\n\n if (resumeContext.lastSession) {\n console.log('Last Session:');\n console.log(` Ended: ${resumeContext.lastSession.endedAt}`);\n console.log(` Summary: ${resumeContext.lastSession.summary ?? '-'}`);\n console.log(` Entities Modified: ${resumeContext.lastSession.entitiesModified}`);\n } else {\n console.log('No previous session found.');\n }\n\n console.log('\\nRecent Changes:');\n if (resumeContext.recentChanges.length > 0) {\n for (const change of resumeContext.recentChanges) {\n console.log(` - ${change.action} ${change.entityType} ${change.entityKey}`);\n }\n } else {\n console.log(' None');\n }\n\n console.log('\\nPending Work:');\n console.log(` In Progress: ${resumeContext.pendingWork.inProgressCount}`);\n console.log(` Blocked: ${resumeContext.pendingWork.blockedCount}`);\n console.log(` Unresolved Comments: ${resumeContext.pendingWork.unresolvedComments}`);\n\n console.log('');\n }\n });\n\n// Get entity-specific context\ncontextCommand\n .command('entity')\n .argument('<type>', 'Entity type (initiative/epic/story/task/bug)')\n .argument('<key>', 'Entity key')\n .description('Get detailed context for a specific entity')\n .action((type: string, key: string) => {\n const opts = getOutputOptions(contextCommand);\n\n const validTypes = ['initiative', 'epic', 'story', 'task', 'bug'];\n if (!validTypes.includes(type)) {\n error(`Invalid entity type. Valid values: ${validTypes.join(', ')}`, opts);\n process.exit(1);\n }\n\n const entity = getEntityContext(type, key);\n\n if (!entity) {\n error(`${type} \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: entity }));\n } else {\n console.log(`\\n=== ${type.charAt(0).toUpperCase() + type.slice(1)}: ${key} ===\\n`);\n\n // Display common fields\n const displayFields = ['key', 'summary', 'description', 'status', 'priority', 'assignee', 'created_at', 'updated_at'];\n for (const field of displayFields) {\n if (entity[field] !== undefined && entity[field] !== null) {\n const label = field.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n console.log(`${label}: ${entity[field]}`);\n }\n }\n\n // Display recent activity\n const activity = entity.recentActivity as Array<{ action: string; createdAt: string }>;\n if (activity && activity.length > 0) {\n console.log('\\nRecent Activity:');\n for (const a of activity.slice(0, 5)) {\n console.log(` - ${a.action} at ${a.createdAt}`);\n }\n }\n\n console.log('');\n }\n });\n\n// Quick summary for AI\ncontextCommand\n .command('quick')\n .description('Quick context summary optimized for AI agents')\n .action(() => {\n const opts = getOutputOptions(contextCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Get summary context (cast since we explicitly request 'summary' level)\n const context = loadContext(project.id, 'summary') as import('../services/context-loader.js').SummaryContext;\n\n // Build quick summary\n const quick = {\n project: `${context.project.name} (${context.project.key})`,\n session: context.session.active ? `Active ${context.session.duration}` : 'Inactive',\n entities: `${context.counts.initiatives}I/${context.counts.epics}E/${context.counts.stories}S/${context.counts.tasks}T/${context.counts.bugs}B`,\n docs: `${context.counts.documents} files, ${context.counts.comments} comments`,\n activity24h: `${context.recentActivity.totalActions} actions`\n };\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: quick }));\n } else {\n console.log(`Project: ${quick.project}`);\n console.log(`Session: ${quick.session}`);\n console.log(`Entities: ${quick.entities}`);\n console.log(`Documents: ${quick.docs}`);\n console.log(`Activity (24h): ${quick.activity24h}`);\n }\n });\n","/**\n * Context Loader Service\n *\n * Provides progressive context loading for AI agents.\n * Builds structured context packages at different detail levels.\n *\n * Levels:\n * - minimal: Project info + current session only\n * - summary: + entity counts + recent activity\n * - standard: + active sprint + in-progress items\n * - full: + all entities + documents + comments\n *\n * @author Vladimir K.S.\n */\n\nimport { queryOne, queryAll } from '../db/connection.js';\nimport { getActiveSession, listSessions } from './session-service.js';\nimport { getActivityLog, getActivitySummary } from './activity-logger.js';\nimport { getSyncStatus } from './file-scanner.js';\nimport { getCommentStats } from './comment-parser.js';\n\nexport type ContextLevel = 'minimal' | 'summary' | 'standard' | 'full';\n\nexport interface MinimalContext {\n level: 'minimal';\n project: {\n key: string;\n name: string;\n path: string;\n };\n session: {\n active: boolean;\n id?: string;\n startedAt?: string;\n duration?: string;\n };\n}\n\nexport interface SummaryContext extends Omit<MinimalContext, 'level'> {\n level: 'summary';\n counts: {\n initiatives: number;\n epics: number;\n stories: number;\n tasks: number;\n bugs: number;\n documents: number;\n comments: number;\n };\n recentActivity: {\n totalActions: number;\n creates: number;\n updates: number;\n transitions: number;\n };\n}\n\nexport interface StandardContext extends Omit<SummaryContext, 'level'> {\n level: 'standard';\n activeSprint: {\n name: string;\n goal: string | null;\n startDate: string;\n endDate: string;\n storiesCount: number;\n tasksCount: number;\n } | null;\n inProgress: {\n stories: Array<{ key: string; summary: string; assignee: string | null }>;\n tasks: Array<{ key: string; summary: string; assignee: string | null }>;\n bugs: Array<{ key: string; summary: string; severity: string }>;\n };\n blockers: Array<{\n key: string;\n type: string;\n summary: string;\n reason: string | null;\n }>;\n}\n\nexport interface FullContext extends Omit<StandardContext, 'level'> {\n level: 'full';\n initiatives: Array<{\n key: string;\n summary: string;\n status: string;\n epicCount: number;\n }>;\n epics: Array<{\n key: string;\n summary: string;\n status: string;\n initiative: string | null;\n storyCount: number;\n }>;\n backlog: {\n stories: Array<{ key: string; summary: string; points: number | null; epic: string | null }>;\n tasks: Array<{ key: string; summary: string; story: string | null }>;\n };\n documents: {\n total: number;\n modified: number;\n withComments: number;\n recentlyChanged: Array<{ path: string; status: string }>;\n };\n pendingComments: Array<{\n path: string;\n line: number;\n type: string;\n content: string;\n }>;\n}\n\nexport type Context = MinimalContext | SummaryContext | StandardContext | FullContext;\n\n/**\n * Load context at specified level\n */\nexport function loadContext(projectId: string, level: ContextLevel = 'standard'): Context {\n // Get project info\n const project = queryOne<{\n key: string;\n name: string;\n path: string;\n }>('SELECT key, name, path FROM projects WHERE id = ?', [projectId]);\n\n if (!project) {\n throw new Error('Project not found');\n }\n\n // Get session info\n const session = getActiveSession(projectId);\n const sessionInfo = session\n ? {\n active: true,\n id: session.id,\n startedAt: session.startedAt,\n duration: calculateDuration(session.startedAt)\n }\n : { active: false };\n\n // Minimal context\n const minimal: MinimalContext = {\n level: 'minimal',\n project: {\n key: project.key,\n name: project.name,\n path: project.path\n },\n session: sessionInfo\n };\n\n if (level === 'minimal') {\n return minimal;\n }\n\n // Get entity counts\n const counts = getEntityCounts(projectId);\n const activitySummary = getActivitySummary(projectId, getLastDayTimestamp());\n\n // Summary context\n const summary: SummaryContext = {\n ...minimal,\n level: 'summary',\n counts,\n recentActivity: {\n totalActions: activitySummary.totalActions,\n creates: activitySummary.creates,\n updates: activitySummary.updates,\n transitions: activitySummary.transitions\n }\n };\n\n if (level === 'summary') {\n return summary;\n }\n\n // Get active sprint\n const activeSprint = getActiveSprint(projectId);\n\n // Get in-progress items\n const inProgress = getInProgressItems(projectId);\n\n // Get blockers\n const blockers = getBlockers(projectId);\n\n // Standard context\n const standard: StandardContext = {\n ...summary,\n level: 'standard',\n activeSprint,\n inProgress,\n blockers\n };\n\n if (level === 'standard') {\n return standard;\n }\n\n // Full context\n const initiatives = getInitiatives(projectId);\n const epics = getEpics(projectId);\n const backlog = getBacklogItems(projectId);\n const documents = getDocumentsSummary(projectId);\n const pendingComments = getPendingComments(projectId);\n\n const full: FullContext = {\n ...standard,\n level: 'full',\n initiatives,\n epics,\n backlog,\n documents,\n pendingComments\n };\n\n return full;\n}\n\n/**\n * Get entity counts\n */\nfunction getEntityCounts(projectId: string): SummaryContext['counts'] {\n const initiatives = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM initiatives WHERE project_id = ?',\n [projectId]\n );\n const epics = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM epics WHERE project_id = ?',\n [projectId]\n );\n const stories = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM user_stories WHERE project_id = ?',\n [projectId]\n );\n const tasks = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM tasks WHERE project_id = ?',\n [projectId]\n );\n const bugs = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM bugs WHERE project_id = ?',\n [projectId]\n );\n\n const syncStatus = getSyncStatus(projectId);\n const commentStats = getCommentStats(projectId);\n\n return {\n initiatives: initiatives?.count ?? 0,\n epics: epics?.count ?? 0,\n stories: stories?.count ?? 0,\n tasks: tasks?.count ?? 0,\n bugs: bugs?.count ?? 0,\n documents: syncStatus.total,\n comments: commentStats.totalComments\n };\n}\n\n/**\n * Get active sprint info\n */\nfunction getActiveSprint(projectId: string): StandardContext['activeSprint'] {\n const sprint = queryOne<{\n id: string;\n name: string;\n goal: string | null;\n start_date: string;\n end_date: string;\n }>(\n `SELECT id, name, goal, start_date, end_date FROM sprints\n WHERE project_id = ? AND status = 'active'\n ORDER BY start_date DESC LIMIT 1`,\n [projectId]\n );\n\n if (!sprint) {\n return null;\n }\n\n const storiesCount = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM user_stories WHERE sprint_id = ?',\n [sprint.id]\n );\n const tasksCount = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM tasks WHERE sprint_id = ?',\n [sprint.id]\n );\n\n return {\n name: sprint.name,\n goal: sprint.goal,\n startDate: sprint.start_date,\n endDate: sprint.end_date,\n storiesCount: storiesCount?.count ?? 0,\n tasksCount: tasksCount?.count ?? 0\n };\n}\n\n/**\n * Get in-progress items\n */\nfunction getInProgressItems(projectId: string): StandardContext['inProgress'] {\n const stories = queryAll<{ key: string; summary: string; assignee: string | null }>(\n `SELECT key, summary, assignee FROM user_stories\n WHERE project_id = ? AND status = 'in_progress'\n ORDER BY updated_at DESC LIMIT 10`,\n [projectId]\n );\n\n const tasks = queryAll<{ key: string; summary: string; assignee: string | null }>(\n `SELECT key, summary, assignee FROM tasks\n WHERE project_id = ? AND status = 'in_progress'\n ORDER BY updated_at DESC LIMIT 10`,\n [projectId]\n );\n\n const bugs = queryAll<{ key: string; summary: string; severity: string }>(\n `SELECT key, summary, severity FROM bugs\n WHERE project_id = ? AND status = 'in_progress'\n ORDER BY updated_at DESC LIMIT 10`,\n [projectId]\n );\n\n return { stories, tasks, bugs };\n}\n\n/**\n * Get blocked items\n */\nfunction getBlockers(projectId: string): StandardContext['blockers'] {\n const blockedTasks = queryAll<{\n key: string;\n summary: string;\n blocked_reason: string | null;\n }>(\n `SELECT key, summary, blocked_reason FROM tasks\n WHERE project_id = ? AND status = 'blocked'\n ORDER BY updated_at DESC`,\n [projectId]\n );\n\n return blockedTasks.map((t) => ({\n key: t.key,\n type: 'task',\n summary: t.summary,\n reason: t.blocked_reason\n }));\n}\n\n/**\n * Get initiatives summary\n */\nfunction getInitiatives(projectId: string): FullContext['initiatives'] {\n return queryAll<{\n key: string;\n summary: string;\n status: string;\n epicCount: number;\n }>(\n `SELECT i.key, i.summary, i.status,\n (SELECT COUNT(*) FROM epics WHERE initiative_id = i.id) as epicCount\n FROM initiatives i\n WHERE i.project_id = ?\n ORDER BY i.created_at DESC`,\n [projectId]\n );\n}\n\n/**\n * Get epics summary\n */\nfunction getEpics(projectId: string): FullContext['epics'] {\n return queryAll<{\n key: string;\n summary: string;\n status: string;\n initiative: string | null;\n storyCount: number;\n }>(\n `SELECT e.key, e.summary, e.status,\n i.key as initiative,\n (SELECT COUNT(*) FROM user_stories WHERE epic_id = e.id) as storyCount\n FROM epics e\n LEFT JOIN initiatives i ON e.initiative_id = i.id\n WHERE e.project_id = ?\n ORDER BY e.created_at DESC`,\n [projectId]\n );\n}\n\n/**\n * Get backlog items\n */\nfunction getBacklogItems(projectId: string): FullContext['backlog'] {\n const stories = queryAll<{\n key: string;\n summary: string;\n points: number | null;\n epic: string | null;\n }>(\n `SELECT s.key, s.summary, s.story_points as points, e.key as epic\n FROM user_stories s\n LEFT JOIN epics e ON s.epic_id = e.id\n WHERE s.project_id = ? AND s.status = 'backlog'\n ORDER BY s.priority, s.created_at DESC\n LIMIT 20`,\n [projectId]\n );\n\n const tasks = queryAll<{\n key: string;\n summary: string;\n story: string | null;\n }>(\n `SELECT t.key, t.summary, s.key as story\n FROM tasks t\n LEFT JOIN user_stories s ON t.story_id = s.id\n WHERE t.project_id = ? AND t.status = 'todo'\n ORDER BY t.priority, t.created_at DESC\n LIMIT 20`,\n [projectId]\n );\n\n return { stories, tasks };\n}\n\n/**\n * Get documents summary\n */\nfunction getDocumentsSummary(projectId: string): FullContext['documents'] {\n const syncStatus = getSyncStatus(projectId);\n const commentStats = getCommentStats(projectId);\n\n const recentlyChanged = queryAll<{ path: string; status: string }>(\n `SELECT path, status FROM documents\n WHERE project_id = ? AND status IN ('modified', 'tracked')\n ORDER BY last_scanned_at DESC LIMIT 10`,\n [projectId]\n );\n\n return {\n total: syncStatus.total,\n modified: syncStatus.modified,\n withComments: commentStats.documentsWithComments,\n recentlyChanged\n };\n}\n\n/**\n * Get pending comments\n */\nfunction getPendingComments(projectId: string): FullContext['pendingComments'] {\n return queryAll<{\n path: string;\n line: number;\n type: string;\n content: string;\n }>(\n `SELECT d.path, dc.line_number as line, dc.marker_type as type, dc.content\n FROM doc_comments dc\n JOIN documents d ON dc.document_id = d.id\n WHERE d.project_id = ? AND dc.resolved = 0\n ORDER BY d.path, dc.line_number\n LIMIT 50`,\n [projectId]\n );\n}\n\n/**\n * Get specific entity context\n */\nexport function getEntityContext(\n entityType: string,\n entityKey: string\n): Record<string, unknown> | null {\n const tableMap: Record<string, string> = {\n initiative: 'initiatives',\n epic: 'epics',\n story: 'user_stories',\n task: 'tasks',\n bug: 'bugs'\n };\n\n const table = tableMap[entityType];\n if (!table) {\n return null;\n }\n\n const entity = queryOne<Record<string, unknown>>(\n `SELECT * FROM ${table} WHERE key = ?`,\n [entityKey]\n );\n\n if (!entity) {\n return null;\n }\n\n // Get related activity\n const activity = getActivityLog(entity.project_id as string, {\n entityId: entity.id as string,\n limit: 10\n });\n\n return {\n ...entity,\n recentActivity: activity\n };\n}\n\n/**\n * Get resume context for continuing work\n */\nexport function getResumeContext(projectId: string): {\n lastSession: {\n endedAt: string;\n summary: string | null;\n entitiesModified: number;\n } | null;\n recentChanges: Array<{\n entityType: string;\n entityKey: string;\n action: string;\n timestamp: string;\n }>;\n pendingWork: {\n inProgressCount: number;\n blockedCount: number;\n unresolvedComments: number;\n };\n} {\n // Get last completed session\n const sessions = listSessions(projectId, { status: 'completed', limit: 1 });\n const lastSession = sessions[0]\n ? {\n endedAt: sessions[0].endedAt ?? '',\n summary: sessions[0].summary,\n entitiesModified: sessions[0].entitiesModified\n }\n : null;\n\n // Get recent changes with entity keys\n const recentActivity = queryAll<{\n entity_type: string;\n entity_id: string;\n action: string;\n created_at: string;\n }>(\n `SELECT entity_type, entity_id, action, created_at\n FROM activity_log\n WHERE project_id = ?\n ORDER BY created_at DESC\n LIMIT 10`,\n [projectId]\n );\n\n // Map entity IDs to keys\n const recentChanges = recentActivity.map((a) => {\n const key = getEntityKey(a.entity_type, a.entity_id);\n return {\n entityType: a.entity_type,\n entityKey: key ?? a.entity_id.slice(0, 8),\n action: a.action,\n timestamp: a.created_at\n };\n });\n\n // Get pending work counts\n const inProgress = queryOne<{ count: number }>(\n `SELECT COUNT(*) as count FROM (\n SELECT id FROM user_stories WHERE project_id = ? AND status = 'in_progress'\n UNION ALL\n SELECT id FROM tasks WHERE project_id = ? AND status = 'in_progress'\n )`,\n [projectId, projectId]\n );\n\n const blocked = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM tasks WHERE project_id = ? AND status = ?',\n [projectId, 'blocked']\n );\n\n const commentStats = getCommentStats(projectId);\n\n return {\n lastSession,\n recentChanges,\n pendingWork: {\n inProgressCount: inProgress?.count ?? 0,\n blockedCount: blocked?.count ?? 0,\n unresolvedComments: commentStats.totalComments\n }\n };\n}\n\n/**\n * Get entity key from ID\n */\nfunction getEntityKey(entityType: string, entityId: string): string | null {\n const tableMap: Record<string, string> = {\n initiative: 'initiatives',\n epic: 'epics',\n story: 'user_stories',\n task: 'tasks',\n bug: 'bugs'\n };\n\n const table = tableMap[entityType];\n if (!table) {\n return null;\n }\n\n const entity = queryOne<{ key: string }>(`SELECT key FROM ${table} WHERE id = ?`, [entityId]);\n return entity?.key ?? null;\n}\n\n/**\n * Calculate duration string\n */\nfunction calculateDuration(start: string): string {\n const startDate = new Date(start);\n const now = new Date();\n const diffMs = now.getTime() - startDate.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) return '<1m';\n if (diffMins < 60) return `${diffMins}m`;\n\n const hours = Math.floor(diffMins / 60);\n const mins = diffMins % 60;\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n}\n\n/**\n * Get timestamp for 24 hours ago\n */\nfunction getLastDayTimestamp(): string {\n const date = new Date();\n date.setDate(date.getDate() - 1);\n return date.toISOString();\n}\n","/**\n * Query Command\n *\n * Unified search and filtering across all entity types.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryOne } from '../db/connection.js';\nimport {\n error,\n data,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n search,\n searchByKey,\n findByAssignee,\n findRecentlyUpdated,\n findByStatus,\n findRelated,\n getQueryStats,\n EntityType,\n QueryFilters\n} from '../services/query-service.js';\n\nexport const queryCommand = new Command('query')\n .alias('q')\n .description('Search and filter across all entities');\n\n// Main search command\nqueryCommand\n .command('search')\n .alias('s')\n .argument('[text]', 'Text to search for in summary/key')\n .option('-t, --type <type>', 'Entity type (initiative/epic/story/task/bug/all)', 'all')\n .option('-s, --status <status>', 'Filter by status (comma-separated for multiple)')\n .option('-p, --priority <priority>', 'Filter by priority (comma-separated for multiple)')\n .option('-a, --assignee <assignee>', 'Filter by assignee')\n .option('-e, --epic <key>', 'Filter by epic key')\n .option('--sprint <name>', 'Filter by sprint name')\n .option('--since <date>', 'Filter by updated since date (YYYY-MM-DD)')\n .option('-n, --limit <n>', 'Limit results', '20')\n .description('Search entities with filters')\n .action((text, options) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const validTypes: EntityType[] = ['initiative', 'epic', 'story', 'task', 'bug', 'all'];\n if (!validTypes.includes(options.type as EntityType)) {\n error(`Invalid type. Valid values: ${validTypes.join(', ')}`, opts);\n process.exit(1);\n }\n\n const filters: QueryFilters = {\n text,\n status: options.status?.split(','),\n priority: options.priority?.split(','),\n assignee: options.assignee,\n epic: options.epic,\n sprint: options.sprint,\n updatedAfter: options.since,\n limit: parseInt(options.limit, 10)\n };\n\n const results = search(project.id, options.type as EntityType, filters);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary.slice(0, 50) + (r.summary.length > 50 ? '...' : ''),\n status: r.status,\n priority: r.priority,\n assignee: r.assignee ?? '-',\n parent: r.parent ?? '-'\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 40 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Priority', key: 'priority', width: 10 },\n { header: 'Assignee', key: 'assignee', width: 12 },\n { header: 'Parent', key: 'parent', width: 10 }\n ],\n opts\n );\n });\n\n// Quick key search\nqueryCommand\n .command('key')\n .argument('<pattern>', 'Key pattern to search for')\n .description('Quick search by key pattern')\n .action((pattern: string) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const results = searchByKey(project.id, pattern);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary,\n status: r.status\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 50 },\n { header: 'Status', key: 'status', width: 12 }\n ],\n opts\n );\n });\n\n// Find by assignee\nqueryCommand\n .command('assignee')\n .argument('<name>', 'Assignee name')\n .description('Find items assigned to a person')\n .action((name: string) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const results = findByAssignee(project.id, name);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary.slice(0, 50),\n status: r.status,\n priority: r.priority,\n assignee: r.assignee ?? '-'\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 50 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Priority', key: 'priority', width: 10 },\n { header: 'Assignee', key: 'assignee', width: 12 }\n ],\n opts\n );\n });\n\n// Find recent changes\nqueryCommand\n .command('recent')\n .option('-h, --hours <n>', 'Hours to look back', '24')\n .description('Find recently updated items')\n .action((options) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const hours = parseInt(options.hours, 10);\n const results = findRecentlyUpdated(project.id, hours);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary.slice(0, 40),\n status: r.status,\n updated: r.updatedAt\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 40 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Updated', key: 'updated', width: 20 }\n ],\n opts\n );\n });\n\n// Find by status\nqueryCommand\n .command('status')\n .argument('<status>', 'Status to filter by (comma-separated for multiple)')\n .option('-t, --type <type>', 'Entity type (initiative/epic/story/task/bug/all)', 'all')\n .description('Find items by status')\n .action((status: string, options) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const statuses = status.split(',');\n const results = findByStatus(project.id, statuses, options.type as EntityType);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary.slice(0, 50),\n status: r.status,\n assignee: r.assignee ?? '-'\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 50 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Assignee', key: 'assignee', width: 12 }\n ],\n opts\n );\n });\n\n// Find related items\nqueryCommand\n .command('related')\n .argument('<type>', 'Entity type (initiative/epic/story)')\n .argument('<key>', 'Entity key')\n .description('Find items related to an entity')\n .action((type: string, key: string) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const validTypes = ['initiative', 'epic', 'story'];\n if (!validTypes.includes(type)) {\n error(`Invalid type. Valid values: ${validTypes.join(', ')}`, opts);\n process.exit(1);\n }\n\n const results = findRelated(project.id, type, key);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary.slice(0, 50),\n status: r.status,\n parent: r.parent ?? '-'\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 50 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Parent', key: 'parent', width: 10 }\n ],\n opts\n );\n });\n\n// Statistics\nqueryCommand\n .command('stats')\n .description('Show query statistics for the project')\n .action(() => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const stats = getQueryStats(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: stats }));\n } else {\n console.log(`\\nTotal Items: ${stats.total}\\n`);\n\n console.log('By Type:');\n for (const [type, count] of Object.entries(stats.byType)) {\n console.log(` ${type}: ${count}`);\n }\n\n console.log('\\nBy Status:');\n for (const [status, count] of Object.entries(stats.byStatus)) {\n console.log(` ${status}: ${count}`);\n }\n console.log('');\n }\n });\n","/**\n * Query Service\n *\n * Unified search and filtering across all entity types.\n * Supports text search, status/priority filters, and date queries.\n *\n * @author Vladimir K.S.\n */\n\nimport { queryAll } from '../db/connection.js';\n\nexport type EntityType = 'initiative' | 'epic' | 'story' | 'task' | 'bug' | 'all';\n\nexport interface QueryFilters {\n text?: string;\n status?: string | string[];\n priority?: string | string[];\n assignee?: string;\n labels?: string[];\n sprint?: string;\n epic?: string;\n createdAfter?: string;\n updatedAfter?: string;\n limit?: number;\n}\n\nexport interface QueryResult {\n type: string;\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n createdAt: string;\n updatedAt: string;\n parent?: string;\n extra?: Record<string, unknown>;\n}\n\nexport interface QueryStats {\n total: number;\n byType: Record<string, number>;\n byStatus: Record<string, number>;\n}\n\n/**\n * Search across entities\n */\nexport function search(\n projectId: string,\n entityType: EntityType,\n filters: QueryFilters = {}\n): QueryResult[] {\n const results: QueryResult[] = [];\n const limit = filters.limit ?? 50;\n\n if (entityType === 'all' || entityType === 'initiative') {\n results.push(...searchInitiatives(projectId, filters));\n }\n\n if (entityType === 'all' || entityType === 'epic') {\n results.push(...searchEpics(projectId, filters));\n }\n\n if (entityType === 'all' || entityType === 'story') {\n results.push(...searchStories(projectId, filters));\n }\n\n if (entityType === 'all' || entityType === 'task') {\n results.push(...searchTasks(projectId, filters));\n }\n\n if (entityType === 'all' || entityType === 'bug') {\n results.push(...searchBugs(projectId, filters));\n }\n\n // Sort by updated_at descending and limit\n results.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n return results.slice(0, limit);\n}\n\n/**\n * Search initiatives\n */\nfunction searchInitiatives(projectId: string, filters: QueryFilters): QueryResult[] {\n let query = `\n SELECT key, summary, status, priority, owner as assignee, created_at, updated_at\n FROM initiatives\n WHERE project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n query += buildFilterClauses(filters, '', 'owner');\n\n const rows = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n created_at: string;\n updated_at: string;\n }>(query, params);\n\n return rows.map((r) => ({\n type: 'initiative',\n key: r.key,\n summary: r.summary,\n status: r.status,\n priority: r.priority,\n assignee: r.assignee,\n createdAt: r.created_at,\n updatedAt: r.updated_at\n }));\n}\n\n/**\n * Search epics\n */\nfunction searchEpics(projectId: string, filters: QueryFilters): QueryResult[] {\n let query = `\n SELECT e.key, e.summary, e.status, e.priority, e.owner as assignee,\n e.created_at, e.updated_at, i.key as parent\n FROM epics e\n LEFT JOIN initiatives i ON e.initiative_id = i.id\n WHERE e.project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n query += buildFilterClauses(filters, 'e', 'e.owner');\n\n const rows = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n created_at: string;\n updated_at: string;\n parent: string | null;\n }>(query, params);\n\n return rows.map((r) => ({\n type: 'epic',\n key: r.key,\n summary: r.summary,\n status: r.status,\n priority: r.priority,\n assignee: r.assignee,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n parent: r.parent ?? undefined\n }));\n}\n\n/**\n * Search stories\n */\nfunction searchStories(projectId: string, filters: QueryFilters): QueryResult[] {\n let query = `\n SELECT s.key, s.summary, s.status, s.priority, s.assignee,\n s.created_at, s.updated_at, e.key as parent, s.story_points\n FROM user_stories s\n LEFT JOIN epics e ON s.epic_id = e.id\n WHERE s.project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n // Epic filter\n if (filters.epic) {\n query += ` AND e.key = ?`;\n params.push(filters.epic);\n }\n\n // Sprint filter\n if (filters.sprint) {\n query += ` AND s.sprint_id = (SELECT id FROM sprints WHERE name = ? AND project_id = ?)`;\n params.push(filters.sprint, projectId);\n }\n\n query += buildFilterClauses(filters, 's', 's.assignee');\n\n const rows = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n created_at: string;\n updated_at: string;\n parent: string | null;\n story_points: number | null;\n }>(query, params);\n\n return rows.map((r) => ({\n type: 'story',\n key: r.key,\n summary: r.summary,\n status: r.status,\n priority: r.priority,\n assignee: r.assignee,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n parent: r.parent ?? undefined,\n extra: { storyPoints: r.story_points }\n }));\n}\n\n/**\n * Search tasks\n */\nfunction searchTasks(projectId: string, filters: QueryFilters): QueryResult[] {\n let query = `\n SELECT t.key, t.summary, t.status, t.priority, t.assignee,\n t.created_at, t.updated_at, s.key as parent, t.issue_type\n FROM tasks t\n LEFT JOIN user_stories s ON t.story_id = s.id\n WHERE t.project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n // Sprint filter\n if (filters.sprint) {\n query += ` AND t.sprint_id = (SELECT id FROM sprints WHERE name = ? AND project_id = ?)`;\n params.push(filters.sprint, projectId);\n }\n\n query += buildFilterClauses(filters, 't', 't.assignee');\n\n const rows = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n created_at: string;\n updated_at: string;\n parent: string | null;\n issue_type: string;\n }>(query, params);\n\n return rows.map((r) => ({\n type: r.issue_type === 'subtask' ? 'subtask' : 'task',\n key: r.key,\n summary: r.summary,\n status: r.status,\n priority: r.priority,\n assignee: r.assignee,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n parent: r.parent ?? undefined\n }));\n}\n\n/**\n * Search bugs\n */\nfunction searchBugs(projectId: string, filters: QueryFilters): QueryResult[] {\n let query = `\n SELECT b.key, b.summary, b.status, b.priority, b.assignee,\n b.created_at, b.updated_at, b.severity, e.key as parent\n FROM bugs b\n LEFT JOIN epics e ON b.epic_id = e.id\n WHERE b.project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n query += buildFilterClauses(filters, 'b', 'b.assignee');\n\n const rows = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n created_at: string;\n updated_at: string;\n severity: string;\n parent: string | null;\n }>(query, params);\n\n return rows.map((r) => ({\n type: 'bug',\n key: r.key,\n summary: r.summary,\n status: r.status,\n priority: r.priority,\n assignee: r.assignee,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n parent: r.parent ?? undefined,\n extra: { severity: r.severity }\n }));\n}\n\n/**\n * Build filter clauses for SQL query\n * @param filters - Query filters\n * @param tablePrefix - Table alias prefix (e.g., 's' for user_stories, 't' for tasks)\n * @param assigneeColumn - Full assignee column reference (e.g., 's.assignee')\n */\nfunction buildFilterClauses(filters: QueryFilters, tablePrefix: string, assigneeColumn: string): string {\n const clauses: string[] = [];\n const p = tablePrefix && tablePrefix.length > 0 ? `${tablePrefix}.` : '';\n\n // Text search\n if (filters.text) {\n clauses.push(`(${p}summary LIKE '%${escapeSql(filters.text)}%' OR ${p}key LIKE '%${escapeSql(filters.text)}%')`);\n }\n\n // Status filter\n if (filters.status) {\n const statuses = Array.isArray(filters.status) ? filters.status : [filters.status];\n clauses.push(`${p}status IN (${statuses.map((s) => `'${escapeSql(s)}'`).join(', ')})`);\n }\n\n // Priority filter\n if (filters.priority) {\n const priorities = Array.isArray(filters.priority) ? filters.priority : [filters.priority];\n clauses.push(`${p}priority IN (${priorities.map((p) => `'${escapeSql(p)}'`).join(', ')})`);\n }\n\n // Assignee filter\n if (filters.assignee) {\n clauses.push(`${assigneeColumn} = '${escapeSql(filters.assignee)}'`);\n }\n\n // Date filters\n if (filters.createdAfter) {\n clauses.push(`${p}created_at >= '${escapeSql(filters.createdAfter)}'`);\n }\n\n if (filters.updatedAfter) {\n clauses.push(`${p}updated_at >= '${escapeSql(filters.updatedAfter)}'`);\n }\n\n return clauses.length > 0 ? ' AND ' + clauses.join(' AND ') : '';\n}\n\n/**\n * Escape SQL special characters\n */\nfunction escapeSql(str: string): string {\n return str.replace(/'/g, \"''\").replace(/\"/g, '\"\"');\n}\n\n/**\n * Get query statistics\n */\nexport function getQueryStats(projectId: string): QueryStats {\n const results = search(projectId, 'all', { limit: 1000 });\n\n const byType: Record<string, number> = {};\n const byStatus: Record<string, number> = {};\n\n for (const r of results) {\n byType[r.type] = (byType[r.type] ?? 0) + 1;\n byStatus[r.status] = (byStatus[r.status] ?? 0) + 1;\n }\n\n return {\n total: results.length,\n byType,\n byStatus\n };\n}\n\n/**\n * Find related items for an entity\n */\nexport function findRelated(\n projectId: string,\n entityType: string,\n entityKey: string\n): QueryResult[] {\n const results: QueryResult[] = [];\n\n if (entityType === 'initiative') {\n // Find epics under this initiative\n const epics = queryAll<{ id: string; key: string }>(\n `SELECT e.id, e.key FROM epics e\n JOIN initiatives i ON e.initiative_id = i.id\n WHERE i.key = ? AND i.project_id = ?`,\n [entityKey, projectId]\n );\n\n for (const epic of epics) {\n results.push(...search(projectId, 'epic', { text: epic.key, limit: 1 }));\n }\n }\n\n if (entityType === 'epic') {\n // Find stories under this epic\n const stories = search(projectId, 'story', { epic: entityKey });\n results.push(...stories);\n\n // Find bugs under this epic\n const bugs = queryAll<{ key: string }>(\n `SELECT b.key FROM bugs b\n JOIN epics e ON b.epic_id = e.id\n WHERE e.key = ? AND e.project_id = ?`,\n [entityKey, projectId]\n );\n\n for (const bug of bugs) {\n results.push(...search(projectId, 'bug', { text: bug.key, limit: 1 }));\n }\n }\n\n if (entityType === 'story') {\n // Find tasks under this story\n const tasks = queryAll<{ key: string }>(\n `SELECT t.key FROM tasks t\n JOIN user_stories s ON t.story_id = s.id\n WHERE s.key = ? AND s.project_id = ?`,\n [entityKey, projectId]\n );\n\n for (const task of tasks) {\n results.push(...search(projectId, 'task', { text: task.key, limit: 1 }));\n }\n }\n\n return results;\n}\n\n/**\n * Quick search by key pattern\n */\nexport function searchByKey(projectId: string, keyPattern: string): QueryResult[] {\n return search(projectId, 'all', { text: keyPattern, limit: 10 });\n}\n\n/**\n * Find items by assignee\n */\nexport function findByAssignee(projectId: string, assignee: string): QueryResult[] {\n return search(projectId, 'all', { assignee, limit: 100 });\n}\n\n/**\n * Find items updated recently\n */\nexport function findRecentlyUpdated(projectId: string, hours: number = 24): QueryResult[] {\n const since = new Date();\n since.setHours(since.getHours() - hours);\n\n // Use SQLite-compatible format (YYYY-MM-DD HH:MM:SS)\n const sqliteDate = since.toISOString().replace('T', ' ').replace('Z', '').split('.')[0];\n\n return search(projectId, 'all', {\n updatedAfter: sqliteDate,\n limit: 50\n });\n}\n\n/**\n * Find items in a specific status\n */\nexport function findByStatus(\n projectId: string,\n status: string | string[],\n entityType: EntityType = 'all'\n): QueryResult[] {\n return search(projectId, entityType, { status, limit: 100 });\n}\n","/**\n * AI Command\n *\n * Commands optimized for AI agent workflows.\n * Provides structured outputs for LLM consumption.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryOne } from '../db/connection.js';\nimport {\n error,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n getAIBriefing,\n getAIWorkItem,\n getAINextSteps,\n beginAISession,\n endAISession,\n getCompactStatus\n} from '../services/ai-helper.js';\nimport { getResumeContext } from '../services/context-loader.js';\n\nexport const aiCommand = new Command('ai')\n .description('AI agent helper commands');\n\n// Get briefing for starting work\naiCommand\n .command('briefing')\n .alias('b')\n .description('Get AI briefing for starting work')\n .action(() => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const briefing = getAIBriefing(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: briefing }));\n } else {\n console.log('\\n=== AI Briefing ===\\n');\n console.log(`Project: ${briefing.project.name} (${briefing.project.key})`);\n console.log(`Path: ${briefing.project.path}`);\n console.log(`Session: ${briefing.session.isActive ? `Active (${briefing.session.duration})` : 'No active session'}`);\n\n console.log('\\nOverview:');\n console.log(` Total Items: ${briefing.overview.totalItems}`);\n console.log(` In Progress: ${briefing.overview.inProgress}`);\n console.log(` Blocked: ${briefing.overview.blocked}`);\n console.log(` Backlog: ${briefing.overview.backlog}`);\n console.log(` Pending Comments: ${briefing.pendingComments}`);\n\n if (briefing.priorities.length > 0) {\n console.log('\\nPriorities:');\n for (const p of briefing.priorities) {\n console.log(` - [${p.type}] ${p.key}: ${p.summary}`);\n console.log(` Reason: ${p.reason}`);\n }\n }\n\n console.log('');\n }\n });\n\n// Get next steps recommendations\naiCommand\n .command('next')\n .alias('n')\n .description('Get AI recommendations for next steps')\n .action(() => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const nextSteps = getAINextSteps(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: nextSteps }));\n } else {\n console.log('\\n=== Next Steps ===\\n');\n\n if (nextSteps.recommendations.length > 0) {\n console.log('Recommendations:');\n for (const r of nextSteps.recommendations) {\n console.log(` - ${r.action}: ${r.target}`);\n console.log(` Reason: ${r.reason}`);\n console.log(` Command: ${r.command}`);\n }\n } else {\n console.log('No specific recommendations.');\n }\n\n if (nextSteps.blockers.length > 0) {\n console.log('\\nBlockers:');\n for (const b of nextSteps.blockers) {\n console.log(` - ${b.key}: ${b.summary}`);\n if (b.reason) console.log(` Reason: ${b.reason}`);\n }\n }\n\n if (nextSteps.unresolvedComments.length > 0) {\n console.log('\\nUnresolved Comments:');\n for (const c of nextSteps.unresolvedComments) {\n console.log(` - ${c.path}:${c.line} [${c.type}]`);\n console.log(` ${c.preview}...`);\n }\n }\n\n console.log('');\n }\n });\n\n// Get work item details\naiCommand\n .command('item')\n .argument('<type>', 'Entity type (epic/story/task/bug)')\n .argument('<key>', 'Entity key')\n .description('Get detailed work item for AI')\n .action((type: string, key: string) => {\n const opts = getOutputOptions(aiCommand);\n\n const validTypes = ['initiative', 'epic', 'story', 'task', 'bug'];\n if (!validTypes.includes(type)) {\n error(`Invalid type. Valid values: ${validTypes.join(', ')}`, opts);\n process.exit(1);\n }\n\n const item = getAIWorkItem(type, key);\n\n if (!item) {\n error(`${type} \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: item }));\n } else {\n console.log(`\\n=== ${type.charAt(0).toUpperCase() + type.slice(1)}: ${key} ===\\n`);\n console.log(`Summary: ${item.summary}`);\n console.log(`Status: ${item.status}`);\n console.log(`Priority: ${item.priority}`);\n console.log(`Assignee: ${item.assignee ?? '-'}`);\n\n if (item.description) {\n console.log(`\\nDescription:\\n${item.description}`);\n }\n\n if (item.children.length > 0) {\n console.log('\\nChildren:');\n for (const c of item.children) {\n console.log(` - [${c.type}] ${c.key}: ${c.summary} (${c.status})`);\n }\n }\n\n if (item.recentActivity.length > 0) {\n console.log('\\nRecent Activity:');\n for (const a of item.recentActivity) {\n console.log(` - ${a.action} at ${a.timestamp}`);\n }\n }\n\n console.log('');\n }\n });\n\n// Begin AI session\naiCommand\n .command('begin')\n .description('Begin AI work session with full context')\n .action(() => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const result = beginAISession(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: result }));\n } else {\n console.log('\\n=== AI Session Started ===\\n');\n console.log(`Session ID: ${result.session.id.slice(0, 8)}...`);\n console.log(`Started: ${result.session.startedAt}`);\n\n console.log('\\n--- Briefing ---');\n console.log(`Project: ${result.briefing.project.name}`);\n console.log(`Items: ${result.briefing.overview.totalItems} total, ${result.briefing.overview.inProgress} in-progress`);\n\n if (result.nextSteps.recommendations.length > 0) {\n console.log('\\n--- Recommended First Action ---');\n const first = result.nextSteps.recommendations[0];\n console.log(`${first.action}: ${first.target}`);\n console.log(`Command: ${first.command}`);\n }\n\n console.log('');\n }\n });\n\n// End AI session\naiCommand\n .command('end')\n .option('-s, --summary <summary>', 'Session summary')\n .description('End AI work session')\n .action((options) => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const result = endAISession(project.id, options.summary);\n\n if (!result) {\n error('No active session to end.', opts);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: result }));\n } else {\n console.log('\\n=== AI Session Ended ===\\n');\n console.log(`Session ID: ${result.session.id.slice(0, 8)}...`);\n console.log(`Duration: ${result.session.duration}`);\n console.log(`Entities Modified: ${result.session.entitiesModified}`);\n\n if (result.resumeContext.pendingWork.inProgressCount > 0) {\n console.log(`\\nPending Work: ${result.resumeContext.pendingWork.inProgressCount} in-progress`);\n }\n\n console.log('');\n }\n });\n\n// Resume context\naiCommand\n .command('resume')\n .description('Get context for resuming work')\n .action(() => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const resume = getResumeContext(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: resume }));\n } else {\n console.log('\\n=== Resume Context ===\\n');\n\n if (resume.lastSession) {\n console.log('Last Session:');\n console.log(` Ended: ${resume.lastSession.endedAt}`);\n console.log(` Summary: ${resume.lastSession.summary ?? '-'}`);\n console.log(` Changes: ${resume.lastSession.entitiesModified}`);\n } else {\n console.log('No previous session found.');\n }\n\n if (resume.recentChanges.length > 0) {\n console.log('\\nRecent Changes:');\n for (const c of resume.recentChanges.slice(0, 5)) {\n console.log(` - ${c.action} ${c.entityType} ${c.entityKey}`);\n }\n }\n\n console.log('\\nPending Work:');\n console.log(` In Progress: ${resume.pendingWork.inProgressCount}`);\n console.log(` Blocked: ${resume.pendingWork.blockedCount}`);\n console.log(` Unresolved Comments: ${resume.pendingWork.unresolvedComments}`);\n\n console.log('');\n }\n });\n\n// Compact status (one-liner)\naiCommand\n .command('status')\n .alias('s')\n .description('Get compact status line')\n .action(() => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const status = getCompactStatus(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { status } }));\n } else {\n console.log(status);\n }\n });\n","/**\n * AI Helper Service\n *\n * Convenience functions for AI agent workflows.\n * Provides structured outputs optimized for LLM consumption.\n *\n * @author Vladimir K.S.\n */\n\nimport { queryOne, queryAll } from '../db/connection.js';\nimport { loadContext, getResumeContext, getEntityContext } from './context-loader.js';\nimport { startSession, endSession, getActiveSession } from './session-service.js';\nimport { logActivity } from './activity-logger.js';\nimport { search, findByStatus } from './query-service.js';\nimport { getSyncStatus } from './file-scanner.js';\nimport { getCommentStats } from './comment-parser.js';\n\nexport interface AIBriefing {\n project: {\n key: string;\n name: string;\n path: string;\n };\n session: {\n isActive: boolean;\n id?: string;\n duration?: string;\n };\n overview: {\n totalItems: number;\n inProgress: number;\n blocked: number;\n backlog: number;\n };\n priorities: Array<{\n type: string;\n key: string;\n summary: string;\n reason: string;\n }>;\n pendingComments: number;\n lastUpdated: string;\n}\n\nexport interface AIWorkItem {\n type: string;\n key: string;\n summary: string;\n description: string | null;\n status: string;\n priority: string;\n assignee: string | null;\n parent: string | null;\n children: Array<{ type: string; key: string; summary: string; status: string }>;\n recentActivity: Array<{ action: string; timestamp: string }>;\n}\n\nexport interface AINextSteps {\n recommendations: Array<{\n action: string;\n target: string;\n reason: string;\n command: string;\n }>;\n blockers: Array<{\n key: string;\n summary: string;\n reason: string | null;\n }>;\n unresolvedComments: Array<{\n path: string;\n line: number;\n type: string;\n preview: string;\n }>;\n}\n\n/**\n * Get AI briefing for starting work\n */\nexport function getAIBriefing(projectId: string): AIBriefing {\n const project = queryOne<{ key: string; name: string; path: string }>(\n 'SELECT key, name, path FROM projects WHERE id = ?',\n [projectId]\n );\n\n if (!project) {\n throw new Error('Project not found');\n }\n\n const session = getActiveSession(projectId);\n\n // Get counts\n const inProgress = queryAll(\n `SELECT id FROM user_stories WHERE project_id = ? AND status = 'in_progress'\n UNION ALL\n SELECT id FROM tasks WHERE project_id = ? AND status = 'in_progress'`,\n [projectId, projectId]\n ).length;\n\n const blocked = queryAll(\n `SELECT id FROM tasks WHERE project_id = ? AND status = 'blocked'`,\n [projectId]\n ).length;\n\n const backlog = queryAll(\n `SELECT id FROM user_stories WHERE project_id = ? AND status = 'backlog'\n UNION ALL\n SELECT id FROM tasks WHERE project_id = ? AND status = 'todo'`,\n [projectId, projectId]\n ).length;\n\n const total = queryAll(\n `SELECT id FROM initiatives WHERE project_id = ?\n UNION ALL SELECT id FROM epics WHERE project_id = ?\n UNION ALL SELECT id FROM user_stories WHERE project_id = ?\n UNION ALL SELECT id FROM tasks WHERE project_id = ?\n UNION ALL SELECT id FROM bugs WHERE project_id = ?`,\n [projectId, projectId, projectId, projectId, projectId]\n ).length;\n\n // Get priorities\n const priorities: AIBriefing['priorities'] = [];\n\n // Critical bugs first\n const criticalBugs = queryAll<{ key: string; summary: string }>(\n `SELECT key, summary FROM bugs WHERE project_id = ? AND severity = 'Critical' AND status != 'closed' LIMIT 3`,\n [projectId]\n );\n for (const bug of criticalBugs) {\n priorities.push({\n type: 'bug',\n key: bug.key,\n summary: bug.summary,\n reason: 'Critical severity bug'\n });\n }\n\n // Blocked items\n const blockedItems = queryAll<{ key: string; summary: string }>(\n `SELECT key, summary FROM tasks WHERE project_id = ? AND status = 'blocked' LIMIT 2`,\n [projectId]\n );\n for (const item of blockedItems) {\n priorities.push({\n type: 'task',\n key: item.key,\n summary: item.summary,\n reason: 'Blocked - needs attention'\n });\n }\n\n // High priority in-progress\n const highPriority = queryAll<{ key: string; summary: string }>(\n `SELECT key, summary FROM user_stories WHERE project_id = ? AND status = 'in_progress' AND priority IN ('Highest', 'High') LIMIT 2`,\n [projectId]\n );\n for (const item of highPriority) {\n priorities.push({\n type: 'story',\n key: item.key,\n summary: item.summary,\n reason: 'High priority in progress'\n });\n }\n\n const commentStats = getCommentStats(projectId);\n\n return {\n project: {\n key: project.key,\n name: project.name,\n path: project.path\n },\n session: session\n ? { isActive: true, id: session.id, duration: calculateDuration(session.startedAt) }\n : { isActive: false },\n overview: {\n totalItems: total,\n inProgress,\n blocked,\n backlog\n },\n priorities,\n pendingComments: commentStats.totalComments,\n lastUpdated: new Date().toISOString()\n };\n}\n\n/**\n * Get detailed work item for AI\n */\nexport function getAIWorkItem(entityType: string, entityKey: string): AIWorkItem | null {\n const context = getEntityContext(entityType, entityKey);\n if (!context) {\n return null;\n }\n\n // Get children based on entity type\n const children: AIWorkItem['children'] = [];\n\n if (entityType === 'epic') {\n const stories = queryAll<{ key: string; summary: string; status: string }>(\n `SELECT s.key, s.summary, s.status FROM user_stories s\n JOIN epics e ON s.epic_id = e.id\n WHERE e.key = ?`,\n [entityKey]\n );\n for (const s of stories) {\n children.push({ type: 'story', ...s });\n }\n }\n\n if (entityType === 'story') {\n const tasks = queryAll<{ key: string; summary: string; status: string }>(\n `SELECT t.key, t.summary, t.status FROM tasks t\n JOIN user_stories s ON t.story_id = s.id\n WHERE s.key = ?`,\n [entityKey]\n );\n for (const t of tasks) {\n children.push({ type: 'task', ...t });\n }\n }\n\n const activity = (context.recentActivity as Array<{ action: string; createdAt: string }>) ?? [];\n\n return {\n type: entityType,\n key: context.key as string,\n summary: context.summary as string,\n description: (context.description as string) ?? null,\n status: context.status as string,\n priority: context.priority as string,\n assignee: (context.assignee as string) ?? null,\n parent: null, // Could be enhanced to include parent\n children,\n recentActivity: activity.slice(0, 5).map((a) => ({\n action: a.action,\n timestamp: a.createdAt\n }))\n };\n}\n\n/**\n * Get AI recommendations for next steps\n */\nexport function getAINextSteps(projectId: string): AINextSteps {\n const recommendations: AINextSteps['recommendations'] = [];\n\n // Check for session\n const session = getActiveSession(projectId);\n if (!session) {\n recommendations.push({\n action: 'Start a session',\n target: 'session',\n reason: 'No active session - start one to track your work',\n command: 'aigile session start'\n });\n }\n\n // Check for in-progress items\n const inProgress = findByStatus(projectId, 'in_progress', 'all');\n if (inProgress.length > 0) {\n const item = inProgress[0];\n recommendations.push({\n action: 'Continue work',\n target: item.key,\n reason: `${item.type} is in progress`,\n command: `aigile ${item.type} show ${item.key}`\n });\n }\n\n // Check for critical bugs\n const criticalBugs = queryAll<{ key: string; summary: string }>(\n `SELECT key, summary FROM bugs WHERE project_id = ? AND severity = 'Critical' AND status = 'open' LIMIT 1`,\n [projectId]\n );\n if (criticalBugs.length > 0) {\n recommendations.push({\n action: 'Fix critical bug',\n target: criticalBugs[0].key,\n reason: 'Critical severity needs immediate attention',\n command: `aigile bug show ${criticalBugs[0].key}`\n });\n }\n\n // Check for backlog items to start\n if (inProgress.length === 0) {\n const backlog = findByStatus(projectId, 'backlog', 'story');\n if (backlog.length > 0) {\n recommendations.push({\n action: 'Start next story',\n target: backlog[0].key,\n reason: 'No work in progress - pick up next story',\n command: `aigile story transition ${backlog[0].key} in_progress`\n });\n }\n }\n\n // Check sync status\n const syncStatus = getSyncStatus(projectId);\n if (syncStatus.modified > 0) {\n recommendations.push({\n action: 'Sync files',\n target: 'documents',\n reason: `${syncStatus.modified} files have been modified`,\n command: 'aigile sync scan --comments'\n });\n }\n\n // Get blockers\n const blockers = queryAll<{ key: string; summary: string; blocked_reason: string | null }>(\n `SELECT key, summary, blocked_reason FROM tasks WHERE project_id = ? AND status = 'blocked'`,\n [projectId]\n );\n\n // Get unresolved comments\n const comments = queryAll<{ path: string; line_number: number; marker_type: string; content: string }>(\n `SELECT d.path, dc.line_number, dc.marker_type, dc.content\n FROM doc_comments dc\n JOIN documents d ON dc.document_id = d.id\n WHERE d.project_id = ? AND dc.resolved = 0\n ORDER BY dc.marker_type DESC\n LIMIT 5`,\n [projectId]\n );\n\n return {\n recommendations,\n blockers: blockers.map((b) => ({\n key: b.key,\n summary: b.summary,\n reason: b.blocked_reason\n })),\n unresolvedComments: comments.map((c) => ({\n path: c.path,\n line: c.line_number,\n type: c.marker_type,\n preview: c.content.slice(0, 100)\n }))\n };\n}\n\n/**\n * Begin AI work session\n */\nexport function beginAISession(projectId: string): {\n session: { id: string; startedAt: string };\n briefing: AIBriefing;\n nextSteps: AINextSteps;\n} {\n const session = startSession(projectId);\n const briefing = getAIBriefing(projectId);\n const nextSteps = getAINextSteps(projectId);\n\n return {\n session: { id: session.id, startedAt: session.startedAt },\n briefing,\n nextSteps\n };\n}\n\n/**\n * End AI work session with summary\n */\nexport function endAISession(\n projectId: string,\n summary?: string\n): {\n session: { id: string; duration: string; entitiesModified: number };\n resumeContext: ReturnType<typeof getResumeContext>;\n} | null {\n const session = endSession(projectId, summary);\n if (!session) {\n return null;\n }\n\n const resumeContext = getResumeContext(projectId);\n\n return {\n session: {\n id: session.id,\n duration: calculateDuration(session.startedAt, session.endedAt),\n entitiesModified: session.entitiesModified\n },\n resumeContext\n };\n}\n\n/**\n * Log AI action for audit trail\n */\nexport function logAIAction(\n projectId: string,\n entityType: string,\n entityId: string,\n action: string,\n details?: Record<string, unknown>\n): void {\n logActivity(projectId, entityType as any, entityId, action as any, {\n newValue: details,\n actor: 'ai-agent'\n });\n}\n\n/**\n * Get compact status for AI prompts\n */\nexport function getCompactStatus(projectId: string): string {\n const briefing = getAIBriefing(projectId);\n\n const lines = [\n `Project: ${briefing.project.name} (${briefing.project.key})`,\n `Session: ${briefing.session.isActive ? 'Active' : 'Inactive'}`,\n `Items: ${briefing.overview.totalItems} total, ${briefing.overview.inProgress} in-progress, ${briefing.overview.blocked} blocked`,\n `Comments: ${briefing.pendingComments} pending`\n ];\n\n if (briefing.priorities.length > 0) {\n lines.push(`Priority: ${briefing.priorities[0].key} - ${briefing.priorities[0].reason}`);\n }\n\n return lines.join(' | ');\n}\n\n/**\n * Calculate duration string\n */\nfunction calculateDuration(start: string, end?: string | null): string {\n const startDate = new Date(start);\n const endDate = end ? new Date(end) : new Date();\n const diffMs = endDate.getTime() - startDate.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) return '<1m';\n if (diffMins < 60) return `${diffMins}m`;\n\n const hours = Math.floor(diffMins / 60);\n const mins = diffMins % 60;\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n}\n","/**\n * Component Command\n *\n * Manage project components (code modules/subsystems).\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { logCreate, logActivity, logDelete, EntityType } from '../services/activity-logger.js';\n\nexport const componentCommand = new Command('component')\n .description('Manage project components');\n\n// Create component\ncomponentCommand\n .command('create')\n .argument('<name>', 'Component name')\n .option('-d, --description <description>', 'Component description')\n .option('-l, --lead <lead>', 'Component lead')\n .option('--default-assignee <assignee>', 'Default assignee for issues in this component')\n .description('Create a new component')\n .action((name: string, options) => {\n const opts = getOutputOptions(componentCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Check if component already exists\n const existing = queryOne<{ id: string }>('SELECT id FROM components WHERE project_id = ? AND name = ?', [project.id, name]);\n if (existing) {\n error(`Component \"${name}\" already exists.`, opts);\n process.exit(1);\n }\n\n const componentId = generateId();\n\n run(\n `INSERT INTO components (id, project_id, name, description, lead, default_assignee)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [componentId, project.id, name, options.description ?? null, options.lead ?? null, options.defaultAssignee ?? null]\n );\n\n logCreate(project.id, 'component', componentId, { name, description: options.description });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { id: componentId, name } }));\n } else {\n success(`Created component \"${name}\"`, opts);\n }\n });\n\n// List components\ncomponentCommand\n .command('list')\n .alias('ls')\n .description('List all components')\n .action(() => {\n const opts = getOutputOptions(componentCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const components = queryAll<{\n name: string;\n description: string | null;\n lead: string | null;\n default_assignee: string | null;\n }>(\n `SELECT name, description, lead, default_assignee FROM components\n WHERE project_id = (SELECT id FROM projects WHERE key = ?)\n ORDER BY name`,\n [config.project.key]\n );\n\n data(\n components,\n [\n { header: 'Name', key: 'name', width: 20 },\n { header: 'Description', key: 'description', width: 40 },\n { header: 'Lead', key: 'lead', width: 15 },\n { header: 'Default Assignee', key: 'default_assignee', width: 15 }\n ],\n opts\n );\n });\n\n// Show component\ncomponentCommand\n .command('show')\n .argument('<name>', 'Component name')\n .description('Show component details')\n .action((name: string) => {\n const opts = getOutputOptions(componentCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const component = queryOne<{\n id: string;\n name: string;\n description: string | null;\n lead: string | null;\n default_assignee: string | null;\n created_at: string;\n updated_at: string;\n }>(\n `SELECT id, name, description, lead, default_assignee, created_at, updated_at FROM components\n WHERE project_id = (SELECT id FROM projects WHERE key = ?) AND name = ?`,\n [config.project.key, name]\n );\n\n if (!component) {\n error(`Component \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n // Count items in this component\n const itemCount = queryOne<{ count: number }>(\n `SELECT COUNT(*) as count FROM (\n SELECT id FROM epics WHERE components LIKE ?\n UNION ALL\n SELECT id FROM user_stories WHERE components LIKE ?\n UNION ALL\n SELECT id FROM tasks WHERE components LIKE ?\n UNION ALL\n SELECT id FROM bugs WHERE components LIKE ?\n )`,\n [`%${name}%`, `%${name}%`, `%${name}%`, `%${name}%`]\n );\n\n details(\n { ...component, items: itemCount?.count ?? 0 },\n [\n { label: 'Name', key: 'name' },\n { label: 'Description', key: 'description' },\n { label: 'Lead', key: 'lead' },\n { label: 'Default Assignee', key: 'default_assignee' },\n { label: 'Items', key: 'items' },\n { label: 'Created', key: 'created_at' },\n { label: 'Updated', key: 'updated_at' }\n ],\n opts\n );\n });\n\n// Update component\ncomponentCommand\n .command('update')\n .argument('<name>', 'Component name')\n .option('-d, --description <description>', 'Component description')\n .option('-l, --lead <lead>', 'Component lead')\n .option('--default-assignee <assignee>', 'Default assignee')\n .option('--rename <newName>', 'Rename component')\n .description('Update a component')\n .action((name: string, options) => {\n const opts = getOutputOptions(componentCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const component = queryOne<{ id: string }>('SELECT id FROM components WHERE project_id = ? AND name = ?', [project.id, name]);\n if (!component) {\n error(`Component \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n const changes: Record<string, unknown> = {};\n\n if (options.description !== undefined) {\n updates.push('description = ?');\n params.push(options.description);\n changes.description = options.description;\n }\n\n if (options.lead !== undefined) {\n updates.push('lead = ?');\n params.push(options.lead);\n changes.lead = options.lead;\n }\n\n if (options.defaultAssignee !== undefined) {\n updates.push('default_assignee = ?');\n params.push(options.defaultAssignee);\n changes.default_assignee = options.defaultAssignee;\n }\n\n if (options.rename) {\n // Check if new name already exists\n const existing = queryOne<{ id: string }>('SELECT id FROM components WHERE project_id = ? AND name = ?', [project.id, options.rename]);\n if (existing) {\n error(`Component \"${options.rename}\" already exists.`, opts);\n process.exit(1);\n }\n updates.push('name = ?');\n params.push(options.rename);\n changes.name = options.rename;\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(component.id);\n\n run(`UPDATE components SET ${updates.join(', ')} WHERE id = ?`, params);\n\n logActivity(project.id, 'component' as EntityType, component.id, 'update', { newValue: changes });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name: options.rename ?? name, ...changes } }));\n } else {\n success(`Updated component \"${name}\"`, opts);\n }\n });\n\n// Delete component\ncomponentCommand\n .command('delete')\n .alias('rm')\n .argument('<name>', 'Component name')\n .option('-f, --force', 'Force delete without confirmation')\n .description('Delete a component')\n .action((name: string, options) => {\n const opts = getOutputOptions(componentCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const component = queryOne<{ id: string; name: string }>('SELECT id, name FROM components WHERE project_id = ? AND name = ?', [project.id, name]);\n if (!component) {\n error(`Component \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM components WHERE id = ?', [component.id]);\n\n logDelete(project.id, 'component', component.id, { name: component.name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name } }));\n } else {\n success(`Deleted component \"${name}\"`, opts);\n }\n });\n","/**\n * Version Command\n *\n * Manage project versions/releases.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { logCreate, logActivity, logDelete, logTransition, EntityType } from '../services/activity-logger.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\n\nexport const versionCommand = new Command('version')\n .description('Manage project versions/releases');\n\n// Create version\nversionCommand\n .command('create')\n .argument('<name>', 'Version name (e.g., v1.0.0)')\n .option('-d, --description <description>', 'Version description')\n .option('--start <date>', 'Start date (YYYY-MM-DD)')\n .option('--release <date>', 'Release date (YYYY-MM-DD)')\n .description('Create a new version')\n .action((name: string, options) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Check if version already exists\n const existing = queryOne<{ id: string }>('SELECT id FROM versions WHERE project_id = ? AND name = ?', [project.id, name]);\n if (existing) {\n error(`Version \"${name}\" already exists.`, opts);\n process.exit(1);\n }\n\n const versionId = generateId();\n\n run(\n `INSERT INTO versions (id, project_id, name, description, status, start_date, release_date)\n VALUES (?, ?, ?, ?, 'unreleased', ?, ?)`,\n [versionId, project.id, name, options.description ?? null, options.start ?? null, options.release ?? null]\n );\n\n logCreate(project.id, 'version', versionId, { name, description: options.description });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { id: versionId, name, status: 'unreleased' } }));\n } else {\n success(`Created version \"${name}\"`, opts);\n }\n });\n\n// List versions\nversionCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status (unreleased/released/archived)')\n .description('List all versions')\n .action((options) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n let query = `SELECT name, description, status, start_date, release_date FROM versions\n WHERE project_id = (SELECT id FROM projects WHERE key = ?)`;\n const params: unknown[] = [config.project.key];\n\n if (options.status) {\n query += ' AND status = ?';\n params.push(options.status);\n }\n\n query += ' ORDER BY release_date DESC, name';\n\n const versions = queryAll<{\n name: string;\n description: string | null;\n status: string;\n start_date: string | null;\n release_date: string | null;\n }>(query, params);\n\n data(\n versions,\n [\n { header: 'Name', key: 'name', width: 15 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Start', key: 'start_date', width: 12 },\n { header: 'Release', key: 'release_date', width: 12 },\n { header: 'Description', key: 'description', width: 35 }\n ],\n opts\n );\n });\n\n// Show version\nversionCommand\n .command('show')\n .argument('<name>', 'Version name')\n .description('Show version details')\n .action((name: string) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const version = queryOne<{\n id: string;\n name: string;\n description: string | null;\n status: string;\n start_date: string | null;\n release_date: string | null;\n created_at: string;\n updated_at: string;\n }>(\n `SELECT id, name, description, status, start_date, release_date, created_at, updated_at FROM versions\n WHERE project_id = (SELECT id FROM projects WHERE key = ?) AND name = ?`,\n [config.project.key, name]\n );\n\n if (!version) {\n error(`Version \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n // Count fix versions\n const fixCount = queryOne<{ count: number }>(\n `SELECT COUNT(*) as count FROM (\n SELECT id FROM epics WHERE fix_versions LIKE ?\n UNION ALL\n SELECT id FROM user_stories WHERE fix_versions LIKE ?\n UNION ALL\n SELECT id FROM bugs WHERE fix_versions LIKE ?\n )`,\n [`%${name}%`, `%${name}%`, `%${name}%`]\n );\n\n details(\n { ...version, fix_items: fixCount?.count ?? 0 },\n [\n { label: 'Name', key: 'name' },\n { label: 'Status', key: 'status' },\n { label: 'Description', key: 'description' },\n { label: 'Start Date', key: 'start_date' },\n { label: 'Release Date', key: 'release_date' },\n { label: 'Fix Items', key: 'fix_items' },\n { label: 'Created', key: 'created_at' },\n { label: 'Updated', key: 'updated_at' }\n ],\n opts\n );\n });\n\n// Update version\nversionCommand\n .command('update')\n .argument('<name>', 'Version name')\n .option('-d, --description <description>', 'Version description')\n .option('--start <date>', 'Start date (YYYY-MM-DD)')\n .option('--release <date>', 'Release date (YYYY-MM-DD)')\n .option('--rename <newName>', 'Rename version')\n .description('Update a version')\n .action((name: string, options) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const version = queryOne<{ id: string }>('SELECT id FROM versions WHERE project_id = ? AND name = ?', [project.id, name]);\n if (!version) {\n error(`Version \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n const changes: Record<string, unknown> = {};\n\n if (options.description !== undefined) {\n updates.push('description = ?');\n params.push(options.description);\n changes.description = options.description;\n }\n\n if (options.start !== undefined) {\n updates.push('start_date = ?');\n params.push(options.start);\n changes.start_date = options.start;\n }\n\n if (options.release !== undefined) {\n updates.push('release_date = ?');\n params.push(options.release);\n changes.release_date = options.release;\n }\n\n if (options.rename) {\n // Check if new name already exists\n const existing = queryOne<{ id: string }>('SELECT id FROM versions WHERE project_id = ? AND name = ?', [project.id, options.rename]);\n if (existing) {\n error(`Version \"${options.rename}\" already exists.`, opts);\n process.exit(1);\n }\n updates.push('name = ?');\n params.push(options.rename);\n changes.name = options.rename;\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(version.id);\n\n run(`UPDATE versions SET ${updates.join(', ')} WHERE id = ?`, params);\n\n logActivity(project.id, 'version' as EntityType, version.id, 'update', { newValue: changes });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name: options.rename ?? name, ...changes } }));\n } else {\n success(`Updated version \"${name}\"`, opts);\n }\n });\n\n// Transition version status\nversionCommand\n .command('transition')\n .argument('<name>', 'Version name')\n .argument('<status>', 'New status (unreleased/released/archived)')\n .description('Transition version status')\n .action((name: string, newStatus: string) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const version = queryOne<{ id: string; status: string }>('SELECT id, status FROM versions WHERE project_id = ? AND name = ?', [project.id, name]);\n if (!version) {\n error(`Version \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('version', version.status, newStatus);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('version', version.status);\n error(formatTransitionError('version', name, version.status, newStatus, validTransitions), opts);\n process.exit(1);\n }\n\n // If releasing, set release_date to today if not set\n let additionalUpdate = '';\n if (newStatus === 'released') {\n additionalUpdate = \", release_date = COALESCE(release_date, date('now'))\";\n }\n\n run(`UPDATE versions SET status = ?, updated_at = datetime('now')${additionalUpdate} WHERE id = ?`, [newStatus, version.id]);\n\n logTransition(project.id, 'version', version.id, version.status, newStatus);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name, oldStatus: version.status, newStatus } }));\n } else {\n success(`Version \"${name}\" transitioned from \"${version.status}\" to \"${newStatus}\"`, opts);\n }\n });\n\n// Delete version\nversionCommand\n .command('delete')\n .alias('rm')\n .argument('<name>', 'Version name')\n .option('-f, --force', 'Force delete without confirmation')\n .description('Delete a version')\n .action((name: string, options) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const version = queryOne<{ id: string; name: string }>('SELECT id, name FROM versions WHERE project_id = ? AND name = ?', [project.id, name]);\n if (!version) {\n error(`Version \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM versions WHERE id = ?', [version.id]);\n\n logDelete(project.id, 'version', version.id, { name: version.name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name } }));\n } else {\n success(`Deleted version \"${name}\"`, opts);\n }\n });\n","/**\n * Persona Command\n *\n * Manage user personas (user archetypes for UX design).\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { logCreate, logActivity, logDelete, EntityType } from '../services/activity-logger.js';\n\nexport const personaCommand = new Command('persona')\n .description('Manage user personas');\n\n// Create persona\npersonaCommand\n .command('create')\n .argument('<name>', 'Persona name')\n .option('-d, --description <description>', 'Persona description')\n .option('-r, --role <role>', 'User role (e.g., \"Developer\", \"Manager\")')\n .option('-g, --goals <goals>', 'User goals (comma-separated)')\n .option('-f, --frustrations <frustrations>', 'User frustrations (comma-separated)')\n .option('--demographics <demographics>', 'Demographics info')\n .description('Create a new persona')\n .action((name: string, options) => {\n const opts = getOutputOptions(personaCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string; key: string }>('SELECT id, key FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const personaId = generateId();\n const key = getNextKey(project.key);\n\n run(\n `INSERT INTO personas (id, project_id, key, name, description, role, goals, frustrations, demographics)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n personaId,\n project.id,\n key,\n name,\n options.description ?? null,\n options.role ?? null,\n options.goals ?? null,\n options.frustrations ?? null,\n options.demographics ?? null\n ]\n );\n\n logCreate(project.id, 'persona', personaId, { key, name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { id: personaId, key, name } }));\n } else {\n success(`Created persona \"${name}\" (${key})`, opts);\n }\n });\n\n// List personas\npersonaCommand\n .command('list')\n .alias('ls')\n .description('List all personas')\n .action(() => {\n const opts = getOutputOptions(personaCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const personas = queryAll<{\n key: string;\n name: string;\n role: string | null;\n description: string | null;\n }>(\n `SELECT key, name, role, description FROM personas\n WHERE project_id = (SELECT id FROM projects WHERE key = ?)\n ORDER BY name`,\n [config.project.key]\n );\n\n data(\n personas,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Name', key: 'name', width: 20 },\n { header: 'Role', key: 'role', width: 20 },\n { header: 'Description', key: 'description', width: 40 }\n ],\n opts\n );\n });\n\n// Show persona\npersonaCommand\n .command('show')\n .argument('<key>', 'Persona key')\n .description('Show persona details')\n .action((key: string) => {\n const opts = getOutputOptions(personaCommand);\n\n const persona = queryOne<{\n id: string;\n key: string;\n name: string;\n description: string | null;\n role: string | null;\n goals: string | null;\n frustrations: string | null;\n demographics: string | null;\n created_at: string;\n updated_at: string;\n }>(\n `SELECT id, key, name, description, role, goals, frustrations, demographics, created_at, updated_at\n FROM personas WHERE key = ?`,\n [key]\n );\n\n if (!persona) {\n error(`Persona \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Count UX journeys for this persona\n const journeyCount = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM ux_journeys WHERE persona_id = ?',\n [persona.id]\n );\n\n details(\n { ...persona, journeys: journeyCount?.count ?? 0 },\n [\n { label: 'Key', key: 'key' },\n { label: 'Name', key: 'name' },\n { label: 'Role', key: 'role' },\n { label: 'Description', key: 'description' },\n { label: 'Goals', key: 'goals' },\n { label: 'Frustrations', key: 'frustrations' },\n { label: 'Demographics', key: 'demographics' },\n { label: 'UX Journeys', key: 'journeys' },\n { label: 'Created', key: 'created_at' },\n { label: 'Updated', key: 'updated_at' }\n ],\n opts\n );\n });\n\n// Update persona\npersonaCommand\n .command('update')\n .argument('<key>', 'Persona key')\n .option('-n, --name <name>', 'Persona name')\n .option('-d, --description <description>', 'Persona description')\n .option('-r, --role <role>', 'User role')\n .option('-g, --goals <goals>', 'User goals')\n .option('-f, --frustrations <frustrations>', 'User frustrations')\n .option('--demographics <demographics>', 'Demographics info')\n .description('Update a persona')\n .action((key: string, options) => {\n const opts = getOutputOptions(personaCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const persona = queryOne<{ id: string }>('SELECT id FROM personas WHERE key = ?', [key]);\n if (!persona) {\n error(`Persona \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n const changes: Record<string, unknown> = {};\n\n if (options.name !== undefined) {\n updates.push('name = ?');\n params.push(options.name);\n changes.name = options.name;\n }\n\n if (options.description !== undefined) {\n updates.push('description = ?');\n params.push(options.description);\n changes.description = options.description;\n }\n\n if (options.role !== undefined) {\n updates.push('role = ?');\n params.push(options.role);\n changes.role = options.role;\n }\n\n if (options.goals !== undefined) {\n updates.push('goals = ?');\n params.push(options.goals);\n changes.goals = options.goals;\n }\n\n if (options.frustrations !== undefined) {\n updates.push('frustrations = ?');\n params.push(options.frustrations);\n changes.frustrations = options.frustrations;\n }\n\n if (options.demographics !== undefined) {\n updates.push('demographics = ?');\n params.push(options.demographics);\n changes.demographics = options.demographics;\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(persona.id);\n\n run(`UPDATE personas SET ${updates.join(', ')} WHERE id = ?`, params);\n\n logActivity(project.id, 'persona' as EntityType, persona.id, 'update', { newValue: changes });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key, ...changes } }));\n } else {\n success(`Updated persona \"${key}\"`, opts);\n }\n });\n\n// Delete persona\npersonaCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Persona key')\n .option('-f, --force', 'Force delete without confirmation')\n .description('Delete a persona')\n .action((key: string, options) => {\n const opts = getOutputOptions(personaCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const persona = queryOne<{ id: string; key: string; name: string }>('SELECT id, key, name FROM personas WHERE key = ?', [key]);\n if (!persona) {\n error(`Persona \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Check for linked UX journeys\n const linkedJourneys = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM ux_journeys WHERE persona_id = ?',\n [persona.id]\n );\n\n if ((linkedJourneys?.count ?? 0) > 0 && !options.force) {\n error(`Persona \"${key}\" has ${linkedJourneys?.count} linked UX journeys. Use --force to delete.`, opts);\n process.exit(1);\n }\n\n // Unlink UX journeys\n run('UPDATE ux_journeys SET persona_id = NULL WHERE persona_id = ?', [persona.id]);\n\n run('DELETE FROM personas WHERE id = ?', [persona.id]);\n\n logDelete(project.id, 'persona', persona.id, { key: persona.key, name: persona.name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key } }));\n } else {\n success(`Deleted persona \"${key}\"`, opts);\n }\n });\n","/**\n * UX Journey Command\n *\n * Manage user experience journeys.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { logCreate, logActivity, logDelete, EntityType } from '../services/activity-logger.js';\n\nexport const uxJourneyCommand = new Command('ux-journey')\n .alias('journey')\n .description('Manage UX journeys');\n\n// Create UX journey\nuxJourneyCommand\n .command('create')\n .argument('<name>', 'Journey name')\n .option('-d, --description <description>', 'Journey description')\n .option('-p, --persona <key>', 'Associated persona key')\n .option('-s, --stages <stages>', 'Journey stages (JSON array or comma-separated)')\n .option('-t, --touchpoints <touchpoints>', 'Touchpoints (comma-separated)')\n .option('--pain-points <painPoints>', 'Pain points (comma-separated)')\n .option('--opportunities <opportunities>', 'Opportunities (comma-separated)')\n .description('Create a new UX journey')\n .action((name: string, options) => {\n const opts = getOutputOptions(uxJourneyCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string; key: string }>('SELECT id, key FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n let personaId: string | null = null;\n if (options.persona) {\n const persona = queryOne<{ id: string }>('SELECT id FROM personas WHERE key = ?', [options.persona]);\n if (!persona) {\n error(`Persona \"${options.persona}\" not found.`, opts);\n process.exit(1);\n }\n personaId = persona.id;\n }\n\n const journeyId = generateId();\n const key = getNextKey(project.key);\n\n run(\n `INSERT INTO ux_journeys (id, project_id, key, name, description, persona_id, stages, touchpoints, pain_points, opportunities)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n journeyId,\n project.id,\n key,\n name,\n options.description ?? null,\n personaId,\n options.stages ?? null,\n options.touchpoints ?? null,\n options.painPoints ?? null,\n options.opportunities ?? null\n ]\n );\n\n logCreate(project.id, 'ux_journey', journeyId, { key, name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { id: journeyId, key, name } }));\n } else {\n success(`Created UX journey \"${name}\" (${key})`, opts);\n }\n });\n\n// List UX journeys\nuxJourneyCommand\n .command('list')\n .alias('ls')\n .option('-p, --persona <key>', 'Filter by persona key')\n .description('List all UX journeys')\n .action((options) => {\n const opts = getOutputOptions(uxJourneyCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n let query = `SELECT j.key, j.name, j.description, p.name as persona_name, p.key as persona_key\n FROM ux_journeys j\n LEFT JOIN personas p ON j.persona_id = p.id\n WHERE j.project_id = (SELECT id FROM projects WHERE key = ?)`;\n const params: unknown[] = [config.project.key];\n\n if (options.persona) {\n query += ' AND p.key = ?';\n params.push(options.persona);\n }\n\n query += ' ORDER BY j.name';\n\n const journeys = queryAll<{\n key: string;\n name: string;\n description: string | null;\n persona_name: string | null;\n persona_key: string | null;\n }>(query, params);\n\n data(\n journeys.map(j => ({\n ...j,\n persona: j.persona_key ? `${j.persona_name} (${j.persona_key})` : '-'\n })),\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Name', key: 'name', width: 25 },\n { header: 'Persona', key: 'persona', width: 25 },\n { header: 'Description', key: 'description', width: 35 }\n ],\n opts\n );\n });\n\n// Show UX journey\nuxJourneyCommand\n .command('show')\n .argument('<key>', 'Journey key')\n .description('Show UX journey details')\n .action((key: string) => {\n const opts = getOutputOptions(uxJourneyCommand);\n\n const journey = queryOne<{\n id: string;\n key: string;\n name: string;\n description: string | null;\n persona_id: string | null;\n stages: string | null;\n touchpoints: string | null;\n pain_points: string | null;\n opportunities: string | null;\n created_at: string;\n updated_at: string;\n }>(\n `SELECT id, key, name, description, persona_id, stages, touchpoints, pain_points, opportunities, created_at, updated_at\n FROM ux_journeys WHERE key = ?`,\n [key]\n );\n\n if (!journey) {\n error(`UX journey \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n let personaInfo = '-';\n if (journey.persona_id) {\n const persona = queryOne<{ key: string; name: string }>('SELECT key, name FROM personas WHERE id = ?', [journey.persona_id]);\n if (persona) {\n personaInfo = `${persona.name} (${persona.key})`;\n }\n }\n\n details(\n { ...journey, persona: personaInfo },\n [\n { label: 'Key', key: 'key' },\n { label: 'Name', key: 'name' },\n { label: 'Persona', key: 'persona' },\n { label: 'Description', key: 'description' },\n { label: 'Stages', key: 'stages' },\n { label: 'Touchpoints', key: 'touchpoints' },\n { label: 'Pain Points', key: 'pain_points' },\n { label: 'Opportunities', key: 'opportunities' },\n { label: 'Created', key: 'created_at' },\n { label: 'Updated', key: 'updated_at' }\n ],\n opts\n );\n });\n\n// Update UX journey\nuxJourneyCommand\n .command('update')\n .argument('<key>', 'Journey key')\n .option('-n, --name <name>', 'Journey name')\n .option('-d, --description <description>', 'Journey description')\n .option('-p, --persona <key>', 'Associated persona key (use \"none\" to unlink)')\n .option('-s, --stages <stages>', 'Journey stages')\n .option('-t, --touchpoints <touchpoints>', 'Touchpoints')\n .option('--pain-points <painPoints>', 'Pain points')\n .option('--opportunities <opportunities>', 'Opportunities')\n .description('Update a UX journey')\n .action((key: string, options) => {\n const opts = getOutputOptions(uxJourneyCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const journey = queryOne<{ id: string }>('SELECT id FROM ux_journeys WHERE key = ?', [key]);\n if (!journey) {\n error(`UX journey \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n const changes: Record<string, unknown> = {};\n\n if (options.name !== undefined) {\n updates.push('name = ?');\n params.push(options.name);\n changes.name = options.name;\n }\n\n if (options.description !== undefined) {\n updates.push('description = ?');\n params.push(options.description);\n changes.description = options.description;\n }\n\n if (options.persona !== undefined) {\n if (options.persona === 'none') {\n updates.push('persona_id = NULL');\n changes.persona_id = null;\n } else {\n const persona = queryOne<{ id: string }>('SELECT id FROM personas WHERE key = ?', [options.persona]);\n if (!persona) {\n error(`Persona \"${options.persona}\" not found.`, opts);\n process.exit(1);\n }\n updates.push('persona_id = ?');\n params.push(persona.id);\n changes.persona_id = options.persona;\n }\n }\n\n if (options.stages !== undefined) {\n updates.push('stages = ?');\n params.push(options.stages);\n changes.stages = options.stages;\n }\n\n if (options.touchpoints !== undefined) {\n updates.push('touchpoints = ?');\n params.push(options.touchpoints);\n changes.touchpoints = options.touchpoints;\n }\n\n if (options.painPoints !== undefined) {\n updates.push('pain_points = ?');\n params.push(options.painPoints);\n changes.pain_points = options.painPoints;\n }\n\n if (options.opportunities !== undefined) {\n updates.push('opportunities = ?');\n params.push(options.opportunities);\n changes.opportunities = options.opportunities;\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(journey.id);\n\n run(`UPDATE ux_journeys SET ${updates.join(', ')} WHERE id = ?`, params);\n\n logActivity(project.id, 'ux_journey' as EntityType, journey.id, 'update', { newValue: changes });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key, ...changes } }));\n } else {\n success(`Updated UX journey \"${key}\"`, opts);\n }\n });\n\n// Delete UX journey\nuxJourneyCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Journey key')\n .option('-f, --force', 'Force delete without confirmation')\n .description('Delete a UX journey')\n .action((key: string) => {\n const opts = getOutputOptions(uxJourneyCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const journey = queryOne<{ id: string; key: string; name: string }>('SELECT id, key, name FROM ux_journeys WHERE key = ?', [key]);\n if (!journey) {\n error(`UX journey \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM ux_journeys WHERE id = ?', [journey.id]);\n\n logDelete(project.id, 'ux_journey', journey.id, { key: journey.key, name: journey.name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key } }));\n } else {\n success(`Deleted UX journey \"${key}\"`, opts);\n }\n });\n","/**\n * Document Command\n *\n * Document management and frontmatter metadata operations.\n * Allows querying, viewing, and updating document frontmatter.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { queryOne } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n data,\n details,\n getOutputOptions,\n type OutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n getDocumentByPath,\n getDocumentsByMetaStatus,\n getDocumentsByModule,\n getDocumentsWithFrontmatter,\n getDocumentsWithoutFrontmatter,\n getTemplateDocuments,\n searchDocumentsByTldr,\n DocumentWithMetadata\n} from '../services/file-scanner.js';\nimport {\n parseFrontmatterFromFile,\n updateFrontmatterContent,\n FrontmatterMetadata\n} from '../services/frontmatter-parser.js';\n\nexport const docCommand = new Command('doc')\n .description('Document management and frontmatter operations');\n\n/**\n * Helper to get project ID from config\n */\nfunction getProjectId(opts: OutputOptions): { projectId: string; projectRoot: string } | null {\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n return null;\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n return null;\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n return null;\n }\n\n return { projectId: project.id, projectRoot };\n}\n\n/**\n * Format document for display\n */\nfunction formatDocForDisplay(doc: DocumentWithMetadata): Record<string, unknown> {\n return {\n path: doc.path,\n filename: doc.filename,\n extension: doc.extension,\n sync_status: doc.status,\n has_frontmatter: doc.has_frontmatter ? 'Yes' : 'No',\n meta_status: doc.meta_status ?? '-',\n meta_version: doc.meta_version ?? '-',\n meta_tldr: doc.meta_tldr ?? '-',\n meta_modules: doc.meta_modules ? JSON.parse(doc.meta_modules).join(', ') : '-',\n meta_dependencies: doc.meta_dependencies ? JSON.parse(doc.meta_dependencies).join(', ') : '-'\n };\n}\n\n// List command - list documents with metadata filters\ndocCommand\n .command('list')\n .alias('ls')\n .option('--meta-status <status>', 'Filter by frontmatter status (DRAFT, IN-REVIEW, APPROVED, TEMPLATE)')\n .option('--module <module>', 'Filter by module')\n .option('--with-frontmatter', 'Only show documents with frontmatter')\n .option('--without-frontmatter', 'Only show documents without frontmatter (shadow mode)')\n .option('--templates', 'Only show TEMPLATE documents')\n .option('--search <term>', 'Search by tldr content')\n .description('List documents with metadata filters')\n .action((options) => {\n const opts = getOutputOptions(docCommand);\n const ctx = getProjectId(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n let documents: DocumentWithMetadata[] = [];\n\n if (options.metaStatus) {\n documents = getDocumentsByMetaStatus(ctx.projectId, options.metaStatus);\n } else if (options.module) {\n documents = getDocumentsByModule(ctx.projectId, options.module);\n } else if (options.withFrontmatter) {\n documents = getDocumentsWithFrontmatter(ctx.projectId);\n } else if (options.withoutFrontmatter) {\n documents = getDocumentsWithoutFrontmatter(ctx.projectId);\n } else if (options.templates) {\n documents = getTemplateDocuments(ctx.projectId);\n } else if (options.search) {\n documents = searchDocumentsByTldr(ctx.projectId, options.search);\n } else {\n // Default: all documents with frontmatter\n documents = getDocumentsWithFrontmatter(ctx.projectId);\n }\n\n const displayDocs = documents.map(formatDocForDisplay);\n\n data(\n displayDocs,\n [\n { header: 'Path', key: 'path', width: 45 },\n { header: 'Status', key: 'meta_status', width: 12 },\n { header: 'Version', key: 'meta_version', width: 8 },\n { header: 'Modules', key: 'meta_modules', width: 20 }\n ],\n opts\n );\n });\n\n// Show command - show document details\ndocCommand\n .command('show <path>')\n .description('Show document details including frontmatter metadata')\n .action((filePath: string) => {\n const opts = getOutputOptions(docCommand);\n const ctx = getProjectId(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n const doc = getDocumentByPath(ctx.projectId, filePath);\n if (!doc) {\n error(`Document not found: ${filePath}`, opts);\n process.exit(1);\n }\n\n // Parse live frontmatter from file\n const fullPath = join(ctx.projectRoot, filePath);\n const parsed = parseFrontmatterFromFile(fullPath);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n database: doc,\n frontmatter: parsed ? {\n raw: parsed.raw,\n metadata: parsed.metadata\n } : null\n }\n }));\n } else {\n const displayData: Record<string, unknown> = {\n path: doc.path,\n filename: doc.filename,\n extension: doc.extension,\n sync_status: doc.status,\n size_bytes: doc.size_bytes,\n last_scanned: doc.last_scanned_at,\n has_frontmatter: doc.has_frontmatter ? 'Yes' : 'No'\n };\n\n if (parsed) {\n displayData.meta_status = parsed.metadata.status ?? '-';\n displayData.meta_version = parsed.metadata.version ?? '-';\n displayData.meta_tldr = parsed.metadata.tldr ?? '-';\n displayData.meta_title = parsed.metadata.title ?? '-';\n displayData.meta_modules = parsed.metadata.modules?.join(', ') ?? '-';\n displayData.meta_dependencies = parsed.metadata.dependencies?.join(', ') ?? '-';\n displayData.meta_code_refs = parsed.metadata.code_refs?.join(', ') ?? '-';\n displayData.meta_authors = parsed.metadata.authors?.join(', ') ?? '-';\n }\n\n details(\n displayData,\n [\n { label: 'Path', key: 'path' },\n { label: 'Filename', key: 'filename' },\n { label: 'Extension', key: 'extension' },\n { label: 'Sync Status', key: 'sync_status' },\n { label: 'Size (bytes)', key: 'size_bytes' },\n { label: 'Last Scanned', key: 'last_scanned' },\n { label: 'Has Frontmatter', key: 'has_frontmatter' },\n { label: 'Meta Status', key: 'meta_status' },\n { label: 'Meta Version', key: 'meta_version' },\n { label: 'Meta Title', key: 'meta_title' },\n { label: 'Meta TLDR', key: 'meta_tldr' },\n { label: 'Meta Modules', key: 'meta_modules' },\n { label: 'Meta Dependencies', key: 'meta_dependencies' },\n { label: 'Meta Code Refs', key: 'meta_code_refs' },\n { label: 'Meta Authors', key: 'meta_authors' }\n ],\n opts\n );\n }\n });\n\n// Update command - update frontmatter metadata\ndocCommand\n .command('update <path>')\n .option('--status <status>', 'Set metadata status (DRAFT, IN-REVIEW, APPROVED, TEMPLATE, PRODUCTION)')\n .option('--version <version>', 'Set metadata version')\n .option('--tldr <tldr>', 'Set one-sentence summary')\n .option('--title <title>', 'Set document title')\n .option('--add-module <module>', 'Add a module to the modules list')\n .option('--add-dependency <dep>', 'Add a dependency path')\n .option('--add-code-ref <ref>', 'Add a code reference path')\n .option('--add-author <author>', 'Add an author')\n .option('--dry-run', 'Show what would be changed without modifying file')\n .description('Update frontmatter metadata in a document')\n .action((filePath: string, options) => {\n const opts = getOutputOptions(docCommand);\n const ctx = getProjectId(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n const fullPath = join(ctx.projectRoot, filePath);\n\n // Read current file content\n let content: string;\n try {\n content = readFileSync(fullPath, 'utf-8');\n } catch {\n error(`Could not read file: ${filePath}`, opts);\n process.exit(1);\n }\n\n // Build updates object\n const updates: Partial<FrontmatterMetadata> = {};\n\n if (options.status) {\n updates.status = options.status;\n }\n if (options.version) {\n updates.version = options.version;\n }\n if (options.tldr) {\n updates.tldr = options.tldr;\n }\n if (options.title) {\n updates.title = options.title;\n }\n if (options.addModule) {\n updates.modules = [options.addModule];\n }\n if (options.addDependency) {\n updates.dependencies = [options.addDependency];\n }\n if (options.addCodeRef) {\n updates.code_refs = [options.addCodeRef];\n }\n if (options.addAuthor) {\n updates.authors = [options.addAuthor];\n }\n\n if (Object.keys(updates).length === 0) {\n error('No updates specified. Use --status, --version, --tldr, etc.', opts);\n process.exit(1);\n }\n\n // Generate updated content\n const newContent = updateFrontmatterContent(content, updates);\n\n if (options.dryRun) {\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n dryRun: true,\n updates,\n preview: newContent.substring(0, 500) + (newContent.length > 500 ? '...' : '')\n }));\n } else {\n info('Dry run - would update frontmatter with:', opts);\n console.log(JSON.stringify(updates, null, 2));\n console.log('\\nNew frontmatter preview:');\n const lines = newContent.split('\\n');\n const endIndex = lines.findIndex((l, i) => i > 0 && l === '---');\n lines.slice(0, endIndex + 1).forEach(l => console.log(l));\n }\n return;\n }\n\n // Write updated content\n try {\n writeFileSync(fullPath, newContent, 'utf-8');\n success(`Updated frontmatter in ${filePath}`, opts);\n\n if (!opts.json) {\n info('Run \"aigile sync scan\" to update the database.', opts);\n }\n } catch (err) {\n error(`Could not write file: ${filePath}`, opts);\n process.exit(1);\n }\n });\n\n// Init command - add frontmatter to a file without it\ndocCommand\n .command('init-frontmatter <path>')\n .option('--status <status>', 'Initial status (default: DRAFT)')\n .option('--version <version>', 'Initial version (default: 0.1)')\n .option('--tldr <tldr>', 'One-sentence summary')\n .option('--title <title>', 'Document title')\n .description('Add frontmatter to a file that does not have it')\n .action((filePath: string, options) => {\n const opts = getOutputOptions(docCommand);\n const ctx = getProjectId(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n const fullPath = join(ctx.projectRoot, filePath);\n\n // Read current file content\n let content: string;\n try {\n content = readFileSync(fullPath, 'utf-8');\n } catch {\n error(`Could not read file: ${filePath}`, opts);\n process.exit(1);\n }\n\n // Check if file already has frontmatter\n const existing = parseFrontmatterFromFile(fullPath);\n if (existing) {\n error('File already has frontmatter. Use \"aigile doc update\" instead.', opts);\n process.exit(1);\n }\n\n // Build initial metadata\n const metadata: Partial<FrontmatterMetadata> = {\n status: options.status ?? 'DRAFT',\n version: options.version ?? '0.1',\n tldr: options.tldr ?? '',\n title: options.title\n };\n\n // Add frontmatter\n const newContent = updateFrontmatterContent(content, metadata);\n\n try {\n writeFileSync(fullPath, newContent, 'utf-8');\n success(`Added frontmatter to ${filePath}`, opts);\n\n if (!opts.json) {\n info('Run \"aigile sync scan\" to update the database.', opts);\n }\n } catch {\n error(`Could not write file: ${filePath}`, opts);\n process.exit(1);\n }\n });\n\n// Stats command - show frontmatter statistics\ndocCommand\n .command('stats')\n .description('Show frontmatter statistics for the project')\n .action(() => {\n const opts = getOutputOptions(docCommand);\n const ctx = getProjectId(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n const withFrontmatter = getDocumentsWithFrontmatter(ctx.projectId);\n const withoutFrontmatter = getDocumentsWithoutFrontmatter(ctx.projectId);\n const templates = getTemplateDocuments(ctx.projectId);\n const drafts = getDocumentsByMetaStatus(ctx.projectId, 'DRAFT');\n const inReview = getDocumentsByMetaStatus(ctx.projectId, 'IN-REVIEW');\n const approved = getDocumentsByMetaStatus(ctx.projectId, 'APPROVED');\n\n const stats = {\n total_documents: withFrontmatter.length + withoutFrontmatter.length,\n with_frontmatter: withFrontmatter.length,\n without_frontmatter: withoutFrontmatter.length,\n templates: templates.length,\n drafts: drafts.length,\n in_review: inReview.length,\n approved: approved.length\n };\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: stats }));\n } else {\n details(\n stats,\n [\n { label: 'Total Documents', key: 'total_documents' },\n { label: 'With Frontmatter', key: 'with_frontmatter' },\n { label: 'Without Frontmatter', key: 'without_frontmatter' },\n { label: 'TEMPLATE', key: 'templates' },\n { label: 'DRAFT', key: 'drafts' },\n { label: 'IN-REVIEW', key: 'in_review' },\n { label: 'APPROVED', key: 'approved' }\n ],\n opts\n );\n }\n });\n","/**\n * Daemon Command\n *\n * Manages the AIGILE file watcher daemon for automatic file synchronization.\n * Supports installation, start, stop, status, and uninstall operations.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { existsSync, writeFileSync, unlinkSync, readFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { homedir, platform } from 'os';\nimport { spawn, execSync } from 'child_process';\nimport { queryOne } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n warning,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig, getAigileHome } from '../utils/config.js';\nimport { createFileWatcher, FileWatcher } from '../services/file-watcher.js';\n\nexport const daemonCommand = new Command('daemon')\n .description('Manage the file watcher daemon');\n\n// Platform-specific paths and configurations\nconst PLATFORM = platform();\nconst DAEMON_NAME = 'com.aigile.watcher';\n\ninterface DaemonPaths {\n plist?: string; // macOS LaunchAgent plist\n service?: string; // Linux systemd service\n pidFile: string; // PID file location\n logFile: string; // Log file location\n}\n\nfunction getDaemonPaths(): DaemonPaths {\n const aigileHome = getAigileHome();\n const basePaths = {\n pidFile: join(aigileHome, 'daemon.pid'),\n logFile: join(aigileHome, 'daemon.log')\n };\n\n if (PLATFORM === 'darwin') {\n return {\n ...basePaths,\n plist: join(homedir(), 'Library', 'LaunchAgents', `${DAEMON_NAME}.plist`)\n };\n } else if (PLATFORM === 'linux') {\n return {\n ...basePaths,\n service: join(homedir(), '.config', 'systemd', 'user', `${DAEMON_NAME}.service`)\n };\n }\n\n return basePaths;\n}\n\n/**\n * Check if daemon is running\n */\nfunction isDaemonRunning(): { running: boolean; pid?: number } {\n const paths = getDaemonPaths();\n\n if (!existsSync(paths.pidFile)) {\n return { running: false };\n }\n\n try {\n const pid = parseInt(readFileSync(paths.pidFile, 'utf-8').trim(), 10);\n\n // Check if process is running\n try {\n process.kill(pid, 0); // Signal 0 = check if process exists\n return { running: true, pid };\n } catch {\n // Process not running, clean up stale PID file\n unlinkSync(paths.pidFile);\n return { running: false };\n }\n } catch {\n return { running: false };\n }\n}\n\n/**\n * Generate macOS LaunchAgent plist content\n */\nfunction generateLaunchAgentPlist(projectPath: string): string {\n const paths = getDaemonPaths();\n const nodePath = process.execPath;\n const aigilePath = join(dirname(dirname(import.meta.url.replace('file://', ''))), 'bin', 'aigile.js');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${DAEMON_NAME}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${aigilePath}</string>\n <string>daemon</string>\n <string>run</string>\n <string>--project</string>\n <string>${projectPath}</string>\n </array>\n <key>WorkingDirectory</key>\n <string>${projectPath}</string>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${paths.logFile}</string>\n <key>StandardErrorPath</key>\n <string>${paths.logFile}</string>\n</dict>\n</plist>`;\n}\n\n/**\n * Generate Linux systemd user service content\n */\nfunction generateSystemdService(projectPath: string): string {\n const paths = getDaemonPaths();\n const nodePath = process.execPath;\n const aigilePath = join(dirname(dirname(import.meta.url.replace('file://', ''))), 'bin', 'aigile.js');\n\n return `[Unit]\nDescription=AIGILE File Watcher Daemon\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=${nodePath} ${aigilePath} daemon run --project ${projectPath}\nWorkingDirectory=${projectPath}\nRestart=always\nRestartSec=5\nStandardOutput=append:${paths.logFile}\nStandardError=append:${paths.logFile}\n\n[Install]\nWantedBy=default.target`;\n}\n\n// Install command - install daemon to auto-start on boot\ndaemonCommand\n .command('install')\n .description('Install daemon to start automatically on system boot')\n .action(() => {\n const opts = getOutputOptions(daemonCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const paths = getDaemonPaths();\n\n if (PLATFORM === 'darwin') {\n // macOS LaunchAgent\n const plistDir = dirname(paths.plist!);\n if (!existsSync(plistDir)) {\n mkdirSync(plistDir, { recursive: true });\n }\n\n const plistContent = generateLaunchAgentPlist(projectRoot);\n writeFileSync(paths.plist!, plistContent);\n\n success('Installed macOS LaunchAgent', opts);\n info(`Plist location: ${paths.plist}`, opts);\n info('Run \"aigile daemon start\" to start the watcher', opts);\n\n } else if (PLATFORM === 'linux') {\n // Linux systemd user service\n const serviceDir = dirname(paths.service!);\n if (!existsSync(serviceDir)) {\n mkdirSync(serviceDir, { recursive: true });\n }\n\n const serviceContent = generateSystemdService(projectRoot);\n writeFileSync(paths.service!, serviceContent);\n\n // Reload systemd user daemon\n try {\n execSync('systemctl --user daemon-reload');\n execSync(`systemctl --user enable ${DAEMON_NAME}`);\n success('Installed and enabled systemd user service', opts);\n info(`Service location: ${paths.service}`, opts);\n info('Run \"aigile daemon start\" to start the watcher', opts);\n } catch (err) {\n warning('Service file created but could not enable. You may need to run:', opts);\n console.log(` systemctl --user daemon-reload`);\n console.log(` systemctl --user enable ${DAEMON_NAME}`);\n }\n\n } else {\n error(`Daemon installation not supported on ${PLATFORM}`, opts);\n info('You can run \"aigile daemon run\" manually instead', opts);\n process.exit(1);\n }\n });\n\n// Uninstall command - remove daemon from auto-start\ndaemonCommand\n .command('uninstall')\n .description('Remove daemon from auto-start')\n .action(() => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n // Stop daemon first\n const status = isDaemonRunning();\n if (status.running) {\n info('Stopping daemon first...', opts);\n try {\n process.kill(status.pid!, 'SIGTERM');\n } catch {\n // Ignore\n }\n }\n\n if (PLATFORM === 'darwin' && paths.plist && existsSync(paths.plist)) {\n try {\n execSync(`launchctl unload ${paths.plist}`);\n } catch {\n // Might not be loaded\n }\n unlinkSync(paths.plist);\n success('Removed macOS LaunchAgent', opts);\n\n } else if (PLATFORM === 'linux' && paths.service && existsSync(paths.service)) {\n try {\n execSync(`systemctl --user stop ${DAEMON_NAME}`);\n execSync(`systemctl --user disable ${DAEMON_NAME}`);\n } catch {\n // Might not be running\n }\n unlinkSync(paths.service);\n try {\n execSync('systemctl --user daemon-reload');\n } catch {\n // Ignore\n }\n success('Removed systemd user service', opts);\n\n } else {\n info('No daemon installation found', opts);\n }\n\n // Clean up PID file\n if (existsSync(paths.pidFile)) {\n unlinkSync(paths.pidFile);\n }\n });\n\n// Start command - start the daemon\ndaemonCommand\n .command('start')\n .description('Start the file watcher daemon')\n .action(() => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n const status = isDaemonRunning();\n if (status.running) {\n info(`Daemon already running (PID: ${status.pid})`, opts);\n return;\n }\n\n if (PLATFORM === 'darwin' && paths.plist && existsSync(paths.plist)) {\n try {\n execSync(`launchctl load ${paths.plist}`);\n success('Started daemon via launchctl', opts);\n } catch (err) {\n error('Failed to start daemon via launchctl', opts);\n process.exit(1);\n }\n\n } else if (PLATFORM === 'linux' && paths.service && existsSync(paths.service)) {\n try {\n execSync(`systemctl --user start ${DAEMON_NAME}`);\n success('Started daemon via systemctl', opts);\n } catch (err) {\n error('Failed to start daemon via systemctl', opts);\n process.exit(1);\n }\n\n } else {\n // Fallback: start as background process\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const child = spawn(process.execPath, [process.argv[1], 'daemon', 'run', '--project', projectRoot], {\n detached: true,\n stdio: 'ignore'\n });\n\n child.unref();\n\n if (child.pid) {\n writeFileSync(paths.pidFile, String(child.pid));\n success(`Started daemon (PID: ${child.pid})`, opts);\n } else {\n error('Failed to start daemon', opts);\n process.exit(1);\n }\n }\n });\n\n// Stop command - stop the daemon\ndaemonCommand\n .command('stop')\n .description('Stop the file watcher daemon')\n .action(() => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n if (PLATFORM === 'darwin' && paths.plist && existsSync(paths.plist)) {\n try {\n execSync(`launchctl unload ${paths.plist}`);\n success('Stopped daemon via launchctl', opts);\n } catch {\n // Might not be loaded\n info('Daemon was not running', opts);\n }\n\n } else if (PLATFORM === 'linux' && paths.service && existsSync(paths.service)) {\n try {\n execSync(`systemctl --user stop ${DAEMON_NAME}`);\n success('Stopped daemon via systemctl', opts);\n } catch {\n info('Daemon was not running', opts);\n }\n\n } else {\n const status = isDaemonRunning();\n if (status.running && status.pid) {\n try {\n process.kill(status.pid, 'SIGTERM');\n if (existsSync(paths.pidFile)) {\n unlinkSync(paths.pidFile);\n }\n success(`Stopped daemon (PID: ${status.pid})`, opts);\n } catch {\n error('Failed to stop daemon', opts);\n process.exit(1);\n }\n } else {\n info('Daemon is not running', opts);\n }\n }\n });\n\n// Status command - show daemon status\ndaemonCommand\n .command('status')\n .description('Show daemon status')\n .action(() => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n const status = isDaemonRunning();\n\n const statusInfo: Record<string, unknown> = {\n running: status.running ? 'Yes' : 'No',\n pid: status.pid ?? '-',\n platform: PLATFORM,\n pid_file: paths.pidFile,\n log_file: paths.logFile\n };\n\n if (PLATFORM === 'darwin') {\n statusInfo.plist = paths.plist ?? '-';\n statusInfo.installed = paths.plist && existsSync(paths.plist) ? 'Yes' : 'No';\n } else if (PLATFORM === 'linux') {\n statusInfo.service = paths.service ?? '-';\n statusInfo.installed = paths.service && existsSync(paths.service) ? 'Yes' : 'No';\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: statusInfo }));\n } else {\n details(\n statusInfo,\n [\n { label: 'Running', key: 'running' },\n { label: 'PID', key: 'pid' },\n { label: 'Platform', key: 'platform' },\n { label: 'Installed', key: 'installed' },\n { label: 'PID File', key: 'pid_file' },\n { label: 'Log File', key: 'log_file' }\n ],\n opts\n );\n }\n });\n\n// Run command - run the watcher in foreground (used by daemon)\ndaemonCommand\n .command('run')\n .option('--project <path>', 'Project path to watch')\n .description('Run the file watcher in foreground (used by daemon)')\n .action(async (options) => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n let projectRoot = options.project;\n if (!projectRoot) {\n projectRoot = findProjectRoot();\n }\n\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Write PID file\n writeFileSync(paths.pidFile, String(process.pid));\n\n // Create and start file watcher\n const watcher = createFileWatcher({\n projectId: project.id,\n projectPath: projectRoot,\n useGitignore: true\n });\n\n watcher.on('ready', (stats) => {\n console.log(`[${new Date().toISOString()}] Watcher ready - watching ${stats.filesWatched} files`);\n });\n\n watcher.on('sync', (event) => {\n console.log(`[${new Date().toISOString()}] Synced: ${event.type} ${event.path}`);\n });\n\n watcher.on('syncError', ({ event, error: err }) => {\n console.error(`[${new Date().toISOString()}] Sync error: ${event.type} ${event.path} - ${err}`);\n });\n\n watcher.on('error', (err) => {\n console.error(`[${new Date().toISOString()}] Watcher error: ${err}`);\n });\n\n // Handle shutdown signals\n const shutdown = async () => {\n console.log(`[${new Date().toISOString()}] Shutting down...`);\n await watcher.stop();\n if (existsSync(paths.pidFile)) {\n unlinkSync(paths.pidFile);\n }\n process.exit(0);\n };\n\n process.on('SIGTERM', shutdown);\n process.on('SIGINT', shutdown);\n\n // Start watching\n watcher.start();\n console.log(`[${new Date().toISOString()}] Starting file watcher for ${projectRoot}...`);\n });\n\n// Logs command - show recent logs\ndaemonCommand\n .command('logs')\n .option('-n, --lines <number>', 'Number of lines to show', '50')\n .option('-f, --follow', 'Follow log output')\n .description('Show daemon logs')\n .action((options) => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n if (!existsSync(paths.logFile)) {\n info('No log file found. Daemon may not have run yet.', opts);\n return;\n }\n\n if (options.follow) {\n // Use tail -f\n const tail = spawn('tail', ['-f', paths.logFile], {\n stdio: 'inherit'\n });\n\n process.on('SIGINT', () => {\n tail.kill();\n process.exit(0);\n });\n } else {\n // Show last N lines\n try {\n const output = execSync(`tail -n ${options.lines} \"${paths.logFile}\"`, { encoding: 'utf-8' });\n console.log(output);\n } catch {\n error('Failed to read log file', opts);\n }\n }\n });\n","/**\n * File Watcher Service\n *\n * Watches repository files for changes and automatically syncs\n * to the AIGILE database. Uses chokidar for cross-platform file watching.\n *\n * @author Vladimir K.S.\n */\n\nimport { watch, FSWatcher } from 'chokidar';\nimport { join, relative, extname, dirname } from 'path';\nimport { existsSync, readFileSync, statSync } from 'fs';\nimport { EventEmitter } from 'events';\nimport { queryOne, run, generateId } from '../db/connection.js';\nimport { computeFileHash } from './file-scanner.js';\nimport { parseFrontmatterFromFile, FrontmatterMetadata } from './frontmatter-parser.js';\n\nexport interface WatcherConfig {\n projectId: string;\n projectPath: string;\n patterns?: string[];\n ignore?: string[];\n useGitignore?: boolean;\n debounceMs?: number;\n}\n\nexport interface WatchEvent {\n type: 'add' | 'change' | 'unlink';\n path: string;\n timestamp: Date;\n}\n\nexport interface WatcherStats {\n isRunning: boolean;\n startedAt: Date | null;\n filesWatched: number;\n eventsProcessed: number;\n lastEvent: WatchEvent | null;\n}\n\nconst DEFAULT_PATTERNS = ['**/*.md', '**/*.feature', '**/*.yaml', '**/*.yml'];\nconst DEFAULT_IGNORE = [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/coverage/**',\n '**/.aigile/**'\n];\n\n/**\n * File Watcher Service - watches for file changes and syncs to database\n */\nexport class FileWatcher extends EventEmitter {\n private watcher: FSWatcher | null = null;\n private config: WatcherConfig;\n private stats: WatcherStats;\n private debounceTimers: Map<string, NodeJS.Timeout> = new Map();\n\n constructor(config: WatcherConfig) {\n super();\n this.config = {\n patterns: DEFAULT_PATTERNS,\n ignore: DEFAULT_IGNORE,\n useGitignore: true,\n debounceMs: 300,\n ...config\n };\n\n this.stats = {\n isRunning: false,\n startedAt: null,\n filesWatched: 0,\n eventsProcessed: 0,\n lastEvent: null\n };\n }\n\n /**\n * Start watching for file changes\n */\n start(): void {\n if (this.watcher) {\n return; // Already running\n }\n\n const watchPaths = this.config.patterns!.map(p => join(this.config.projectPath, p));\n const ignorePatterns = this.buildIgnorePatterns();\n\n this.watcher = watch(watchPaths, {\n ignored: ignorePatterns,\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 200,\n pollInterval: 100\n }\n });\n\n this.watcher.on('add', (path) => this.handleFileEvent('add', path));\n this.watcher.on('change', (path) => this.handleFileEvent('change', path));\n this.watcher.on('unlink', (path) => this.handleFileEvent('unlink', path));\n this.watcher.on('error', (error) => this.emit('error', error));\n\n this.watcher.on('ready', () => {\n this.stats.isRunning = true;\n this.stats.startedAt = new Date();\n this.stats.filesWatched = this.getWatchedFilesCount();\n this.emit('ready', this.stats);\n });\n }\n\n /**\n * Stop watching for file changes\n */\n async stop(): Promise<void> {\n if (!this.watcher) {\n return;\n }\n\n // Clear all debounce timers\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n\n await this.watcher.close();\n this.watcher = null;\n this.stats.isRunning = false;\n this.emit('stopped');\n }\n\n /**\n * Get current watcher statistics\n */\n getStats(): WatcherStats {\n return { ...this.stats };\n }\n\n /**\n * Build ignore patterns including gitignore if enabled\n */\n private buildIgnorePatterns(): (string | RegExp)[] {\n const patterns: (string | RegExp)[] = [...(this.config.ignore || [])];\n\n if (this.config.useGitignore) {\n const gitignorePath = join(this.config.projectPath, '.gitignore');\n if (existsSync(gitignorePath)) {\n const gitignorePatterns = parseGitignore(gitignorePath);\n patterns.push(...gitignorePatterns);\n }\n }\n\n return patterns;\n }\n\n /**\n * Handle a file event with debouncing\n */\n private handleFileEvent(type: 'add' | 'change' | 'unlink', absolutePath: string): void {\n // Clear existing debounce timer for this path\n const existingTimer = this.debounceTimers.get(absolutePath);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set new debounce timer\n const timer = setTimeout(() => {\n this.debounceTimers.delete(absolutePath);\n this.processFileEvent(type, absolutePath);\n }, this.config.debounceMs);\n\n this.debounceTimers.set(absolutePath, timer);\n }\n\n /**\n * Process a file event (after debounce)\n */\n private processFileEvent(type: 'add' | 'change' | 'unlink', absolutePath: string): void {\n const relativePath = relative(this.config.projectPath, absolutePath);\n const event: WatchEvent = {\n type,\n path: relativePath,\n timestamp: new Date()\n };\n\n this.stats.lastEvent = event;\n this.stats.eventsProcessed++;\n\n try {\n switch (type) {\n case 'add':\n this.syncFileAdd(absolutePath, relativePath);\n break;\n case 'change':\n this.syncFileChange(absolutePath, relativePath);\n break;\n case 'unlink':\n this.syncFileDelete(relativePath);\n break;\n }\n\n this.emit('sync', event);\n } catch (error) {\n this.emit('syncError', { event, error });\n }\n }\n\n /**\n * Sync a new file to the database\n */\n private syncFileAdd(absolutePath: string, relativePath: string): void {\n const ext = extname(relativePath).slice(1);\n const filename = relativePath.split('/').pop() || relativePath;\n\n try {\n const stats = statSync(absolutePath);\n const hash = computeFileHash(absolutePath);\n\n // Parse frontmatter for markdown files\n let hasFrontmatter = false;\n let frontmatterRaw: string | null = null;\n let metadata: FrontmatterMetadata | null = null;\n\n if (ext === 'md' || ext === 'markdown') {\n const parsed = parseFrontmatterFromFile(absolutePath);\n if (parsed) {\n hasFrontmatter = true;\n frontmatterRaw = parsed.raw;\n metadata = parsed.metadata;\n }\n }\n\n // Check if document already exists\n const existing = queryOne<{ id: string }>(\n 'SELECT id FROM documents WHERE project_id = ? AND path = ?',\n [this.config.projectId, relativePath]\n );\n\n if (existing) {\n // Update existing\n this.updateDocument(existing.id, hash, stats.size, hasFrontmatter, frontmatterRaw, metadata);\n } else {\n // Insert new\n this.insertDocument(relativePath, filename, ext, hash, stats.size, hasFrontmatter, frontmatterRaw, metadata);\n }\n } catch {\n // File might have been deleted before we could process it\n }\n }\n\n /**\n * Sync a changed file to the database\n */\n private syncFileChange(absolutePath: string, relativePath: string): void {\n // Same logic as add - upsert behavior\n this.syncFileAdd(absolutePath, relativePath);\n }\n\n /**\n * Mark a file as deleted in the database\n */\n private syncFileDelete(relativePath: string): void {\n const doc = queryOne<{ id: string }>(\n 'SELECT id FROM documents WHERE project_id = ? AND path = ?',\n [this.config.projectId, relativePath]\n );\n\n if (doc) {\n run(\n `UPDATE documents SET status = 'deleted', updated_at = datetime('now') WHERE id = ?`,\n [doc.id]\n );\n }\n }\n\n /**\n * Insert a new document into the database\n */\n private insertDocument(\n path: string,\n filename: string,\n extension: string,\n hash: string,\n size: number,\n hasFrontmatter: boolean,\n frontmatterRaw: string | null,\n metadata: FrontmatterMetadata | null\n ): void {\n const now = new Date().toISOString();\n\n run(\n `INSERT INTO documents (\n id, project_id, path, filename, extension, content_hash, size_bytes, status, last_scanned_at,\n has_frontmatter, frontmatter_raw, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'tracked', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n generateId(),\n this.config.projectId,\n path,\n filename,\n extension,\n hash,\n size,\n now,\n hasFrontmatter ? 1 : 0,\n frontmatterRaw,\n metadata?.status ?? null,\n metadata?.version ?? null,\n metadata?.tldr ?? null,\n metadata?.title ?? null,\n metadata?.modules ? JSON.stringify(metadata.modules) : null,\n metadata?.dependencies ? JSON.stringify(metadata.dependencies) : null,\n metadata?.code_refs ? JSON.stringify(metadata.code_refs) : null,\n metadata?.authors ? JSON.stringify(metadata.authors) : null\n ]\n );\n }\n\n /**\n * Update an existing document in the database\n */\n private updateDocument(\n id: string,\n hash: string,\n size: number,\n hasFrontmatter: boolean,\n frontmatterRaw: string | null,\n metadata: FrontmatterMetadata | null\n ): void {\n const now = new Date().toISOString();\n\n run(\n `UPDATE documents SET\n content_hash = ?, size_bytes = ?, status = 'tracked', last_scanned_at = ?, updated_at = datetime('now'),\n has_frontmatter = ?, frontmatter_raw = ?, meta_status = ?, meta_version = ?, meta_tldr = ?, meta_title = ?,\n meta_modules = ?, meta_dependencies = ?, meta_code_refs = ?, meta_authors = ?\n WHERE id = ?`,\n [\n hash,\n size,\n now,\n hasFrontmatter ? 1 : 0,\n frontmatterRaw,\n metadata?.status ?? null,\n metadata?.version ?? null,\n metadata?.tldr ?? null,\n metadata?.title ?? null,\n metadata?.modules ? JSON.stringify(metadata.modules) : null,\n metadata?.dependencies ? JSON.stringify(metadata.dependencies) : null,\n metadata?.code_refs ? JSON.stringify(metadata.code_refs) : null,\n metadata?.authors ? JSON.stringify(metadata.authors) : null,\n id\n ]\n );\n }\n\n /**\n * Get count of watched files (approximate)\n */\n private getWatchedFilesCount(): number {\n if (!this.watcher) {\n return 0;\n }\n const watched = this.watcher.getWatched();\n let count = 0;\n for (const dir of Object.keys(watched)) {\n count += watched[dir].length;\n }\n return count;\n }\n}\n\n/**\n * Parse a .gitignore file and convert patterns to chokidar-compatible format\n */\nexport function parseGitignore(gitignorePath: string): string[] {\n try {\n const content = readFileSync(gitignorePath, 'utf-8');\n const patterns: string[] = [];\n\n for (let line of content.split('\\n')) {\n line = line.trim();\n\n // Skip empty lines and comments\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n // Handle negation (not fully supported, skip for now)\n if (line.startsWith('!')) {\n continue;\n }\n\n // Convert gitignore patterns to glob patterns\n let pattern = line;\n\n // Remove leading slash (means relative to repo root)\n if (pattern.startsWith('/')) {\n pattern = pattern.slice(1);\n }\n\n // Add ** prefix for patterns that should match anywhere\n if (!pattern.startsWith('**/') && !pattern.includes('/')) {\n pattern = `**/${pattern}`;\n }\n\n // Add trailing /** for directory patterns\n if (pattern.endsWith('/')) {\n pattern = pattern.slice(0, -1) + '/**';\n }\n\n patterns.push(pattern);\n }\n\n return patterns;\n } catch {\n return [];\n }\n}\n\n/**\n * Create a watcher instance (factory function)\n */\nexport function createFileWatcher(config: WatcherConfig): FileWatcher {\n return new FileWatcher(config);\n}\n"],"mappings":"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","names":["dbPath","existsSync","readFileSync","writeFileSync","mkdirSync","data","Command","existsSync","mkdirSync","readFileSync","writeFileSync","join","basename","join","existsSync","mkdirSync","writeFileSync","join","dirname","join","existsSync","basename","mkdirSync","writeFileSync","readFileSync","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","join","readFileSync","existsSync","join","relative","readFileSync","parseYaml","data","readFileSync","existsSync","join","relative","readFileSync","Command","join","queryAll","Command","data","data","Command","calculateDuration","Command","calculateDuration","Command","Command","p","Command","Command","calculateDuration","calculateDuration","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","readFileSync","writeFileSync","join","Command","join","readFileSync","writeFileSync","Command","existsSync","writeFileSync","readFileSync","mkdirSync","join","dirname","homedir","execSync","join","relative","extname","existsSync","readFileSync","statSync","DEFAULT_PATTERNS","DEFAULT_IGNORE","join","error","existsSync","relative","extname","statSync","readFileSync","Command","join","homedir","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","execSync","Command"]}
1
+ {"version":3,"sources":["../../src/config/monitoring-patterns.ts","../../src/utils/config.ts","../../src/db/connection.ts","../../src/bin/aigile.ts","../../src/index.ts","../../src/commands/init.ts","../../src/utils/git.ts","../../src/services/output-formatter.ts","../../src/services/template-packs.ts","../../src/commands/project.ts","../../src/commands/epic.ts","../../src/services/workflow-engine.ts","../../src/commands/story.ts","../../src/commands/task.ts","../../src/commands/bug.ts","../../src/commands/sprint.ts","../../src/utils/date.ts","../../src/commands/status.ts","../../src/commands/initiative.ts","../../src/commands/sync.ts","../../src/services/file-scanner.ts","../../src/services/frontmatter-parser.ts","../../src/services/comment-parser.ts","../../src/commands/session.ts","../../src/services/session-service.ts","../../src/services/activity-logger.ts","../../src/commands/context.ts","../../src/services/context-loader.ts","../../src/commands/query.ts","../../src/services/query-service.ts","../../src/commands/ai.ts","../../src/services/ai-helper.ts","../../src/commands/component.ts","../../src/commands/version.ts","../../src/commands/persona.ts","../../src/commands/ux-journey.ts","../../src/commands/doc.ts","../../src/commands/daemon.ts","../../src/services/daemon-manager.ts","../../src/services/file-watcher.ts","../../src/commands/file.ts"],"sourcesContent":["/**\n * Monitoring Patterns Configuration\n *\n * Central configuration for file monitoring patterns used by both\n * file-watcher and file-scanner services.\n *\n * Tri-State Monitoring System:\n * - ALLOW: Focus files - fully tracked + parsed\n * - DENY: Ignored files - skip entirely (no resources wasted)\n * - UNKNOWN: Files not in either list - tracked minimally, flagged for review\n *\n * @author Vladimir K.S.\n */\n\n/**\n * Hard ignores - ALWAYS ignored (can't be overridden by user config)\n * These patterns prevent infinite loops and system conflicts\n */\nexport const HARD_IGNORE = [\n // Git directory - internal git data\n '**/.git/**',\n\n // Database files - CRITICAL: prevents infinite sync loops\n '**/*.db',\n '**/*.db-journal',\n '**/*.db-wal',\n '**/*.db-shm',\n '**/*.sqlite',\n '**/*.sqlite3',\n\n // Lock and PID files\n '**/*.pid',\n '**/*.lock',\n\n // OS metadata files\n '**/.DS_Store',\n '**/Thumbs.db',\n '**/.Spotlight-V100/**',\n '**/.Trashes/**',\n '**/ehthumbs.db',\n '**/Desktop.ini',\n];\n\n/**\n * Default allow patterns (focus files)\n * These files are fully tracked with content parsing\n * User can extend via config.yaml sync.allow_patterns\n */\nexport const DEFAULT_ALLOW = [\n // Documentation\n '**/*.md',\n '**/*.markdown',\n '**/*.txt',\n '**/*.rst',\n '**/*.adoc',\n\n // BDD Features\n '**/*.feature',\n '**/*.gherkin',\n\n // Code - TypeScript/JavaScript\n '**/*.ts',\n '**/*.tsx',\n '**/*.js',\n '**/*.jsx',\n '**/*.mjs',\n '**/*.cjs',\n\n // Code - Python\n '**/*.py',\n '**/*.pyi',\n '**/*.pyx',\n\n // Code - Go\n '**/*.go',\n '**/*.mod',\n '**/*.sum',\n\n // Code - Rust\n '**/*.rs',\n\n // Code - Java/JVM\n '**/*.java',\n '**/*.kt',\n '**/*.kts',\n '**/*.scala',\n '**/*.groovy',\n\n // Code - C/C++\n '**/*.c',\n '**/*.cpp',\n '**/*.cc',\n '**/*.cxx',\n '**/*.h',\n '**/*.hpp',\n '**/*.hxx',\n\n // Code - Ruby\n '**/*.rb',\n '**/*.rake',\n '**/Rakefile',\n '**/Gemfile',\n\n // Code - PHP\n '**/*.php',\n\n // Code - Shell\n '**/*.sh',\n '**/*.bash',\n '**/*.zsh',\n '**/*.fish',\n\n // Config - YAML\n '**/*.yaml',\n '**/*.yml',\n\n // Config - JSON\n '**/*.json',\n '**/*.jsonc',\n '**/*.json5',\n\n // Config - TOML\n '**/*.toml',\n\n // Config - XML\n '**/*.xml',\n '**/*.xsd',\n '**/*.xsl',\n '**/*.xslt',\n '**/*.plist',\n\n // Config - INI/ENV\n '**/*.ini',\n '**/*.env',\n '**/*.env.*',\n '**/*.properties',\n '**/*.cfg',\n '**/*.conf',\n\n // Data formats\n '**/*.csv',\n '**/*.tsv',\n '**/*.sql',\n '**/*.graphql',\n '**/*.gql',\n\n // Web templates\n '**/*.html',\n '**/*.htm',\n '**/*.css',\n '**/*.scss',\n '**/*.sass',\n '**/*.less',\n '**/*.vue',\n '**/*.svelte',\n\n // Build files\n '**/Dockerfile',\n '**/Dockerfile.*',\n '**/docker-compose.yml',\n '**/docker-compose.yaml',\n '**/docker-compose.*.yml',\n '**/docker-compose.*.yaml',\n '**/Makefile',\n '**/CMakeLists.txt',\n\n // Package manifests\n '**/package.json',\n '**/tsconfig.json',\n '**/tsconfig.*.json',\n '**/jsconfig.json',\n '**/pyproject.toml',\n '**/setup.py',\n '**/setup.cfg',\n '**/requirements.txt',\n '**/requirements-*.txt',\n '**/Cargo.toml',\n '**/Cargo.lock',\n '**/go.mod',\n '**/go.sum',\n '**/pom.xml',\n '**/build.gradle',\n '**/settings.gradle',\n];\n\n/**\n * Default deny patterns (soft ignores)\n * These can be overridden via .aigile/ignore file\n * Files matching these patterns are completely skipped\n */\nexport const DEFAULT_DENY = [\n // Package managers\n '**/node_modules/**',\n '**/bower_components/**',\n '**/vendor/**',\n '**/.pnpm-store/**',\n '**/pnpm-lock.yaml',\n '**/package-lock.json',\n '**/yarn.lock',\n\n // Build output\n '**/dist/**',\n '**/build/**',\n '**/out/**',\n '**/target/**',\n '**/__pycache__/**',\n '**/*.pyc',\n '**/*.pyo',\n '**/*.class',\n '**/*.o',\n '**/*.obj',\n '**/*.so',\n '**/*.dll',\n '**/*.dylib',\n '**/*.exe',\n\n // Test coverage\n '**/coverage/**',\n '**/.nyc_output/**',\n '**/.coverage/**',\n '**/htmlcov/**',\n\n // IDE/Editor\n '**/.idea/**',\n '**/.vscode/**',\n '**/.vs/**',\n '**/*.swp',\n '**/*.swo',\n '**/*~',\n '**/.*.swp',\n\n // Temp files\n '**/*.tmp',\n '**/*.temp',\n '**/*.bak',\n '**/*.backup',\n '**/*.old',\n\n // Log files\n '**/*.log',\n '**/logs/**',\n '**/npm-debug.log*',\n '**/yarn-debug.log*',\n '**/yarn-error.log*',\n\n // Cache\n '**/.cache/**',\n '**/.parcel-cache/**',\n '**/.next/**',\n '**/.nuxt/**',\n '**/.turbo/**',\n\n // Environment\n '**/.env.local',\n '**/.env.*.local',\n\n // Misc\n '**/.terraform/**',\n '**/terraform.tfstate*',\n];\n\n/**\n * Binary file extensions (tracked with metadata only, no content parsing)\n */\nexport const BINARY_EXTENSIONS = [\n // Images\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.bmp',\n '.ico',\n '.svg',\n '.webp',\n '.tiff',\n '.tif',\n '.psd',\n '.ai',\n\n // Documents\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.odt',\n '.ods',\n '.odp',\n\n // Archives\n '.zip',\n '.tar',\n '.gz',\n '.bz2',\n '.xz',\n '.7z',\n '.rar',\n\n // Audio\n '.mp3',\n '.wav',\n '.ogg',\n '.flac',\n '.aac',\n '.m4a',\n\n // Video\n '.mp4',\n '.webm',\n '.mkv',\n '.avi',\n '.mov',\n '.wmv',\n\n // Fonts\n '.ttf',\n '.otf',\n '.woff',\n '.woff2',\n '.eot',\n\n // Compiled\n '.wasm',\n '.node',\n];\n\n/**\n * Monitoring categories\n */\nexport type MonitoringCategory = 'allow' | 'deny' | 'unknown';\n\n/**\n * Check if a file extension indicates a binary file\n */\nexport function isBinaryExtension(extension: string): boolean {\n const ext = extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n return BINARY_EXTENSIONS.includes(ext);\n}\n\n/**\n * Get all hard ignore patterns (glob format for chokidar)\n */\nexport function getHardIgnorePatterns(): string[] {\n return [...HARD_IGNORE];\n}\n\n/**\n * Get default allow patterns\n */\nexport function getDefaultAllowPatterns(): string[] {\n return [...DEFAULT_ALLOW];\n}\n\n/**\n * Get default deny patterns\n */\nexport function getDefaultDenyPatterns(): string[] {\n return [...DEFAULT_DENY];\n}\n","/**\n * Configuration Loader\n *\n * Handles loading and saving AIGILE configuration files.\n *\n * @author Vladimir K.S.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport {\n getDefaultAllowPatterns,\n getDefaultDenyPatterns,\n} from '../config/monitoring-patterns.js';\n\n/**\n * Global configuration structure (~/.aigile/config.yaml)\n */\nexport interface GlobalConfig {\n version: number;\n database: {\n path: string;\n backup_enabled: boolean;\n backup_frequency: 'daily' | 'weekly' | 'manual';\n max_backups: number;\n };\n default_project: {\n key: string | null;\n name: string | null;\n };\n preferences: {\n date_format: string;\n time_format: string;\n timezone: string;\n theme: string;\n };\n}\n\n/**\n * Local project configuration structure (.aigile/config.yaml)\n */\nexport interface ProjectConfig {\n project: {\n key: string;\n name: string;\n };\n sync: {\n enabled: boolean;\n patterns: string[];\n ignore: string[];\n };\n}\n\n/**\n * Get the AIGILE home directory (~/.aigile)\n */\nexport function getAigileHome(): string {\n const home = process.env.AIGILE_HOME ?? join(homedir(), '.aigile');\n return home;\n}\n\n/**\n * Get the database path\n */\nexport function getDbPath(): string {\n const dbPath = process.env.AIGILE_DB_PATH ?? join(getAigileHome(), 'aigile.db');\n return dbPath;\n}\n\n/**\n * Ensure the AIGILE home directory exists\n */\nexport function ensureAigileHome(): void {\n const home = getAigileHome();\n\n if (!existsSync(home)) {\n mkdirSync(home, { recursive: true });\n }\n\n // Create subdirectories\n const subdirs = ['fields', 'workflows', 'templates', 'backups'];\n for (const subdir of subdirs) {\n const path = join(home, subdir);\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n }\n}\n\n/**\n * Get default global configuration\n */\nexport function getDefaultGlobalConfig(): GlobalConfig {\n return {\n version: 1,\n database: {\n path: join(getAigileHome(), 'aigile.db'),\n backup_enabled: true,\n backup_frequency: 'daily',\n max_backups: 7\n },\n default_project: {\n key: null,\n name: null\n },\n preferences: {\n date_format: 'YYYY-MM-DD',\n time_format: 'HH:mm',\n timezone: 'UTC',\n theme: 'default'\n }\n };\n}\n\n/**\n * Load global configuration\n */\nexport function loadGlobalConfig(): GlobalConfig {\n const configPath = join(getAigileHome(), 'config.yaml');\n\n if (!existsSync(configPath)) {\n return getDefaultGlobalConfig();\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n const config = parseYaml(content) as Partial<GlobalConfig>;\n return { ...getDefaultGlobalConfig(), ...config };\n } catch {\n return getDefaultGlobalConfig();\n }\n}\n\n/**\n * Save global configuration\n */\nexport function saveGlobalConfig(config: GlobalConfig): void {\n ensureAigileHome();\n const configPath = join(getAigileHome(), 'config.yaml');\n const content = stringifyYaml(config);\n writeFileSync(configPath, content, 'utf-8');\n}\n\n/**\n * Get default project configuration\n */\nexport function getDefaultProjectConfig(key: string, name: string): ProjectConfig {\n return {\n project: {\n key,\n name\n },\n sync: {\n enabled: true,\n patterns: ['*.feature', '*.md'],\n ignore: ['node_modules', 'dist', '.git']\n }\n };\n}\n\n/**\n * Load project configuration from .aigile/config.yaml\n */\nexport function loadProjectConfig(projectPath: string): ProjectConfig | null {\n const configPath = join(projectPath, '.aigile', 'config.yaml');\n\n if (!existsSync(configPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n return parseYaml(content) as ProjectConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Save project configuration to .aigile/config.yaml\n */\nexport function saveProjectConfig(projectPath: string, config: ProjectConfig): void {\n const aigileDir = join(projectPath, '.aigile');\n\n if (!existsSync(aigileDir)) {\n mkdirSync(aigileDir, { recursive: true });\n }\n\n const configPath = join(aigileDir, 'config.yaml');\n const content = stringifyYaml(config);\n writeFileSync(configPath, content, 'utf-8');\n}\n\n/**\n * Find project root by looking for .aigile directory\n */\nexport function findProjectRoot(startPath: string = process.cwd()): string | null {\n let currentPath = startPath;\n\n while (currentPath !== '/') {\n if (existsSync(join(currentPath, '.aigile'))) {\n return currentPath;\n }\n currentPath = join(currentPath, '..');\n }\n\n return null;\n}\n\n/**\n * Parse a gitignore-style file into glob patterns\n */\nfunction parseIgnoreFile(filePath: string): string[] {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const patterns: string[] = [];\n\n for (let line of content.split('\\n')) {\n line = line.trim();\n\n // Skip empty lines and comments\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n // Handle negation (not supported, skip)\n if (line.startsWith('!')) {\n continue;\n }\n\n // Convert gitignore patterns to glob patterns\n let pattern = line;\n\n // Remove leading slash (means relative to repo root)\n if (pattern.startsWith('/')) {\n pattern = pattern.slice(1);\n }\n\n // Add ** prefix for patterns that should match anywhere\n if (!pattern.startsWith('**/') && !pattern.includes('/')) {\n pattern = `**/${pattern}`;\n }\n\n // Add trailing /** for directory patterns\n if (pattern.endsWith('/')) {\n pattern = pattern.slice(0, -1) + '/**';\n }\n\n patterns.push(pattern);\n }\n\n return patterns;\n } catch {\n return [];\n }\n}\n\n/**\n * Load ignore patterns from .aigile/ignore file\n * Returns default deny patterns if file doesn't exist\n */\nexport function loadIgnorePatterns(projectPath: string): string[] {\n const ignorePath = join(projectPath, '.aigile', 'ignore');\n\n if (!existsSync(ignorePath)) {\n return getDefaultDenyPatterns();\n }\n\n const patterns = parseIgnoreFile(ignorePath);\n return patterns.length > 0 ? patterns : getDefaultDenyPatterns();\n}\n\n/**\n * Load allow patterns from .aigile/config.yaml sync.allow_patterns\n * Returns default allow patterns if not configured\n */\nexport function loadAllowPatterns(projectPath: string): string[] {\n const config = loadProjectConfig(projectPath);\n\n if (!config) {\n return getDefaultAllowPatterns();\n }\n\n // Check for allow_patterns in sync config (extended config)\n const extendedConfig = config as ProjectConfig & {\n sync?: {\n allow_patterns?: string[];\n };\n };\n\n if (extendedConfig.sync?.allow_patterns && extendedConfig.sync.allow_patterns.length > 0) {\n return extendedConfig.sync.allow_patterns;\n }\n\n // Fall back to existing patterns field (backward compatibility)\n if (config.sync?.patterns && config.sync.patterns.length > 0) {\n return config.sync.patterns;\n }\n\n return getDefaultAllowPatterns();\n}\n\n/**\n * Save ignore patterns to .aigile/ignore file\n */\nexport function saveIgnorePatterns(projectPath: string, patterns: string[]): void {\n const aigileDir = join(projectPath, '.aigile');\n\n if (!existsSync(aigileDir)) {\n mkdirSync(aigileDir, { recursive: true });\n }\n\n const ignorePath = join(aigileDir, 'ignore');\n const content = `# AIGILE Ignore File\n# Files matching these patterns will NOT be monitored by the daemon\n# Syntax is similar to .gitignore\n\n${patterns.join('\\n')}\n`;\n\n writeFileSync(ignorePath, content, 'utf-8');\n}\n\n/**\n * Get the path to the ignore file\n */\nexport function getIgnoreFilePath(projectPath: string): string {\n return join(projectPath, '.aigile', 'ignore');\n}\n\n/**\n * Check if ignore file exists\n */\nexport function hasIgnoreFile(projectPath: string): boolean {\n return existsSync(getIgnoreFilePath(projectPath));\n}\n","/**\n * Database Connection Manager\n *\n * Manages SQLite database connection for AIGILE CLI.\n * Uses sql.js for pure JavaScript SQLite (no native compilation needed).\n *\n * @author Vladimir K.S.\n */\n\nimport initSqlJs, { Database as SqlJsDatabase } from 'sql.js';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { dirname } from 'path';\nimport { randomUUID } from 'crypto';\nimport { getDbPath, ensureAigileHome } from '../utils/config.js';\n\nlet db: SqlJsDatabase | null = null;\nlet dbPath: string = '';\n\n/**\n * Initialize and get database connection\n */\nexport async function initDatabase(): Promise<SqlJsDatabase> {\n if (db) {\n return db;\n }\n\n ensureAigileHome();\n dbPath = getDbPath();\n\n // Ensure directory exists\n const dbDir = dirname(dbPath);\n if (!existsSync(dbDir)) {\n mkdirSync(dbDir, { recursive: true });\n }\n\n const SQL = await initSqlJs();\n\n if (existsSync(dbPath)) {\n const fileBuffer = readFileSync(dbPath);\n db = new SQL.Database(fileBuffer);\n // Run migrations on existing database\n runMigrations();\n } else {\n db = new SQL.Database();\n initializeSchema(db!);\n saveDatabase();\n }\n\n return db!;\n}\n\n/**\n * Get database (must call initDatabase first)\n */\nexport function getDatabase(): SqlJsDatabase {\n if (!db) {\n throw new Error('Database not initialized. Call initDatabase() first.');\n }\n return db;\n}\n\n/**\n * Save database to file\n * Guarded with try-catch to prevent crashes on I/O errors\n */\nexport function saveDatabase(): void {\n if (db && dbPath) {\n try {\n const data = db.export();\n const buffer = Buffer.from(data);\n writeFileSync(dbPath, buffer);\n } catch (err) {\n // Log error but don't crash - database is still in memory\n // Will retry on next save operation\n console.error(`[${new Date().toISOString()}] Database save error: ${err}`);\n }\n }\n}\n\n/**\n * Close database connection\n */\nexport function closeDatabase(): void {\n if (db) {\n saveDatabase();\n db.close();\n db = null;\n }\n}\n\n/**\n * Run a query and return all results\n */\nexport function queryAll<T>(sql: string, params: unknown[] = []): T[] {\n const database = getDatabase();\n const stmt = database.prepare(sql);\n stmt.bind(params);\n\n const results: T[] = [];\n while (stmt.step()) {\n const row = stmt.getAsObject();\n results.push(row as T);\n }\n stmt.free();\n\n return results;\n}\n\n/**\n * Run a query and return first result\n */\nexport function queryOne<T>(sql: string, params: unknown[] = []): T | undefined {\n const results = queryAll<T>(sql, params);\n return results[0];\n}\n\n/**\n * Run a statement (INSERT, UPDATE, DELETE)\n */\nexport function run(sql: string, params: unknown[] = []): void {\n const database = getDatabase();\n database.run(sql, params);\n saveDatabase();\n}\n\n/**\n * Initialize database schema\n */\nfunction initializeSchema(database: SqlJsDatabase): void {\n // Projects table\n database.run(`\n CREATE TABLE IF NOT EXISTS projects (\n id TEXT PRIMARY KEY,\n key TEXT NOT NULL UNIQUE,\n name TEXT NOT NULL,\n path TEXT NOT NULL UNIQUE,\n description TEXT,\n is_default INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Key sequences table\n database.run(`\n CREATE TABLE IF NOT EXISTS key_sequences (\n id TEXT PRIMARY KEY,\n prefix TEXT NOT NULL UNIQUE,\n current_value INTEGER NOT NULL DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Initiatives table\n database.run(`\n CREATE TABLE IF NOT EXISTS initiatives (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n summary TEXT NOT NULL,\n description TEXT,\n status TEXT DEFAULT 'draft',\n priority TEXT DEFAULT 'Medium',\n owner TEXT,\n start_date TEXT,\n target_date TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Epics table\n database.run(`\n CREATE TABLE IF NOT EXISTS epics (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n summary TEXT NOT NULL,\n description TEXT,\n initiative_id TEXT REFERENCES initiatives(id),\n status TEXT DEFAULT 'backlog',\n priority TEXT DEFAULT 'Medium',\n owner TEXT,\n reporter TEXT,\n labels TEXT,\n components TEXT,\n fix_versions TEXT,\n story_points INTEGER,\n start_date TEXT,\n due_date TEXT,\n persona_ids TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // User stories table\n database.run(`\n CREATE TABLE IF NOT EXISTS user_stories (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n epic_id TEXT REFERENCES epics(id),\n summary TEXT NOT NULL,\n description TEXT,\n as_a TEXT,\n i_want TEXT,\n so_that TEXT,\n acceptance_criteria TEXT,\n status TEXT DEFAULT 'backlog',\n priority TEXT DEFAULT 'Medium',\n story_points INTEGER,\n assignee TEXT,\n reporter TEXT,\n labels TEXT,\n components TEXT,\n fix_versions TEXT,\n sprint_id TEXT REFERENCES sprints(id),\n due_date TEXT,\n original_estimate REAL,\n remaining_estimate REAL,\n time_spent REAL DEFAULT 0,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Tasks table\n database.run(`\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n story_id TEXT REFERENCES user_stories(id),\n parent_id TEXT REFERENCES tasks(id),\n issue_type TEXT DEFAULT 'task',\n summary TEXT NOT NULL,\n description TEXT,\n status TEXT DEFAULT 'todo',\n priority TEXT DEFAULT 'Medium',\n assignee TEXT,\n reporter TEXT,\n labels TEXT,\n components TEXT,\n sprint_id TEXT REFERENCES sprints(id),\n original_estimate REAL,\n remaining_estimate REAL,\n time_spent REAL DEFAULT 0,\n blocked_reason TEXT,\n due_date TEXT,\n resolved_at TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Bugs table\n database.run(`\n CREATE TABLE IF NOT EXISTS bugs (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n story_id TEXT REFERENCES user_stories(id),\n epic_id TEXT REFERENCES epics(id),\n summary TEXT NOT NULL,\n description TEXT,\n steps_to_reproduce TEXT,\n expected_behavior TEXT,\n actual_behavior TEXT,\n status TEXT DEFAULT 'open',\n priority TEXT DEFAULT 'Medium',\n severity TEXT DEFAULT 'Major',\n resolution TEXT,\n environment TEXT,\n affected_versions TEXT,\n fix_versions TEXT,\n assignee TEXT,\n reporter TEXT,\n labels TEXT,\n components TEXT,\n resolved_at TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Sprints table\n database.run(`\n CREATE TABLE IF NOT EXISTS sprints (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n name TEXT NOT NULL,\n goal TEXT,\n status TEXT DEFAULT 'future',\n start_date TEXT NOT NULL,\n end_date TEXT NOT NULL,\n velocity INTEGER,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Components table\n database.run(`\n CREATE TABLE IF NOT EXISTS components (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n name TEXT NOT NULL,\n description TEXT,\n lead TEXT,\n default_assignee TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Versions table\n database.run(`\n CREATE TABLE IF NOT EXISTS versions (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n name TEXT NOT NULL,\n description TEXT,\n status TEXT DEFAULT 'unreleased',\n start_date TEXT,\n release_date TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Activity log table\n database.run(`\n CREATE TABLE IF NOT EXISTS activity_log (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n entity_type TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n action TEXT NOT NULL,\n old_value TEXT,\n new_value TEXT,\n actor TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Documents table (file tracking with frontmatter metadata)\n database.run(`\n CREATE TABLE IF NOT EXISTS documents (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n path TEXT NOT NULL,\n filename TEXT NOT NULL,\n extension TEXT,\n content_hash TEXT,\n size_bytes INTEGER,\n entity_type TEXT,\n entity_id TEXT,\n status TEXT DEFAULT 'tracked',\n last_scanned_at TEXT,\n -- Frontmatter metadata fields\n meta_status TEXT,\n meta_version TEXT,\n meta_tldr TEXT,\n meta_title TEXT,\n meta_modules TEXT,\n meta_dependencies TEXT,\n meta_code_refs TEXT,\n meta_authors TEXT,\n has_frontmatter INTEGER DEFAULT 0,\n frontmatter_raw TEXT,\n -- Shadow mode analysis fields\n shadow_mode INTEGER DEFAULT 0,\n analyzed_at TEXT,\n analysis_confidence INTEGER,\n file_type TEXT,\n complexity_score INTEGER,\n exports TEXT,\n inferred_module TEXT,\n inferred_component TEXT,\n analysis_notes TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(project_id, path)\n )\n `);\n\n // Document comments table (marker tracking)\n database.run(`\n CREATE TABLE IF NOT EXISTS doc_comments (\n id TEXT PRIMARY KEY,\n document_id TEXT REFERENCES documents(id),\n marker_type TEXT NOT NULL,\n line_number INTEGER,\n content TEXT NOT NULL,\n resolved INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // Sessions table (AI session tracking)\n database.run(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n started_at TEXT DEFAULT (datetime('now')),\n ended_at TEXT,\n summary TEXT,\n entities_modified INTEGER DEFAULT 0,\n files_modified INTEGER DEFAULT 0,\n status TEXT DEFAULT 'active'\n )\n `);\n\n // Personas table (user archetypes)\n database.run(`\n CREATE TABLE IF NOT EXISTS personas (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n role TEXT,\n goals TEXT,\n frustrations TEXT,\n demographics TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n\n // UX Journeys table (user experience flows)\n database.run(`\n CREATE TABLE IF NOT EXISTS ux_journeys (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n key TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n persona_id TEXT REFERENCES personas(id),\n stages TEXT,\n touchpoints TEXT,\n pain_points TEXT,\n opportunities TEXT,\n metadata TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n}\n\n/**\n * Generate a UUID\n */\nexport function generateId(): string {\n return randomUUID();\n}\n\n/**\n * Get next key for a project prefix\n */\nexport function getNextKey(projectKey: string): string {\n const row = queryOne<{ current_value: number }>(\n 'SELECT current_value FROM key_sequences WHERE prefix = ?',\n [projectKey]\n );\n\n const nextValue = (row?.current_value ?? 0) + 1;\n\n if (row) {\n run(\n `UPDATE key_sequences SET current_value = ?, updated_at = datetime('now') WHERE prefix = ?`,\n [nextValue, projectKey]\n );\n } else {\n run(\n `INSERT INTO key_sequences (id, prefix, current_value) VALUES (?, ?, ?)`,\n [generateId(), projectKey, nextValue]\n );\n }\n\n return `${projectKey}-${nextValue}`;\n}\n\n/**\n * Run database migrations for schema updates\n * Adds new columns to existing tables if they don't exist\n */\nexport function runMigrations(): void {\n const database = getDatabase();\n\n // Check if documents table has frontmatter columns\n const columns = queryAll<{ name: string }>(\n `PRAGMA table_info(documents)`\n );\n const columnNames = new Set(columns.map(c => c.name));\n\n // Add frontmatter metadata columns if missing\n const newColumns = [\n { name: 'meta_status', type: 'TEXT' },\n { name: 'meta_version', type: 'TEXT' },\n { name: 'meta_tldr', type: 'TEXT' },\n { name: 'meta_title', type: 'TEXT' },\n { name: 'meta_modules', type: 'TEXT' },\n { name: 'meta_dependencies', type: 'TEXT' },\n { name: 'meta_code_refs', type: 'TEXT' },\n { name: 'meta_authors', type: 'TEXT' },\n { name: 'has_frontmatter', type: 'INTEGER DEFAULT 0' },\n { name: 'frontmatter_raw', type: 'TEXT' },\n // Shadow mode analysis columns\n { name: 'shadow_mode', type: 'INTEGER DEFAULT 0' },\n { name: 'analyzed_at', type: 'TEXT' },\n { name: 'analysis_confidence', type: 'INTEGER' },\n { name: 'file_type', type: 'TEXT' },\n { name: 'complexity_score', type: 'INTEGER' },\n { name: 'exports', type: 'TEXT' },\n { name: 'inferred_module', type: 'TEXT' },\n { name: 'inferred_component', type: 'TEXT' },\n { name: 'analysis_notes', type: 'TEXT' },\n // Tri-state monitoring columns\n { name: 'monitoring_category', type: 'TEXT DEFAULT \"unknown\"' },\n { name: 'needs_review', type: 'INTEGER DEFAULT 0' },\n { name: 'reviewed_at', type: 'TEXT' },\n ];\n\n for (const col of newColumns) {\n if (!columnNames.has(col.name)) {\n try {\n database.run(`ALTER TABLE documents ADD COLUMN ${col.name} ${col.type}`);\n } catch {\n // Column might already exist, ignore error\n }\n }\n }\n\n // Create sessions table if missing (added after initial release)\n database.run(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n project_id TEXT REFERENCES projects(id),\n started_at TEXT DEFAULT (datetime('now')),\n ended_at TEXT,\n summary TEXT,\n entities_modified INTEGER DEFAULT 0,\n files_modified INTEGER DEFAULT 0,\n status TEXT DEFAULT 'active'\n )\n `);\n\n // Create activity_log table if missing (added after initial release)\n database.run(`\n CREATE TABLE IF NOT EXISTS activity_log (\n id TEXT PRIMARY KEY,\n session_id TEXT REFERENCES sessions(id),\n project_id TEXT REFERENCES projects(id),\n entity_type TEXT NOT NULL,\n entity_key TEXT NOT NULL,\n action TEXT NOT NULL,\n old_value TEXT,\n new_value TEXT,\n timestamp TEXT DEFAULT (datetime('now'))\n )\n `);\n\n saveDatabase();\n}\n","/**\n * AIGILE CLI Entry Point\n *\n * Main entry point for the aigile command-line interface.\n * Provides JIRA-compatible agile project management from the terminal.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { VERSION } from '../index.js';\nimport { initDatabase, closeDatabase } from '../db/connection.js';\nimport { initCommand } from '../commands/init.js';\nimport { projectCommand } from '../commands/project.js';\nimport { epicCommand } from '../commands/epic.js';\nimport { storyCommand } from '../commands/story.js';\nimport { taskCommand } from '../commands/task.js';\nimport { bugCommand } from '../commands/bug.js';\nimport { sprintCommand } from '../commands/sprint.js';\nimport { statusCommand } from '../commands/status.js';\nimport { initiativeCommand } from '../commands/initiative.js';\nimport { syncCommand } from '../commands/sync.js';\nimport { sessionCommand } from '../commands/session.js';\nimport { contextCommand } from '../commands/context.js';\nimport { queryCommand } from '../commands/query.js';\nimport { aiCommand } from '../commands/ai.js';\nimport { componentCommand } from '../commands/component.js';\nimport { versionCommand } from '../commands/version.js';\nimport { personaCommand } from '../commands/persona.js';\nimport { uxJourneyCommand } from '../commands/ux-journey.js';\nimport { docCommand } from '../commands/doc.js';\nimport { daemonCommand } from '../commands/daemon.js';\nimport { fileCommand } from '../commands/file.js';\n\nasync function main() {\n const program = new Command();\n\n program\n .name('aigile')\n .description('JIRA-compatible Agile project management CLI for AI-assisted development')\n .version(VERSION, '-v, --version', 'Display version number')\n .option('--json', 'Output in JSON format for machine parsing')\n .option('--no-color', 'Disable colored output');\n\n // Initialize database before any command runs\n program.hook('preAction', async () => {\n await initDatabase();\n });\n\n // Close database after command completes\n // Skip for daemon run command since it runs in foreground\n program.hook('postAction', () => {\n // Check if this is the daemon run command using process.argv\n // process.argv = ['node', 'aigile.js', 'daemon', 'run', ...]\n const args = process.argv.slice(2);\n if (args[0] === 'daemon' && args[1] === 'run') {\n return; // Keep database open for daemon\n }\n closeDatabase();\n });\n\n // Register commands\n program.addCommand(initCommand);\n program.addCommand(projectCommand);\n program.addCommand(initiativeCommand);\n program.addCommand(epicCommand);\n program.addCommand(storyCommand);\n program.addCommand(taskCommand);\n program.addCommand(bugCommand);\n program.addCommand(sprintCommand);\n program.addCommand(statusCommand);\n program.addCommand(syncCommand);\n program.addCommand(sessionCommand);\n program.addCommand(contextCommand);\n program.addCommand(queryCommand);\n program.addCommand(aiCommand);\n program.addCommand(componentCommand);\n program.addCommand(versionCommand);\n program.addCommand(personaCommand);\n program.addCommand(uxJourneyCommand);\n program.addCommand(docCommand);\n program.addCommand(daemonCommand);\n program.addCommand(fileCommand);\n\n // Parse arguments\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => {\n console.error('Error:', err.message);\n process.exit(1);\n});\n","/**\n * AIGILE - JIRA-compatible Agile Project Management Library\n *\n * @packageDocumentation\n * @module @vladimir-ks/aigile\n * @author Vladimir K.S.\n */\n\n// Entity exports (to be implemented)\nexport * from './entities/base';\n\n// Database exports (to be implemented)\n// export * from './db/connection';\n\n// Custom fields exports (to be implemented)\n// export * from './fields/loader';\n\n// Workflow exports (to be implemented)\n// export * from './workflows/engine';\n\n// Version\nexport const VERSION = '0.2.1';\n","/**\n * Init Command\n *\n * Initialize AIGILE in a git repository with profile support.\n * Supports three profiles: full-repo, subrepo, module.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { existsSync, mkdirSync, appendFileSync, readFileSync, writeFileSync } from 'fs';\nimport { resolve, join, relative, basename } from 'path';\nimport { isGitRepo, getGitRoot, getRepoName, generateProjectKey, getSuperprojectRoot } from '../utils/git.js';\nimport {\n saveProjectConfig,\n getDefaultProjectConfig,\n loadProjectConfig,\n ensureAigileHome\n} from '../utils/config.js';\nimport { queryOne, run, generateId } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n warning,\n blank,\n header,\n getOutputOptions,\n type OutputOptions\n} from '../services/output-formatter.js';\nimport {\n InitProfile,\n DbMode,\n getTemplatesForProfile,\n writeTemplates,\n generateConfigYaml,\n AigileConfig\n} from '../services/template-packs.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize AIGILE in current or specified directory')\n .argument('[path]', 'Directory path (defaults to current directory)')\n .option('-k, --key <key>', 'Project key (auto-generated if not specified)')\n .option('-n, --name <name>', 'Project name (auto-detected if not specified)')\n .option('-p, --profile <profile>', 'Init profile: full-repo, subrepo, module')\n .option('--db-mode <mode>', 'Database mode: local, shared (default based on profile)')\n .option('--module-kind <kind>', 'Module kind: library, service, ui, cli, other (for module profile)')\n .option('--skip-templates', 'Skip template file creation')\n .option('-f, --force', 'Reinitialize existing project')\n .action(async (pathArg: string | undefined, options) => {\n const opts = getOutputOptions(initCommand);\n const targetPath = resolve(pathArg ?? process.cwd());\n\n try {\n await initProject(targetPath, options, opts);\n } catch (err) {\n error(err instanceof Error ? err.message : String(err), opts);\n process.exit(1);\n }\n });\n\ninterface InitOptions {\n key?: string;\n name?: string;\n profile?: InitProfile;\n dbMode?: DbMode;\n moduleKind?: string;\n skipTemplates?: boolean;\n force?: boolean;\n}\n\n/**\n * Detect git context to determine appropriate profile\n */\nfunction detectGitContext(targetPath: string): {\n gitRoot: string;\n isSubmodule: boolean;\n isSubdirectory: boolean;\n superprojectRoot: string | null;\n relativePath: string;\n} {\n const gitRoot = getGitRoot(targetPath);\n if (!gitRoot) {\n throw new Error('Could not determine git root directory.');\n }\n\n const superprojectRoot = getSuperprojectRoot(targetPath);\n const isSubmodule = superprojectRoot !== null;\n const isSubdirectory = targetPath !== gitRoot;\n const relativePath = relative(gitRoot, targetPath);\n\n return {\n gitRoot,\n isSubmodule,\n isSubdirectory,\n superprojectRoot,\n relativePath\n };\n}\n\n/**\n * Determine profile based on context and options\n */\nfunction determineProfile(\n context: ReturnType<typeof detectGitContext>,\n options: InitOptions,\n opts: OutputOptions\n): InitProfile {\n // If explicitly specified, use that\n if (options.profile) {\n return options.profile;\n }\n\n // Auto-detect based on context\n if (context.isSubmodule) {\n info('Detected git submodule - using subrepo profile', opts);\n return 'subrepo';\n }\n\n if (context.isSubdirectory) {\n // Check if parent has .aigile\n const parentAigile = join(context.gitRoot, '.aigile');\n if (existsSync(parentAigile)) {\n info('Detected subdirectory with parent AIGILE - using module profile', opts);\n return 'module';\n }\n }\n\n // Default: full-repo at git root\n return 'full-repo';\n}\n\n/**\n * Determine database mode based on profile and options\n */\nfunction determineDbMode(\n profile: InitProfile,\n context: ReturnType<typeof detectGitContext>,\n options: InitOptions\n): { mode: DbMode; path: string } {\n if (options.dbMode) {\n const mode = options.dbMode;\n if (mode === 'local') {\n return { mode: 'local', path: '.aigile/aigile.db' };\n }\n // shared mode - need to find parent DB\n const parentDbPath = findParentDb(context);\n return { mode: 'shared', path: parentDbPath };\n }\n\n // Default based on profile\n switch (profile) {\n case 'full-repo':\n return { mode: 'local', path: '.aigile/aigile.db' };\n case 'subrepo':\n // Default to local for subrepo (isolated product)\n return { mode: 'local', path: '.aigile/aigile.db' };\n case 'module':\n // Modules always share parent DB\n const parentDbPath = findParentDb(context);\n return { mode: 'shared', path: parentDbPath };\n }\n}\n\n/**\n * Find parent database path\n */\nfunction findParentDb(context: ReturnType<typeof detectGitContext>): string {\n // For modules, parent is at git root\n const parentAigile = join(context.gitRoot, '.aigile', 'aigile.db');\n if (existsSync(parentAigile)) {\n // Calculate relative path from target to parent\n const depth = context.relativePath.split('/').filter(p => p).length;\n return '../'.repeat(depth) + '.aigile/aigile.db';\n }\n\n // For submodules, check superproject\n if (context.superprojectRoot) {\n const superprojectAigile = join(context.superprojectRoot, '.aigile', 'aigile.db');\n if (existsSync(superprojectAigile)) {\n return '../.aigile/aigile.db';\n }\n }\n\n // Fallback to local\n return '.aigile/aigile.db';\n}\n\nasync function initProject(\n targetPath: string,\n options: InitOptions,\n opts: OutputOptions\n): Promise<void> {\n // Step 1: Check for git repository\n if (!isGitRepo(targetPath)) {\n throw new Error('AIGILE requires a git repository. Run \"git init\" first.');\n }\n\n // Step 2: Detect git context\n const context = detectGitContext(targetPath);\n\n // Step 3: Check for existing initialization\n const aigileDir = join(targetPath, '.aigile');\n if (existsSync(aigileDir) && !options.force) {\n const existingConfig = loadProjectConfig(targetPath);\n if (existingConfig?.project?.key) {\n throw new Error(\n `AIGILE already initialized (project: ${existingConfig.project.key}). ` +\n 'Use --force to reinitialize.'\n );\n }\n }\n\n // Step 4: Determine profile\n const profile = determineProfile(context, options, opts);\n\n // Step 5: Validate profile for context\n if (profile === 'full-repo' && context.isSubdirectory) {\n const parentAigile = join(context.gitRoot, '.aigile');\n if (existsSync(parentAigile)) {\n throw new Error(\n 'Cannot use full-repo profile in subdirectory when parent has AIGILE. ' +\n 'Use --profile module instead.'\n );\n }\n }\n\n // Step 6: Determine database mode\n const dbConfig = determineDbMode(profile, context, options);\n\n // Step 7: Determine project key and name\n let moduleName = basename(targetPath);\n if (profile === 'module') {\n moduleName = options.name ?? moduleName;\n }\n\n const repoName = profile === 'module' ? moduleName : getRepoName(context.gitRoot);\n const projectKey = options.key ?? generateProjectKey(repoName);\n const projectName = options.name ?? repoName;\n\n // Step 8: Ensure global ~/.aigile/ exists\n ensureAigileHome();\n\n // Step 9: Create .aigile/ directory\n if (!existsSync(aigileDir)) {\n mkdirSync(aigileDir, { recursive: true });\n }\n\n // Step 10: Generate and write config.yaml\n const aigileConfig: AigileConfig = {\n db: {\n mode: dbConfig.mode,\n path: dbConfig.path\n },\n profile,\n repo_root: '.'\n };\n\n if (profile === 'module') {\n aigileConfig.module = {\n name: moduleName,\n kind: options.moduleKind ?? 'other',\n path: context.relativePath\n };\n aigileConfig.parent_repo_root = '../'.repeat(context.relativePath.split('/').filter(p => p).length);\n }\n\n if (profile === 'subrepo' && context.superprojectRoot) {\n aigileConfig.parent_repo_root = '..';\n }\n\n const configYaml = generateConfigYaml(aigileConfig, projectKey, projectName);\n writeFileSync(join(aigileDir, 'config.yaml'), configYaml, 'utf-8');\n\n // Step 11: Write template files (unless skipped)\n let templatesResult = { written: 0, skipped: 0 };\n if (!options.skipTemplates) {\n const templates = getTemplatesForProfile(profile, moduleName);\n templatesResult = writeTemplates(aigileDir, templates);\n }\n\n // Step 12: Register project in central database (only for local DB mode)\n if (dbConfig.mode === 'local') {\n registerProject(targetPath, projectId => {\n const existingProject = queryOne<{ id: string }>(\n 'SELECT id FROM projects WHERE path = ?',\n [targetPath]\n );\n\n const id = existingProject?.id ?? generateId();\n\n if (existingProject) {\n run(\n `UPDATE projects SET key = ?, name = ?, updated_at = datetime('now') WHERE id = ?`,\n [projectKey, projectName, id]\n );\n } else {\n run(\n `INSERT INTO projects (id, key, name, path, is_default) VALUES (?, ?, ?, ?, ?)`,\n [id, projectKey, projectName, targetPath, 0]\n );\n }\n\n // Set as default if no other default exists\n const defaultProject = queryOne<{ id: string }>(\n 'SELECT id FROM projects WHERE is_default = 1',\n []\n );\n\n if (!defaultProject) {\n run('UPDATE projects SET is_default = 1 WHERE id = ?', [id]);\n }\n\n return id;\n });\n }\n\n // Step 13: Update .gitignore\n updateGitignore(targetPath, opts);\n\n // Step 14: Output success message\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n project: {\n key: projectKey,\n name: projectName,\n path: targetPath,\n profile,\n dbMode: dbConfig.mode\n },\n templates: templatesResult\n }));\n } else {\n blank();\n success(`AIGILE initialized with ${profile} profile`, opts);\n blank();\n header('Project Configuration:', opts);\n console.log(` Key: ${projectKey}`);\n console.log(` Name: ${projectName}`);\n console.log(` Path: ${targetPath}`);\n console.log(` Profile: ${profile}`);\n console.log(` DB Mode: ${dbConfig.mode}`);\n\n if (templatesResult.written > 0 || templatesResult.skipped > 0) {\n blank();\n header('Templates:', opts);\n console.log(` Written: ${templatesResult.written} files`);\n console.log(` Skipped: ${templatesResult.skipped} files (already exist)`);\n }\n\n blank();\n header('Next steps:', opts);\n if (profile === 'full-repo' || profile === 'subrepo') {\n console.log(' 1. Fill in 00_DOCS/00_vision/01_mission-vision.md');\n console.log(' 2. Run \"aigile sync scan\" to index your files');\n console.log(' 3. Run \"aigile daemon install && aigile daemon start\" for auto-sync');\n } else {\n console.log(' 1. Fill in docs/01_module-overview.md');\n console.log(' 2. Run \"aigile sync scan\" from repo root to index files');\n }\n blank();\n }\n}\n\nfunction registerProject(\n projectPath: string,\n register: (existingId: string | null) => string\n): string {\n return register(null);\n}\n\nfunction updateGitignore(repoPath: string, opts: OutputOptions): void {\n const gitignorePath = join(repoPath, '.gitignore');\n const aigilePattern = '.aigile/';\n\n if (!existsSync(gitignorePath)) {\n info('No .gitignore found. Consider adding \".aigile/\" to ignore local config.', opts);\n return;\n }\n\n const content = readFileSync(gitignorePath, 'utf-8');\n\n // Check if already present\n const lines = content.split('\\n');\n const hasPattern = lines.some(line => {\n const trimmed = line.trim();\n return trimmed === '.aigile' || trimmed === '.aigile/' || trimmed === '/.aigile/';\n });\n\n if (hasPattern) {\n return; // Already in .gitignore\n }\n\n // Append to .gitignore\n const newLine = content.endsWith('\\n') ? '' : '\\n';\n appendFileSync(gitignorePath, `${newLine}# AIGILE local config\\n.aigile/\\n`);\n info('Added \".aigile/\" to .gitignore', opts);\n}\n","/**\n * Git Utility Functions\n *\n * Provides git-related utilities for AIGILE CLI.\n *\n * @author Vladimir K.S.\n */\n\nimport { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join, basename } from 'path';\n\n/**\n * Check if a directory is a git repository\n */\nexport function isGitRepo(path: string): boolean {\n try {\n execSync('git rev-parse --git-dir', {\n cwd: path,\n stdio: 'pipe'\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the git root directory\n */\nexport function getGitRoot(path: string): string | null {\n try {\n const result = execSync('git rev-parse --show-toplevel', {\n cwd: path,\n stdio: 'pipe',\n encoding: 'utf-8'\n });\n return result.trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Get the repository name from git remote or folder name\n */\nexport function getRepoName(path: string): string {\n try {\n // Try to get from git remote\n const remote = execSync('git config --get remote.origin.url', {\n cwd: path,\n stdio: 'pipe',\n encoding: 'utf-8'\n }).trim();\n\n if (remote) {\n // Extract repo name from URL\n // Handles: git@github.com:user/repo.git, https://github.com/user/repo.git\n const match = remote.match(/\\/([^/]+?)(\\.git)?$/);\n if (match) {\n return match[1];\n }\n }\n } catch {\n // No remote configured, use folder name\n }\n\n // Fall back to folder name\n return basename(path);\n}\n\n/**\n * Generate a project key from repository name\n * Converts \"my-project-name\" to \"MPN\" (uppercase initials)\n */\nexport function generateProjectKey(repoName: string): string {\n // Remove common prefixes/suffixes\n const cleaned = repoName\n .replace(/^(@[^/]+\\/)?/, '') // Remove npm scope\n .replace(/[-_.]?(cli|api|app|web|lib|pkg|core)$/i, '') // Remove common suffixes\n .replace(/^(the|a|an)[-_.]?/i, ''); // Remove articles\n\n // Split by separators\n const parts = cleaned.split(/[-_.]+/);\n\n if (parts.length === 1) {\n // Single word: use first 3-4 chars uppercase\n return cleaned.slice(0, 4).toUpperCase();\n }\n\n // Multiple words: use initials\n const initials = parts.map(p => p[0]).join('').toUpperCase();\n\n // Ensure at least 2 chars, max 5\n if (initials.length < 2) {\n return cleaned.slice(0, 4).toUpperCase();\n }\n\n return initials.slice(0, 5);\n}\n\n/**\n * Get the superproject root if in a git submodule\n * Returns null if not in a submodule\n */\nexport function getSuperprojectRoot(path: string): string | null {\n try {\n const result = execSync('git rev-parse --show-superproject-working-tree', {\n cwd: path,\n stdio: 'pipe',\n encoding: 'utf-8'\n }).trim();\n\n return result || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if path is in .gitignore\n */\nexport function isInGitignore(repoPath: string, pattern: string): boolean {\n const gitignorePath = join(repoPath, '.gitignore');\n\n if (!existsSync(gitignorePath)) {\n return false;\n }\n\n try {\n const result = execSync(`git check-ignore -q \"${pattern}\"`, {\n cwd: repoPath,\n stdio: 'pipe'\n });\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Output Formatter Service\n *\n * Handles output formatting for both human-readable and JSON formats.\n * Provides consistent output across all commands.\n *\n * @author Vladimir K.S.\n */\n\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\n\nexport interface OutputOptions {\n json?: boolean;\n noColor?: boolean;\n}\n\nexport interface TableColumn {\n header: string;\n key: string;\n width?: number;\n}\n\n/**\n * Get global output options from command\n */\nexport function getOutputOptions(cmd: { parent?: { opts?: () => OutputOptions } | null }): OutputOptions {\n return cmd.parent?.opts?.() ?? {};\n}\n\n/**\n * Output success message\n */\nexport function success(message: string, opts: OutputOptions = {}): void {\n if (opts.json) {\n console.log(JSON.stringify({ success: true, message }));\n } else {\n const prefix = opts.noColor ? '✓' : chalk.green('✓');\n console.log(`${prefix} ${message}`);\n }\n}\n\n/**\n * Output error message\n */\nexport function error(message: string, opts: OutputOptions = {}): void {\n if (opts.json) {\n console.log(JSON.stringify({ success: false, error: message }));\n } else {\n const prefix = opts.noColor ? '✗' : chalk.red('✗');\n console.error(`${prefix} ${message}`);\n }\n}\n\n/**\n * Output warning message\n */\nexport function warning(message: string, opts: OutputOptions = {}): void {\n if (opts.json) {\n console.log(JSON.stringify({ warning: message }));\n } else {\n const prefix = opts.noColor ? '!' : chalk.yellow('!');\n console.log(`${prefix} ${message}`);\n }\n}\n\n/**\n * Output info message\n */\nexport function info(message: string, opts: OutputOptions = {}): void {\n if (opts.json) {\n console.log(JSON.stringify({ info: message }));\n } else {\n const prefix = opts.noColor ? 'ℹ' : chalk.blue('ℹ');\n console.log(`${prefix} ${message}`);\n }\n}\n\n/**\n * Output data as JSON or formatted table\n */\nexport function data<T extends Record<string, unknown>>(\n items: T[],\n columns: TableColumn[],\n opts: OutputOptions = {}\n): void {\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: items }));\n return;\n }\n\n if (items.length === 0) {\n console.log('No items found.');\n return;\n }\n\n const table = new Table({\n head: columns.map(c => opts.noColor ? c.header : chalk.cyan(c.header)),\n colWidths: columns.map(c => c.width ?? null),\n wordWrap: true,\n style: {\n head: opts.noColor ? [] : ['cyan'],\n border: opts.noColor ? [] : ['gray']\n }\n });\n\n for (const item of items) {\n table.push(columns.map(c => String(item[c.key] ?? '')));\n }\n\n console.log(table.toString());\n}\n\n/**\n * Output single item details\n */\nexport function details(\n item: Record<string, unknown>,\n fields: { label: string; key: string }[],\n opts: OutputOptions = {}\n): void {\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: item }));\n return;\n }\n\n const maxLabelLength = Math.max(...fields.map(f => f.label.length));\n\n for (const field of fields) {\n const label = field.label.padEnd(maxLabelLength);\n const value = item[field.key] ?? '';\n const formattedLabel = opts.noColor ? label : chalk.gray(label);\n console.log(` ${formattedLabel} ${value}`);\n }\n}\n\n/**\n * Output a blank line\n */\nexport function blank(): void {\n console.log();\n}\n\n/**\n * Output a header/title\n */\nexport function header(title: string, opts: OutputOptions = {}): void {\n if (opts.json) return;\n const formatted = opts.noColor ? title : chalk.bold(title);\n console.log(formatted);\n}\n","/**\n * Template Packs Service\n *\n * Manages template packs for different init profiles.\n * Templates are data-driven, not hardcoded in logic.\n *\n * @author Vladimir K.S.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join, dirname } from 'path';\n\nexport type InitProfile = 'full-repo' | 'subrepo' | 'module';\n\nexport type DbMode = 'local' | 'shared';\n\n/**\n * Template file definition\n */\nexport interface TemplateFile {\n path: string;\n content: string;\n}\n\n/**\n * Config.yaml structure for AIGILE\n */\nexport interface AigileConfig {\n db: {\n mode: DbMode;\n path: string;\n };\n profile: InitProfile;\n repo_root: string;\n parent_repo_root?: string;\n module?: {\n name: string;\n kind: string;\n path: string;\n };\n}\n\n/**\n * Standard frontmatter template for documents\n */\nfunction createFrontmatter(title: string, tldr: string, modules: string[] = []): string {\n return `---\nmetadata:\n status: TEMPLATE\n version: \"1.0\"\n tldr: \"${tldr}\"\n title: \"${title}\"\n modules: [${modules.map(m => `\"${m}\"`).join(', ')}]\n authors: []\n dependencies: []\n---\n\n`;\n}\n\n/**\n * Get template files for full-repo profile\n */\nexport function getFullRepoTemplates(): TemplateFile[] {\n return [\n // 00_DOCS hierarchy\n {\n path: '00_DOCS/00_vision/01_mission-vision.md',\n content: createFrontmatter(\n 'Mission & Vision',\n 'Define company mission, vision, values, and elevator pitch',\n ['vision']\n ) + `# Mission & Vision\n\n## Mission Statement\n<!-- Why does this company/product exist? -->\n\n## Vision Statement\n<!-- What future are we creating? -->\n\n## Core Values\n<!-- What principles guide our decisions? -->\n\n## Elevator Pitch\n<!-- One sentence: What do we do? -->\n`\n },\n {\n path: '00_DOCS/01_strategy/01_strategic-analysis.md',\n content: createFrontmatter(\n 'Strategic Analysis',\n 'SWOT analysis and strategic pillars',\n ['strategy']\n ) + `# Strategic Analysis\n\n## SWOT Analysis\n\n### Strengths\n-\n\n### Weaknesses\n-\n\n### Opportunities\n-\n\n### Threats\n-\n\n## Strategic Pillars\n<!-- Key focus areas for the next 1-3 years -->\n\n`\n },\n {\n path: '00_DOCS/02_target-audience/01_personas.md',\n content: createFrontmatter(\n 'User Personas',\n 'Define ideal customer profile and user personas',\n ['personas', 'ux']\n ) + `# User Personas\n\n## Ideal Customer Profile (ICP)\n<!-- Who is our primary customer? -->\n\n## Primary Personas\n\n### Persona 1: [Name]\n- **Role:**\n- **Goals:**\n- **Frustrations:**\n- **Key Tasks:**\n\n`\n },\n {\n path: '00_DOCS/03_finance-legal/01_model.md',\n content: createFrontmatter(\n 'Business Model',\n 'Revenue model and financial overview',\n ['finance']\n ) + `# Business Model\n\n## Revenue Model\n<!-- How do we make money? -->\n\n## Pricing Strategy\n<!-- How do we price our offerings? -->\n\n## Key Metrics\n<!-- What metrics matter most? -->\n\n`\n },\n {\n path: '00_DOCS/04_raw-inputs/README.md',\n content: createFrontmatter(\n 'Raw Inputs',\n 'Repository for raw user feedback, interviews, and research data',\n ['research']\n ) + `# Raw Inputs\n\nThis directory contains raw, unprocessed input from users, stakeholders, and research.\n\n## Contents\n- User interviews\n- Survey responses\n- Support tickets\n- Feature requests\n- Competitive intelligence\n\n`\n },\n {\n path: '00_DOCS/05_research/README.md',\n content: createFrontmatter(\n 'Research',\n 'Market research and analysis documents',\n ['research']\n ) + `# Research\n\nThis directory contains research and analysis documents.\n\n## Contents\n- Market analysis\n- User research\n- Technical research\n- Competitive analysis\n\n`\n },\n {\n path: '00_DOCS/06_product-specs/01_prd.md',\n content: createFrontmatter(\n 'Product Requirements Document',\n 'Main PRD template for product features',\n ['product', 'specs']\n ) + `# Product Requirements Document (PRD)\n\n## Overview\n<!-- Brief description of the product/feature -->\n\n## Problem Statement\n<!-- What problem are we solving? -->\n\n## Goals & Success Metrics\n<!-- How will we measure success? -->\n\n## User Stories\n<!-- Link to user stories -->\n\n## Requirements\n### Functional Requirements\n-\n\n### Non-Functional Requirements\n-\n\n## Out of Scope\n-\n\n`\n },\n {\n path: '00_DOCS/06_product-specs/epics/README.md',\n content: createFrontmatter(\n 'Epics Directory',\n 'Contains epic-level product specifications',\n ['product', 'epics']\n ) + `# Epics\n\nThis directory contains epic-level specifications.\n\n`\n },\n {\n path: '00_DOCS/06_product-specs/stories/README.md',\n content: createFrontmatter(\n 'User Stories Directory',\n 'Contains user story specifications',\n ['product', 'stories']\n ) + `# User Stories\n\nThis directory contains user story specifications.\n\n`\n },\n {\n path: '00_DOCS/07_ux-design/00_README.md',\n content: createFrontmatter(\n 'UX Design',\n 'UX design documentation and journey maps',\n ['ux']\n ) + `# UX Design\n\n## Contents\n- User journeys\n- Wireframes\n- Design system references\n- Interaction patterns\n\n`\n },\n {\n path: '00_DOCS/07_ux-design/journeys/README.md',\n content: createFrontmatter(\n 'User Journeys',\n 'User journey maps and flow documentation',\n ['ux', 'journeys']\n ) + `# User Journeys\n\nThis directory contains user journey maps.\n\n`\n },\n {\n path: '00_DOCS/08_go-to-market/01_launch-plan.md',\n content: createFrontmatter(\n 'Launch Plan',\n 'Go-to-market strategy and launch checklist',\n ['gtm']\n ) + `# Launch Plan\n\n## Launch Goals\n-\n\n## Target Audience\n-\n\n## Channels\n-\n\n## Timeline\n-\n\n## Checklist\n- [ ] Marketing materials ready\n- [ ] Documentation complete\n- [ ] Support trained\n- [ ] Analytics configured\n\n`\n },\n {\n path: '00_DOCS/11_people-ops/ai-agents/README.md',\n content: createFrontmatter(\n 'AI Agents',\n 'AI agent configurations and prompts',\n ['ai', 'agents']\n ) + `# AI Agents\n\nThis directory contains AI agent configurations and prompts.\n\n`\n },\n {\n path: '00_DOCS/11_people-ops/sops/README.md',\n content: createFrontmatter(\n 'Standard Operating Procedures',\n 'Team SOPs and process documentation',\n ['sops']\n ) + `# Standard Operating Procedures\n\nThis directory contains team SOPs and process documentation.\n\n`\n },\n {\n path: '00_DOCS/12_customer-success/installation.md',\n content: createFrontmatter(\n 'Installation Guide',\n 'Installation and setup instructions',\n ['docs', 'installation']\n ) + `# Installation Guide\n\n## Prerequisites\n-\n\n## Installation Steps\n1.\n2.\n3.\n\n## Verification\n-\n\n`\n },\n {\n path: '00_DOCS/12_customer-success/quick-start.md',\n content: createFrontmatter(\n 'Quick Start Guide',\n 'Getting started guide for new users',\n ['docs', 'quickstart']\n ) + `# Quick Start Guide\n\n## Overview\n<!-- Brief intro -->\n\n## Step 1: Setup\n<!-- First step -->\n\n## Step 2: First Action\n<!-- Second step -->\n\n## Next Steps\n<!-- What to do next -->\n\n`\n },\n {\n path: '00_DOCS/12_customer-success/troubleshooting.md',\n content: createFrontmatter(\n 'Troubleshooting Guide',\n 'Common issues and solutions',\n ['docs', 'troubleshooting']\n ) + `# Troubleshooting\n\n## Common Issues\n\n### Issue: [Description]\n**Symptoms:**\n**Solution:**\n\n`\n },\n {\n path: '00_DOCS/99_archive/00_README.md',\n content: createFrontmatter(\n 'Archive',\n 'Archived documents no longer in active use',\n ['archive']\n ) + `# Archive\n\nThis directory contains archived documents that are no longer in active use but are kept for reference.\n\n`\n },\n\n // 01_SPECS hierarchy\n {\n path: '01_SPECS/00_adr/README.md',\n content: createFrontmatter(\n 'Architecture Decision Records',\n 'ADRs documenting key technical decisions',\n ['specs', 'adr']\n ) + `# Architecture Decision Records (ADRs)\n\nThis directory contains ADRs for documenting key technical decisions.\n\n## Template\nUse the template in \\`template.md\\` for new ADRs.\n\n`\n },\n {\n path: '01_SPECS/01_domain-models/README.md',\n content: createFrontmatter(\n 'Domain Models',\n 'Domain model specifications',\n ['specs', 'domain']\n ) + `# Domain Models\n\nThis directory contains domain model specifications.\n\n`\n },\n {\n path: '01_SPECS/02_api-contracts/README.md',\n content: createFrontmatter(\n 'API Contracts',\n 'API specifications and contracts',\n ['specs', 'api']\n ) + `# API Contracts\n\nThis directory contains API specifications and contracts.\n\n`\n },\n {\n path: '01_SPECS/03_c4-components/README.md',\n content: createFrontmatter(\n 'C4 Architecture',\n 'C4 model component diagrams',\n ['specs', 'architecture']\n ) + `# C4 Architecture Components\n\nThis directory contains C4 model architecture diagrams.\n\n`\n },\n {\n path: '01_SPECS/04_ui-ux-specs/README.md',\n content: createFrontmatter(\n 'UI/UX Specifications',\n 'UI/UX technical specifications',\n ['specs', 'ux']\n ) + `# UI/UX Specifications\n\nThis directory contains UI/UX technical specifications.\n\n`\n },\n {\n path: '01_SPECS/05_infrastructure/README.md',\n content: createFrontmatter(\n 'Infrastructure',\n 'Infrastructure and deployment specifications',\n ['specs', 'infra']\n ) + `# Infrastructure\n\nThis directory contains infrastructure and deployment specifications.\n\n`\n },\n\n // 02_FEATURES hierarchy\n {\n path: '02_FEATURES/00_smoke-tests/README.md',\n content: createFrontmatter(\n 'Smoke Tests',\n 'Critical path smoke test scenarios',\n ['features', 'tests']\n ) + `# Smoke Tests\n\nThis directory contains smoke test feature files for critical paths.\n\n`\n },\n {\n path: '02_FEATURES/01_epics/README.md',\n content: createFrontmatter(\n 'Epic Features',\n 'BDD feature files organized by epic',\n ['features', 'epics']\n ) + `# Epic Features\n\nThis directory contains BDD feature files organized by epic.\n\n`\n },\n {\n path: '02_FEATURES/02_end-to-end/README.md',\n content: createFrontmatter(\n 'End-to-End Features',\n 'End-to-end scenario feature files',\n ['features', 'e2e']\n ) + `# End-to-End Features\n\nThis directory contains end-to-end scenario feature files.\n\n`\n },\n {\n path: '02_FEATURES/03_nfr/README.md',\n content: createFrontmatter(\n 'Non-Functional Requirements',\n 'NFR feature files (performance, security, etc.)',\n ['features', 'nfr']\n ) + `# Non-Functional Requirements\n\nThis directory contains NFR feature files:\n- Performance\n- Security\n- Scalability\n- Accessibility\n\n`\n },\n\n // 03_TESTING_INFRA hierarchy\n {\n path: '03_TESTING_INFRA/00_governance/README.md',\n content: createFrontmatter(\n 'Test Governance',\n 'Testing standards and policies',\n ['testing', 'governance']\n ) + `# Test Governance\n\nThis directory contains testing standards and policies.\n\n`\n },\n {\n path: '03_TESTING_INFRA/01_unit-layer/README.md',\n content: createFrontmatter(\n 'Unit Testing Layer',\n 'Unit test infrastructure and guides',\n ['testing', 'unit']\n ) + `# Unit Testing Layer\n\nThis directory contains unit test infrastructure.\n\n`\n },\n {\n path: '03_TESTING_INFRA/02_integration-layer/README.md',\n content: createFrontmatter(\n 'Integration Testing Layer',\n 'Integration test infrastructure and guides',\n ['testing', 'integration']\n ) + `# Integration Testing Layer\n\nThis directory contains integration test infrastructure.\n\n`\n },\n {\n path: '03_TESTING_INFRA/03_e2e-layer/README.md',\n content: createFrontmatter(\n 'E2E Testing Layer',\n 'End-to-end test infrastructure and guides',\n ['testing', 'e2e']\n ) + `# E2E Testing Layer\n\nThis directory contains E2E test infrastructure.\n\n`\n },\n {\n path: '03_TESTING_INFRA/04_manual-qa-layer/README.md',\n content: createFrontmatter(\n 'Manual QA Layer',\n 'Manual QA procedures and checklists',\n ['testing', 'qa']\n ) + `# Manual QA Layer\n\nThis directory contains manual QA procedures and checklists.\n\n`\n },\n {\n path: '03_TESTING_INFRA/qa/README.md',\n content: createFrontmatter(\n 'QA Documentation',\n 'QA procedures and documentation',\n ['testing', 'qa']\n ) + `# QA Documentation\n\nThis directory contains QA procedures and documentation.\n\n`\n },\n {\n path: '03_TESTING_INFRA/reports/README.md',\n content: createFrontmatter(\n 'Test Reports',\n 'Test execution reports',\n ['testing', 'reports']\n ) + `# Test Reports\n\nThis directory contains test execution reports.\n\n`\n }\n ];\n}\n\n/**\n * Get template files for subrepo profile (same as full-repo)\n */\nexport function getSubrepoTemplates(): TemplateFile[] {\n return getFullRepoTemplates();\n}\n\n/**\n * Get template files for module profile (minimal structure)\n */\nexport function getModuleTemplates(moduleName: string): TemplateFile[] {\n return [\n {\n path: 'docs/01_module-overview.md',\n content: createFrontmatter(\n `${moduleName} Overview`,\n `Overview documentation for ${moduleName} module`,\n [moduleName]\n ) + `# ${moduleName} Module Overview\n\n## Purpose\n<!-- What does this module do? -->\n\n## Key Concepts\n<!-- Core concepts and terminology -->\n\n## Dependencies\n<!-- What does this module depend on? -->\n\n## API\n<!-- Public API surface -->\n\n`\n },\n {\n path: 'docs/02_mini-prd.md',\n content: createFrontmatter(\n `${moduleName} Requirements`,\n `Module-level requirements for ${moduleName}`,\n [moduleName, 'specs']\n ) + `# ${moduleName} Module Requirements\n\n## Goals\n<!-- What should this module achieve? -->\n\n## Requirements\n### Functional\n-\n\n### Non-Functional\n-\n\n## Out of Scope\n-\n\n`\n },\n {\n path: 'specs/01_spec-template.md',\n content: createFrontmatter(\n `${moduleName} Spec Template`,\n `Specification template for ${moduleName}`,\n [moduleName, 'specs']\n ) + `# ${moduleName} Specification\n\n## Overview\n<!-- Brief description -->\n\n## Design\n<!-- Technical design -->\n\n## Implementation Notes\n<!-- Key implementation details -->\n\n`\n },\n {\n path: 'features/01_happy-path.feature',\n content: `Feature: ${moduleName} Happy Path\n As a user\n I want to use ${moduleName}\n So that I can achieve my goals\n\n Scenario: Basic usage\n Given I have configured ${moduleName}\n When I perform the main action\n Then I should see the expected result\n`\n },\n {\n path: 'features/02_edge-cases.feature',\n content: `Feature: ${moduleName} Edge Cases\n As a user\n I want ${moduleName} to handle edge cases gracefully\n So that I don't encounter errors\n\n Scenario: Empty input\n Given I have configured ${moduleName}\n When I provide empty input\n Then I should see a helpful error message\n`\n }\n ];\n}\n\n/**\n * Get templates for a given profile\n */\nexport function getTemplatesForProfile(profile: InitProfile, moduleName?: string): TemplateFile[] {\n switch (profile) {\n case 'full-repo':\n return getFullRepoTemplates();\n case 'subrepo':\n return getSubrepoTemplates();\n case 'module':\n return getModuleTemplates(moduleName ?? 'module');\n default:\n return [];\n }\n}\n\n/**\n * Write templates to a target directory\n * Only writes files that don't already exist (non-destructive)\n */\nexport function writeTemplates(\n targetDir: string,\n templates: TemplateFile[]\n): { written: number; skipped: number } {\n let written = 0;\n let skipped = 0;\n\n for (const template of templates) {\n const fullPath = join(targetDir, template.path);\n const dir = dirname(fullPath);\n\n // Ensure directory exists\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Only write if file doesn't exist\n if (!existsSync(fullPath)) {\n writeFileSync(fullPath, template.content, 'utf-8');\n written++;\n } else {\n skipped++;\n }\n }\n\n return { written, skipped };\n}\n\n/**\n * Generate config.yaml content\n */\nexport function generateConfigYaml(config: AigileConfig, projectKey: string, projectName: string): string {\n let yaml = `# AIGILE Project Configuration\n# Auto-generated by aigile init\n\ndb:\n mode: ${config.db.mode}\n path: ${config.db.path}\n\nprofile: ${config.profile}\nrepo_root: ${config.repo_root}\n`;\n\n if (config.parent_repo_root) {\n yaml += `parent_repo_root: ${config.parent_repo_root}\\n`;\n }\n\n if (config.module) {\n yaml += `\nmodule:\n name: ${config.module.name}\n kind: ${config.module.kind}\n path: ${config.module.path}\n`;\n }\n\n yaml += `\nproject:\n key: ${projectKey}\n name: ${projectName}\n\nsync:\n enabled: true\n patterns:\n - \"**/*.md\"\n - \"**/*.feature\"\n - \"**/*.yaml\"\n - \"**/*.yml\"\n ignore:\n - node_modules\n - dist\n - .git\n - coverage\n`;\n\n return yaml;\n}\n","/**\n * Project Command\n *\n * Manage registered projects.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { queryAll, queryOne, run } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n warning,\n data,\n details,\n blank,\n getOutputOptions\n} from '../services/output-formatter.js';\n\n/**\n * Check if a project path is valid (exists and has .aigile directory)\n */\nfunction isValidProject(path: string): boolean {\n return existsSync(path) && existsSync(join(path, '.aigile'));\n}\n\nexport const projectCommand = new Command('project')\n .description('Manage registered projects');\n\n// List all projects\nprojectCommand\n .command('list')\n .alias('ls')\n .description('List all registered projects with validity status')\n .action(() => {\n const opts = getOutputOptions(projectCommand);\n\n const projects = queryAll<{\n key: string;\n name: string;\n path: string;\n is_default: number;\n created_at: string;\n }>(`\n SELECT key, name, path, is_default,\n datetime(created_at) as created_at\n FROM projects\n ORDER BY is_default DESC, name\n `);\n\n if (projects.length === 0) {\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: [] }));\n } else {\n console.log('No projects registered. Run \"aigile init\" in a git repo.');\n }\n return;\n }\n\n // Add validity status to each project\n const formattedProjects = projects.map(p => {\n const valid = isValidProject(p.path);\n return {\n status: valid ? '✓' : '✗',\n key: p.is_default ? `${p.key} *` : p.key,\n name: p.name,\n path: p.path,\n valid // For JSON output\n };\n });\n\n const invalidCount = formattedProjects.filter(p => !p.valid).length;\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: formattedProjects.map(p => ({\n key: p.key.replace(' *', ''),\n name: p.name,\n path: p.path,\n valid: p.valid,\n is_default: p.key.includes('*')\n })),\n invalidCount\n }));\n return;\n }\n\n data(\n formattedProjects,\n [\n { header: '', key: 'status', width: 3 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Name', key: 'name', width: 30 },\n { header: 'Path', key: 'path', width: 50 }\n ],\n opts\n );\n\n blank();\n console.log(' * = default project');\n console.log(' ✓ = valid path, ✗ = missing/invalid path');\n\n if (invalidCount > 0) {\n blank();\n warning(`${invalidCount} project(s) have invalid paths. Run \"aigile project cleanup\" to remove.`, opts);\n }\n });\n\n// Show project details\nprojectCommand\n .command('show')\n .argument('[key]', 'Project key (uses default if not specified)')\n .description('Show project details')\n .action((key?: string) => {\n const opts = getOutputOptions(projectCommand);\n\n let project;\n if (key) {\n project = queryOne('SELECT * FROM projects WHERE key = ?', [key]);\n } else {\n project = queryOne('SELECT * FROM projects WHERE is_default = 1');\n }\n\n if (!project) {\n error(key ? `Project \"${key}\" not found.` : 'No default project set.', opts);\n process.exit(1);\n }\n\n details(\n project as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Name', key: 'name' },\n { label: 'Path', key: 'path' },\n { label: 'Default', key: 'is_default' },\n { label: 'Created', key: 'created_at' }\n ],\n opts\n );\n });\n\n// Set default project\nprojectCommand\n .command('set-default')\n .argument('<key>', 'Project key to set as default')\n .description('Set default project')\n .action((key: string) => {\n const opts = getOutputOptions(projectCommand);\n\n const project = queryOne('SELECT id FROM projects WHERE key = ?', [key]);\n\n if (!project) {\n error(`Project \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('UPDATE projects SET is_default = 0');\n run('UPDATE projects SET is_default = 1 WHERE key = ?', [key]);\n\n success(`Default project set to \"${key}\".`, opts);\n });\n\n// Remove project\nprojectCommand\n .command('remove')\n .alias('rm')\n .argument('<key>', 'Project key to remove')\n .option('--cascade', 'Also delete all entities (epics, stories, tasks, etc.)')\n .option('--force', 'Remove without confirmation')\n .description('Remove project from registry (does not delete files)')\n .action((key: string, options: { cascade?: boolean; force?: boolean }) => {\n const opts = getOutputOptions(projectCommand);\n\n const project = queryOne<{ id: string; name: string; path: string }>(\n 'SELECT id, name, path FROM projects WHERE key = ?',\n [key]\n );\n\n if (!project) {\n error(`Project \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n if (options.cascade) {\n // Delete all related entities\n const tables = [\n 'documents',\n 'doc_comments',\n 'tasks',\n 'bugs',\n 'user_stories',\n 'epics',\n 'initiatives',\n 'sprints',\n 'components',\n 'versions',\n 'personas',\n 'ux_journeys',\n 'sessions',\n 'activity_log',\n 'key_sequences'\n ];\n\n for (const table of tables) {\n try {\n run(`DELETE FROM ${table} WHERE project_id = ?`, [project.id]);\n } catch {\n // Table might not have project_id or might not exist\n }\n }\n\n info(`Deleted all entities for project \"${key}\".`, opts);\n }\n\n run('DELETE FROM projects WHERE key = ?', [key]);\n success(`Project \"${key}\" removed from registry.`, opts);\n });\n\n// Cleanup invalid projects\nprojectCommand\n .command('cleanup')\n .description('Remove all projects with invalid/missing paths')\n .option('--dry-run', 'Show what would be removed without removing')\n .option('--cascade', 'Also delete all entities for removed projects')\n .action((options: { dryRun?: boolean; cascade?: boolean }) => {\n const opts = getOutputOptions(projectCommand);\n\n const projects = queryAll<{\n id: string;\n key: string;\n name: string;\n path: string;\n }>('SELECT id, key, name, path FROM projects');\n\n const invalidProjects = projects.filter(p => !isValidProject(p.path));\n\n if (invalidProjects.length === 0) {\n success('All projects have valid paths. Nothing to clean up.', opts);\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n dryRun: options.dryRun ?? false,\n invalidProjects: invalidProjects.map(p => ({\n key: p.key,\n name: p.name,\n path: p.path\n }))\n }));\n\n if (options.dryRun) {\n return;\n }\n }\n\n if (options.dryRun) {\n info(`Would remove ${invalidProjects.length} invalid project(s):`, opts);\n for (const p of invalidProjects) {\n console.log(` - ${p.key}: ${p.path}`);\n }\n return;\n }\n\n for (const project of invalidProjects) {\n if (options.cascade) {\n // Delete all related entities\n const tables = [\n 'documents',\n 'doc_comments',\n 'tasks',\n 'bugs',\n 'user_stories',\n 'epics',\n 'initiatives',\n 'sprints',\n 'components',\n 'versions',\n 'personas',\n 'ux_journeys',\n 'sessions',\n 'activity_log',\n 'key_sequences'\n ];\n\n for (const table of tables) {\n try {\n run(`DELETE FROM ${table} WHERE project_id = ?`, [project.id]);\n } catch {\n // Table might not have project_id or might not exist\n }\n }\n }\n\n run('DELETE FROM projects WHERE id = ?', [project.id]);\n info(`Removed: ${project.key} (${project.path})`, opts);\n }\n\n success(`Cleaned up ${invalidProjects.length} invalid project(s).`, opts);\n });\n","/**\n * Epic Command\n *\n * CRUD operations for epics.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\n\nexport const epicCommand = new Command('epic')\n .description('Manage epics');\n\n// Create epic\nepicCommand\n .command('create')\n .argument('<summary>', 'Epic summary')\n .option('-d, --description <description>', 'Epic description')\n .option('-p, --priority <priority>', 'Priority (P0/P1/P2/P3 or Highest/High/Medium/Low/Lowest)', 'Medium')\n .option('-i, --initiative <key>', 'Parent initiative key')\n .description('Create a new epic')\n .action((summary: string, options) => {\n const opts = getOutputOptions(epicCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const epicId = generateId();\n const epicKey = getNextKey(config.project.key);\n\n run(\n `INSERT INTO epics (id, project_id, key, summary, description, priority, status) VALUES (?, ?, ?, ?, ?, ?, 'backlog')`,\n [epicId, project.id, epicKey, summary, options.description ?? null, options.priority]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key: epicKey, summary } }));\n } else {\n success(`Created epic ${epicKey}: ${summary}`, opts);\n }\n });\n\n// List epics\nepicCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status')\n .option('-a, --all', 'Show all projects')\n .description('List epics')\n .action((options) => {\n const opts = getOutputOptions(epicCommand);\n\n let query = `\n SELECT e.key, e.summary, e.status, e.priority,\n (SELECT COUNT(*) FROM user_stories WHERE epic_id = e.id) as story_count\n FROM epics e\n `;\n const params: unknown[] = [];\n\n if (!options.all) {\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n query += ' JOIN projects p ON e.project_id = p.id WHERE p.key = ?';\n params.push(config.project.key);\n }\n }\n }\n\n if (options.status) {\n query += params.length > 0 ? ' AND' : ' WHERE';\n query += ' e.status = ?';\n params.push(options.status);\n }\n\n query += ' ORDER BY e.created_at DESC';\n\n const epics = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n story_count: number;\n }>(query, params);\n\n data(\n epics,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 40 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Priority', key: 'priority', width: 10 },\n { header: 'Stories', key: 'story_count', width: 8 }\n ],\n opts\n );\n });\n\n// Show epic details\nepicCommand\n .command('show')\n .argument('<key>', 'Epic key')\n .description('Show epic details')\n .action((key: string) => {\n const opts = getOutputOptions(epicCommand);\n\n const epic = queryOne(`\n SELECT e.*, p.key as project_key\n FROM epics e\n JOIN projects p ON e.project_id = p.id\n WHERE e.key = ?\n `, [key]);\n\n if (!epic) {\n error(`Epic \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n details(\n epic as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Summary', key: 'summary' },\n { label: 'Status', key: 'status' },\n { label: 'Priority', key: 'priority' },\n { label: 'Description', key: 'description' },\n { label: 'Owner', key: 'owner' },\n { label: 'Created', key: 'created_at' }\n ],\n opts\n );\n });\n\n// Update epic\nepicCommand\n .command('update')\n .argument('<key>', 'Epic key')\n .option('-s, --summary <summary>', 'New summary')\n .option('-d, --description <description>', 'New description')\n .option('-p, --priority <priority>', 'New priority')\n .option('--owner <owner>', 'New owner')\n .description('Update epic')\n .action((key: string, options) => {\n const opts = getOutputOptions(epicCommand);\n\n const epic = queryOne('SELECT id FROM epics WHERE key = ?', [key]);\n if (!epic) {\n error(`Epic \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n\n if (options.summary) {\n updates.push('summary = ?');\n params.push(options.summary);\n }\n if (options.description) {\n updates.push('description = ?');\n params.push(options.description);\n }\n if (options.priority) {\n updates.push('priority = ?');\n params.push(options.priority);\n }\n if (options.owner) {\n updates.push('owner = ?');\n params.push(options.owner);\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(key);\n\n run(`UPDATE epics SET ${updates.join(', ')} WHERE key = ?`, params);\n success(`Epic \"${key}\" updated.`, opts);\n });\n\n// Transition epic status\nepicCommand\n .command('transition')\n .argument('<key>', 'Epic key')\n .argument('<status>', 'New status (backlog/analysis/ready/in_progress/done/closed)')\n .description('Transition epic to new status')\n .action((key: string, status: string) => {\n const opts = getOutputOptions(epicCommand);\n\n const epic = queryOne<{ id: string; status: string }>('SELECT id, status FROM epics WHERE key = ?', [key]);\n if (!epic) {\n error(`Epic \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('epic', epic.status, status);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('epic', epic.status);\n error(formatTransitionError('epic', key, epic.status, status, validTransitions), opts);\n process.exit(1);\n }\n\n run(`UPDATE epics SET status = ?, updated_at = datetime('now') WHERE key = ?`, [status, key]);\n success(`Epic \"${key}\" transitioned from \"${epic.status}\" to \"${status}\".`, opts);\n });\n\n// Delete epic\nepicCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Epic key')\n .option('--force', 'Delete without confirmation')\n .description('Delete epic')\n .action((key: string) => {\n const opts = getOutputOptions(epicCommand);\n\n const epic = queryOne('SELECT id FROM epics WHERE key = ?', [key]);\n if (!epic) {\n error(`Epic \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM epics WHERE key = ?', [key]);\n success(`Epic \"${key}\" deleted.`, opts);\n });\n","/**\n * Workflow Validation Engine\n *\n * Enforces valid status transitions for all entity types.\n * Based on JIRA-like workflow conventions.\n *\n * @author Vladimir K.S.\n */\n\nexport type WorkflowEntityType = 'initiative' | 'epic' | 'story' | 'task' | 'bug' | 'sprint' | 'version';\n\nexport interface TransitionResult {\n valid: boolean;\n error?: string;\n validTransitions?: string[];\n}\n\n/**\n * Valid status transitions per entity type.\n * Map from current status to array of valid target statuses.\n */\nconst WORKFLOWS: Record<WorkflowEntityType, Record<string, string[]>> = {\n initiative: {\n draft: ['active'],\n active: ['draft', 'done'],\n done: ['active', 'archived'],\n archived: []\n },\n\n epic: {\n backlog: ['analysis'],\n analysis: ['backlog', 'ready'],\n ready: ['in_progress'],\n in_progress: ['backlog', 'done'],\n done: ['in_progress', 'closed'],\n closed: []\n },\n\n story: {\n backlog: ['selected'],\n selected: ['backlog', 'in_progress'],\n in_progress: ['backlog', 'in_review'],\n in_review: ['in_progress', 'done'],\n done: ['in_progress', 'closed'],\n closed: []\n },\n\n task: {\n todo: ['in_progress'],\n in_progress: ['todo', 'in_review', 'blocked'],\n blocked: ['in_progress'],\n in_review: ['in_progress', 'done'],\n done: ['in_progress']\n },\n\n bug: {\n open: ['in_progress'],\n in_progress: ['open', 'resolved'],\n resolved: ['reopened', 'closed'],\n reopened: ['in_progress', 'closed'],\n closed: []\n },\n\n sprint: {\n future: ['active'],\n active: ['closed'],\n closed: []\n },\n\n version: {\n unreleased: ['released'],\n released: ['archived'],\n archived: []\n }\n};\n\n/**\n * Default (initial) status for each entity type\n */\nexport const DEFAULT_STATUS: Record<WorkflowEntityType, string> = {\n initiative: 'draft',\n epic: 'backlog',\n story: 'backlog',\n task: 'todo',\n bug: 'open',\n sprint: 'future',\n version: 'unreleased'\n};\n\n/**\n * All valid statuses for each entity type\n */\nexport function getAllStatuses(entityType: WorkflowEntityType): string[] {\n const workflow = WORKFLOWS[entityType];\n if (!workflow) {\n return [];\n }\n return Object.keys(workflow);\n}\n\n/**\n * Check if a status is valid for an entity type\n */\nexport function isValidStatus(entityType: WorkflowEntityType, status: string): boolean {\n const workflow = WORKFLOWS[entityType];\n if (!workflow) {\n return false;\n }\n return status in workflow;\n}\n\n/**\n * Get valid transitions from the current status\n */\nexport function getValidTransitions(entityType: WorkflowEntityType, currentStatus: string): string[] {\n const workflow = WORKFLOWS[entityType];\n if (!workflow) {\n return [];\n }\n return workflow[currentStatus] ?? [];\n}\n\n/**\n * Validate a status transition\n *\n * @param entityType - Type of entity (initiative, epic, story, task, bug, sprint, version)\n * @param currentStatus - Current status of the entity\n * @param newStatus - Target status to transition to\n * @returns TransitionResult with validation result\n */\nexport function validateTransition(\n entityType: WorkflowEntityType,\n currentStatus: string,\n newStatus: string\n): TransitionResult {\n const workflow = WORKFLOWS[entityType];\n\n if (!workflow) {\n return {\n valid: false,\n error: `Unknown entity type: ${entityType}`\n };\n }\n\n // Check if current status is valid\n if (!(currentStatus in workflow)) {\n return {\n valid: false,\n error: `Invalid current status \"${currentStatus}\" for ${entityType}`,\n validTransitions: []\n };\n }\n\n // Check if new status is valid for this entity type\n if (!(newStatus in workflow)) {\n return {\n valid: false,\n error: `Invalid target status \"${newStatus}\" for ${entityType}`,\n validTransitions: workflow[currentStatus]\n };\n }\n\n // Same status - no transition needed\n if (currentStatus === newStatus) {\n return { valid: true };\n }\n\n // Check if transition is allowed\n const validTransitions = workflow[currentStatus];\n if (!validTransitions.includes(newStatus)) {\n return {\n valid: false,\n error: `Cannot transition ${entityType} from \"${currentStatus}\" to \"${newStatus}\"`,\n validTransitions\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Format transition error message for CLI output\n */\nexport function formatTransitionError(\n entityType: WorkflowEntityType,\n key: string,\n currentStatus: string,\n newStatus: string,\n validTransitions: string[]\n): string {\n const validStr = validTransitions.length > 0\n ? validTransitions.join(', ')\n : '(none - terminal status)';\n\n return `Cannot transition ${entityType} \"${key}\" from \"${currentStatus}\" to \"${newStatus}\".\\n` +\n `Valid transitions from \"${currentStatus}\": ${validStr}`;\n}\n\n/**\n * Check if entity type supports workflow validation\n */\nexport function hasWorkflow(entityType: string): entityType is WorkflowEntityType {\n return entityType in WORKFLOWS;\n}\n\n/**\n * Get workflow definition for an entity type\n */\nexport function getWorkflow(entityType: WorkflowEntityType): Record<string, string[]> | null {\n return WORKFLOWS[entityType] ?? null;\n}\n","/**\n * Story Command\n *\n * CRUD operations for user stories.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\n\nexport const storyCommand = new Command('story')\n .description('Manage user stories');\n\n// Create story\nstoryCommand\n .command('create')\n .argument('<summary>', 'Story summary')\n .option('-e, --epic <key>', 'Parent epic key')\n .option('-d, --description <description>', 'Story description')\n .option('-p, --priority <priority>', 'Priority', 'Medium')\n .option('--points <points>', 'Story points (1,2,3,5,8,13,21)')\n .description('Create a new user story')\n .action((summary: string, options) => {\n const opts = getOutputOptions(storyCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n let epicId: string | null = null;\n if (options.epic) {\n const epic = queryOne<{ id: string }>('SELECT id FROM epics WHERE key = ?', [options.epic]);\n if (!epic) {\n error(`Epic \"${options.epic}\" not found.`, opts);\n process.exit(1);\n }\n epicId = epic.id;\n }\n\n const storyId = generateId();\n const storyKey = getNextKey(config.project.key);\n\n run(\n `INSERT INTO user_stories (id, project_id, key, epic_id, summary, description, priority, story_points, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'backlog')`,\n [storyId, project.id, storyKey, epicId, summary, options.description ?? null, options.priority, options.points ? parseInt(options.points) : null]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key: storyKey, summary } }));\n } else {\n success(`Created story ${storyKey}: ${summary}`, opts);\n }\n });\n\n// List stories\nstoryCommand\n .command('list')\n .alias('ls')\n .option('-e, --epic <key>', 'Filter by epic')\n .option('-s, --status <status>', 'Filter by status')\n .option('--sprint <name>', 'Filter by sprint')\n .description('List user stories')\n .action((options) => {\n const opts = getOutputOptions(storyCommand);\n\n let query = `\n SELECT s.key, s.summary, s.status, s.priority, s.story_points,\n e.key as epic_key\n FROM user_stories s\n LEFT JOIN epics e ON s.epic_id = e.id\n `;\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n conditions.push('s.project_id = (SELECT id FROM projects WHERE key = ?)');\n params.push(config.project.key);\n }\n }\n\n if (options.epic) {\n conditions.push('e.key = ?');\n params.push(options.epic);\n }\n if (options.status) {\n conditions.push('s.status = ?');\n params.push(options.status);\n }\n\n if (conditions.length > 0) {\n query += ' WHERE ' + conditions.join(' AND ');\n }\n\n query += ' ORDER BY s.created_at DESC';\n\n const stories = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n story_points: number | null;\n epic_key: string | null;\n }>(query, params);\n\n data(\n stories,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 35 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Points', key: 'story_points', width: 8 },\n { header: 'Epic', key: 'epic_key', width: 12 }\n ],\n opts\n );\n });\n\n// Show story details\nstoryCommand\n .command('show')\n .argument('<key>', 'Story key')\n .description('Show story details')\n .action((key: string) => {\n const opts = getOutputOptions(storyCommand);\n\n const story = queryOne('SELECT * FROM user_stories WHERE key = ?', [key]);\n if (!story) {\n error(`Story \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n details(\n story as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Summary', key: 'summary' },\n { label: 'Status', key: 'status' },\n { label: 'Priority', key: 'priority' },\n { label: 'Points', key: 'story_points' },\n { label: 'Assignee', key: 'assignee' },\n { label: 'Description', key: 'description' }\n ],\n opts\n );\n });\n\n// Transition story\nstoryCommand\n .command('transition')\n .argument('<key>', 'Story key')\n .argument('<status>', 'New status')\n .description('Transition story to new status')\n .action((key: string, status: string) => {\n const opts = getOutputOptions(storyCommand);\n\n const story = queryOne<{ status: string }>('SELECT status FROM user_stories WHERE key = ?', [key]);\n if (!story) {\n error(`Story \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('story', story.status, status);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('story', story.status);\n error(formatTransitionError('story', key, story.status, status, validTransitions), opts);\n process.exit(1);\n }\n\n run(`UPDATE user_stories SET status = ?, updated_at = datetime('now') WHERE key = ?`, [status, key]);\n success(`Story \"${key}\" transitioned from \"${story.status}\" to \"${status}\".`, opts);\n });\n\n// Update story\nstoryCommand\n .command('update')\n .argument('<key>', 'Story key')\n .option('-s, --summary <summary>', 'New summary')\n .option('-d, --description <description>', 'New description')\n .option('-p, --priority <priority>', 'New priority')\n .option('--points <points>', 'New story points')\n .option('--assignee <assignee>', 'New assignee')\n .option('-e, --epic <key>', 'New parent epic')\n .description('Update story')\n .action((key: string, options) => {\n const opts = getOutputOptions(storyCommand);\n\n const story = queryOne('SELECT id FROM user_stories WHERE key = ?', [key]);\n if (!story) {\n error(`Story \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n\n if (options.summary) {\n updates.push('summary = ?');\n params.push(options.summary);\n }\n if (options.description) {\n updates.push('description = ?');\n params.push(options.description);\n }\n if (options.priority) {\n updates.push('priority = ?');\n params.push(options.priority);\n }\n if (options.points) {\n updates.push('story_points = ?');\n params.push(parseInt(options.points));\n }\n if (options.assignee) {\n updates.push('assignee = ?');\n params.push(options.assignee);\n }\n if (options.epic) {\n const epic = queryOne<{ id: string }>('SELECT id FROM epics WHERE key = ?', [options.epic]);\n if (!epic) {\n error(`Epic \"${options.epic}\" not found.`, opts);\n process.exit(1);\n }\n updates.push('epic_id = ?');\n params.push(epic.id);\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(key);\n\n run(`UPDATE user_stories SET ${updates.join(', ')} WHERE key = ?`, params);\n success(`Story \"${key}\" updated.`, opts);\n });\n\n// Delete story\nstoryCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Story key')\n .option('--force', 'Delete without confirmation')\n .description('Delete story')\n .action((key: string) => {\n const opts = getOutputOptions(storyCommand);\n\n const story = queryOne('SELECT id FROM user_stories WHERE key = ?', [key]);\n if (!story) {\n error(`Story \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM user_stories WHERE key = ?', [key]);\n success(`Story \"${key}\" deleted.`, opts);\n });\n","/**\n * Task Command\n *\n * CRUD operations for tasks.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\n\nexport const taskCommand = new Command('task')\n .description('Manage tasks');\n\n// Create task\ntaskCommand\n .command('create')\n .argument('<summary>', 'Task summary')\n .option('-s, --story <key>', 'Parent story key')\n .option('--parent <key>', 'Parent task key (creates subtask)')\n .option('-d, --description <description>', 'Task description')\n .option('-p, --priority <priority>', 'Priority', 'Medium')\n .option('--assignee <name>', 'Assignee')\n .description('Create a new task (use --parent for subtask)')\n .action((summary: string, options) => {\n const opts = getOutputOptions(taskCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n let storyId: string | null = null;\n if (options.story) {\n const story = queryOne<{ id: string }>('SELECT id FROM user_stories WHERE key = ?', [options.story]);\n if (!story) {\n error(`Story \"${options.story}\" not found.`, opts);\n process.exit(1);\n }\n storyId = story.id;\n }\n\n let parentId: string | null = null;\n let issueType = 'task';\n if (options.parent) {\n const parentTask = queryOne<{ id: string }>('SELECT id FROM tasks WHERE key = ?', [options.parent]);\n if (!parentTask) {\n error(`Parent task \"${options.parent}\" not found.`, opts);\n process.exit(1);\n }\n parentId = parentTask.id;\n issueType = 'subtask';\n }\n\n const taskId = generateId();\n const taskKey = getNextKey(config.project.key);\n\n run(\n `INSERT INTO tasks (id, project_id, key, story_id, parent_id, issue_type, summary, description, priority, assignee, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'todo')`,\n [taskId, project.id, taskKey, storyId, parentId, issueType, summary, options.description ?? null, options.priority, options.assignee ?? null]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key: taskKey, summary } }));\n } else {\n success(`Created task ${taskKey}: ${summary}`, opts);\n }\n });\n\n// List tasks\ntaskCommand\n .command('list')\n .alias('ls')\n .option('-s, --story <key>', 'Filter by story')\n .option('--status <status>', 'Filter by status')\n .option('--assignee <name>', 'Filter by assignee')\n .description('List tasks')\n .action((options) => {\n const opts = getOutputOptions(taskCommand);\n\n let query = `\n SELECT t.key, t.summary, t.status, t.priority, t.assignee,\n s.key as story_key\n FROM tasks t\n LEFT JOIN user_stories s ON t.story_id = s.id\n `;\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n conditions.push('t.project_id = (SELECT id FROM projects WHERE key = ?)');\n params.push(config.project.key);\n }\n }\n\n if (options.story) {\n conditions.push('s.key = ?');\n params.push(options.story);\n }\n if (options.status) {\n conditions.push('t.status = ?');\n params.push(options.status);\n }\n if (options.assignee) {\n conditions.push('t.assignee = ?');\n params.push(options.assignee);\n }\n\n if (conditions.length > 0) {\n query += ' WHERE ' + conditions.join(' AND ');\n }\n\n query += ' ORDER BY t.created_at DESC';\n\n const tasks = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n story_key: string | null;\n }>(query, params);\n\n data(\n tasks,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 35 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Assignee', key: 'assignee', width: 15 },\n { header: 'Story', key: 'story_key', width: 12 }\n ],\n opts\n );\n });\n\n// Show task\ntaskCommand\n .command('show')\n .argument('<key>', 'Task key')\n .description('Show task details')\n .action((key: string) => {\n const opts = getOutputOptions(taskCommand);\n\n const task = queryOne('SELECT * FROM tasks WHERE key = ?', [key]);\n if (!task) {\n error(`Task \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n details(\n task as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Summary', key: 'summary' },\n { label: 'Status', key: 'status' },\n { label: 'Priority', key: 'priority' },\n { label: 'Assignee', key: 'assignee' },\n { label: 'Description', key: 'description' }\n ],\n opts\n );\n });\n\n// Transition task\ntaskCommand\n .command('transition')\n .argument('<key>', 'Task key')\n .argument('<status>', 'New status')\n .description('Transition task to new status')\n .action((key: string, status: string) => {\n const opts = getOutputOptions(taskCommand);\n\n const task = queryOne<{ status: string }>('SELECT status FROM tasks WHERE key = ?', [key]);\n if (!task) {\n error(`Task \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('task', task.status, status);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('task', task.status);\n error(formatTransitionError('task', key, task.status, status, validTransitions), opts);\n process.exit(1);\n }\n\n run(`UPDATE tasks SET status = ?, updated_at = datetime('now') WHERE key = ?`, [status, key]);\n success(`Task \"${key}\" transitioned from \"${task.status}\" to \"${status}\".`, opts);\n });\n\n// Update task\ntaskCommand\n .command('update')\n .argument('<key>', 'Task key')\n .option('-s, --summary <summary>', 'New summary')\n .option('-d, --description <description>', 'New description')\n .option('-p, --priority <priority>', 'New priority')\n .option('--assignee <assignee>', 'New assignee')\n .option('--story <key>', 'New parent story')\n .option('--blocked-reason <reason>', 'Blocked reason')\n .description('Update task')\n .action((key: string, options) => {\n const opts = getOutputOptions(taskCommand);\n\n const task = queryOne('SELECT id FROM tasks WHERE key = ?', [key]);\n if (!task) {\n error(`Task \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n\n if (options.summary) {\n updates.push('summary = ?');\n params.push(options.summary);\n }\n if (options.description) {\n updates.push('description = ?');\n params.push(options.description);\n }\n if (options.priority) {\n updates.push('priority = ?');\n params.push(options.priority);\n }\n if (options.assignee) {\n updates.push('assignee = ?');\n params.push(options.assignee);\n }\n if (options.story) {\n const story = queryOne<{ id: string }>('SELECT id FROM user_stories WHERE key = ?', [options.story]);\n if (!story) {\n error(`Story \"${options.story}\" not found.`, opts);\n process.exit(1);\n }\n updates.push('story_id = ?');\n params.push(story.id);\n }\n if (options.blockedReason) {\n updates.push('blocked_reason = ?');\n params.push(options.blockedReason);\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(key);\n\n run(`UPDATE tasks SET ${updates.join(', ')} WHERE key = ?`, params);\n success(`Task \"${key}\" updated.`, opts);\n });\n\n// Delete task\ntaskCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Task key')\n .option('--force', 'Delete without confirmation')\n .description('Delete task')\n .action((key: string) => {\n const opts = getOutputOptions(taskCommand);\n\n const task = queryOne('SELECT id FROM tasks WHERE key = ?', [key]);\n if (!task) {\n error(`Task \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM tasks WHERE key = ?', [key]);\n success(`Task \"${key}\" deleted.`, opts);\n });\n","/**\n * Bug Command\n *\n * CRUD operations for bugs.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\n\nexport const bugCommand = new Command('bug')\n .description('Manage bugs');\n\n// Create bug\nbugCommand\n .command('create')\n .argument('<summary>', 'Bug summary')\n .option('-d, --description <description>', 'Bug description')\n .option('-p, --priority <priority>', 'Priority', 'Medium')\n .option('--severity <severity>', 'Severity (Blocker/Critical/Major/Minor/Trivial)', 'Major')\n .option('--assignee <name>', 'Assignee')\n .description('Create a new bug')\n .action((summary: string, options) => {\n const opts = getOutputOptions(bugCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const bugId = generateId();\n const bugKey = getNextKey(config.project.key);\n\n run(\n `INSERT INTO bugs (id, project_id, key, summary, description, priority, severity, assignee, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'open')`,\n [bugId, project.id, bugKey, summary, options.description ?? null, options.priority, options.severity, options.assignee ?? null]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key: bugKey, summary } }));\n } else {\n success(`Created bug ${bugKey}: ${summary}`, opts);\n }\n });\n\n// List bugs\nbugCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status')\n .option('--severity <severity>', 'Filter by severity')\n .option('--assignee <name>', 'Filter by assignee')\n .description('List bugs')\n .action((options) => {\n const opts = getOutputOptions(bugCommand);\n\n let query = 'SELECT key, summary, status, severity, priority, assignee FROM bugs';\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n conditions.push('project_id = (SELECT id FROM projects WHERE key = ?)');\n params.push(config.project.key);\n }\n }\n\n if (options.status) {\n conditions.push('status = ?');\n params.push(options.status);\n }\n if (options.severity) {\n conditions.push('severity = ?');\n params.push(options.severity);\n }\n if (options.assignee) {\n conditions.push('assignee = ?');\n params.push(options.assignee);\n }\n\n if (conditions.length > 0) {\n query += ' WHERE ' + conditions.join(' AND ');\n }\n\n query += ' ORDER BY CASE severity WHEN \"Blocker\" THEN 1 WHEN \"Critical\" THEN 2 WHEN \"Major\" THEN 3 WHEN \"Minor\" THEN 4 ELSE 5 END, created_at DESC';\n\n const bugs = queryAll<{\n key: string;\n summary: string;\n status: string;\n severity: string;\n priority: string;\n assignee: string | null;\n }>(query, params);\n\n data(\n bugs,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 35 },\n { header: 'Status', key: 'status', width: 10 },\n { header: 'Severity', key: 'severity', width: 10 },\n { header: 'Assignee', key: 'assignee', width: 15 }\n ],\n opts\n );\n });\n\n// Show bug\nbugCommand\n .command('show')\n .argument('<key>', 'Bug key')\n .description('Show bug details')\n .action((key: string) => {\n const opts = getOutputOptions(bugCommand);\n\n const bug = queryOne('SELECT * FROM bugs WHERE key = ?', [key]);\n if (!bug) {\n error(`Bug \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n details(\n bug as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Summary', key: 'summary' },\n { label: 'Status', key: 'status' },\n { label: 'Severity', key: 'severity' },\n { label: 'Priority', key: 'priority' },\n { label: 'Assignee', key: 'assignee' },\n { label: 'Description', key: 'description' }\n ],\n opts\n );\n });\n\n// Transition bug\nbugCommand\n .command('transition')\n .argument('<key>', 'Bug key')\n .argument('<status>', 'New status')\n .option('-r, --resolution <resolution>', 'Resolution (for resolved status)')\n .description('Transition bug to new status')\n .action((key: string, status: string, options) => {\n const opts = getOutputOptions(bugCommand);\n\n const bug = queryOne<{ status: string }>('SELECT status FROM bugs WHERE key = ?', [key]);\n if (!bug) {\n error(`Bug \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('bug', bug.status, status);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('bug', bug.status);\n error(formatTransitionError('bug', key, bug.status, status, validTransitions), opts);\n process.exit(1);\n }\n\n if (status === 'resolved' && options.resolution) {\n run(`UPDATE bugs SET status = ?, resolution = ?, resolved_at = datetime('now'), updated_at = datetime('now') WHERE key = ?`, [status, options.resolution, key]);\n } else {\n run(`UPDATE bugs SET status = ?, updated_at = datetime('now') WHERE key = ?`, [status, key]);\n }\n\n success(`Bug \"${key}\" transitioned from \"${bug.status}\" to \"${status}\".`, opts);\n });\n\n// Update bug\nbugCommand\n .command('update')\n .argument('<key>', 'Bug key')\n .option('-s, --summary <summary>', 'New summary')\n .option('-d, --description <description>', 'New description')\n .option('-p, --priority <priority>', 'New priority')\n .option('--severity <severity>', 'New severity')\n .option('--assignee <assignee>', 'New assignee')\n .option('--steps <steps>', 'Steps to reproduce')\n .option('--expected <expected>', 'Expected behavior')\n .option('--actual <actual>', 'Actual behavior')\n .description('Update bug')\n .action((key: string, options) => {\n const opts = getOutputOptions(bugCommand);\n\n const bug = queryOne('SELECT id FROM bugs WHERE key = ?', [key]);\n if (!bug) {\n error(`Bug \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n\n if (options.summary) {\n updates.push('summary = ?');\n params.push(options.summary);\n }\n if (options.description) {\n updates.push('description = ?');\n params.push(options.description);\n }\n if (options.priority) {\n updates.push('priority = ?');\n params.push(options.priority);\n }\n if (options.severity) {\n updates.push('severity = ?');\n params.push(options.severity);\n }\n if (options.assignee) {\n updates.push('assignee = ?');\n params.push(options.assignee);\n }\n if (options.steps) {\n updates.push('steps_to_reproduce = ?');\n params.push(options.steps);\n }\n if (options.expected) {\n updates.push('expected_behavior = ?');\n params.push(options.expected);\n }\n if (options.actual) {\n updates.push('actual_behavior = ?');\n params.push(options.actual);\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(key);\n\n run(`UPDATE bugs SET ${updates.join(', ')} WHERE key = ?`, params);\n success(`Bug \"${key}\" updated.`, opts);\n });\n\n// Delete bug\nbugCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Bug key')\n .option('--force', 'Delete without confirmation')\n .description('Delete bug')\n .action((key: string) => {\n const opts = getOutputOptions(bugCommand);\n\n const bug = queryOne('SELECT id FROM bugs WHERE key = ?', [key]);\n if (!bug) {\n error(`Bug \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM bugs WHERE key = ?', [key]);\n success(`Bug \"${key}\" deleted.`, opts);\n });\n","/**\n * Sprint Command\n *\n * Manage sprints.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n header,\n blank,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n validateAndStandardizeDate,\n isEndDateValid,\n DATE_FORMAT,\n} from '../utils/date.js';\n\nexport const sprintCommand = new Command('sprint')\n .description('Manage sprints');\n\n// Create sprint\nsprintCommand\n .command('create')\n .argument('<name>', 'Sprint name')\n .requiredOption('--start <date>', `Start date (${DATE_FORMAT})`)\n .requiredOption('--end <date>', `End date (${DATE_FORMAT})`)\n .option('-g, --goal <goal>', 'Sprint goal')\n .description('Create a new sprint')\n .action((name: string, options) => {\n const opts = getOutputOptions(sprintCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate and standardize dates\n let startDate: string;\n let endDate: string;\n try {\n startDate = validateAndStandardizeDate(options.start, 'start date');\n endDate = validateAndStandardizeDate(options.end, 'end date');\n } catch (err) {\n error(err instanceof Error ? err.message : String(err), opts);\n process.exit(1);\n }\n\n // Validate end date is after start date\n if (!isEndDateValid(startDate, endDate)) {\n error(`End date (${endDate}) must be after start date (${startDate}).`, opts);\n process.exit(1);\n }\n\n const sprintId = generateId();\n\n run(\n `INSERT INTO sprints (id, project_id, name, goal, start_date, end_date, status)\n VALUES (?, ?, ?, ?, ?, ?, 'future')`,\n [sprintId, project.id, name, options.goal ?? null, startDate, endDate]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name, start: startDate, end: endDate } }));\n } else {\n success(`Created sprint \"${name}\" (${startDate} - ${endDate})`, opts);\n }\n });\n\n// List sprints\nsprintCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status (future/active/closed)')\n .description('List sprints')\n .action((options) => {\n const opts = getOutputOptions(sprintCommand);\n\n let query = 'SELECT name, goal, status, start_date, end_date, velocity FROM sprints';\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n conditions.push('project_id = (SELECT id FROM projects WHERE key = ?)');\n params.push(config.project.key);\n }\n }\n\n if (options.status) {\n conditions.push('status = ?');\n params.push(options.status);\n }\n\n if (conditions.length > 0) {\n query += ' WHERE ' + conditions.join(' AND ');\n }\n\n query += ' ORDER BY start_date DESC';\n\n const sprints = queryAll<{\n name: string;\n goal: string | null;\n status: string;\n start_date: string;\n end_date: string;\n velocity: number | null;\n }>(query, params);\n\n data(\n sprints,\n [\n { header: 'Name', key: 'name', width: 15 },\n { header: 'Status', key: 'status', width: 10 },\n { header: 'Start', key: 'start_date', width: 12 },\n { header: 'End', key: 'end_date', width: 12 },\n { header: 'Velocity', key: 'velocity', width: 10 },\n { header: 'Goal', key: 'goal', width: 30 }\n ],\n opts\n );\n });\n\n// Start sprint\nsprintCommand\n .command('start')\n .argument('<name>', 'Sprint name')\n .description('Start a sprint (make it active)')\n .action((name: string) => {\n const opts = getOutputOptions(sprintCommand);\n\n const sprint = queryOne<{ id: string; status: string }>('SELECT id, status FROM sprints WHERE name = ?', [name]);\n if (!sprint) {\n error(`Sprint \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n if (sprint.status !== 'future') {\n error(`Sprint \"${name}\" is not in \"future\" status.`, opts);\n process.exit(1);\n }\n\n // Check for existing active sprint\n const activeSprint = queryOne<{ name: string }>('SELECT name FROM sprints WHERE status = \"active\"');\n if (activeSprint) {\n error(`Sprint \"${activeSprint.name}\" is already active. Close it first.`, opts);\n process.exit(1);\n }\n\n run(`UPDATE sprints SET status = 'active', updated_at = datetime('now') WHERE name = ?`, [name]);\n success(`Sprint \"${name}\" started.`, opts);\n });\n\n// Close sprint\nsprintCommand\n .command('close')\n .argument('<name>', 'Sprint name')\n .description('Close a sprint')\n .action((name: string) => {\n const opts = getOutputOptions(sprintCommand);\n\n const sprint = queryOne<{ id: string; status: string }>('SELECT id, status FROM sprints WHERE name = ?', [name]);\n if (!sprint) {\n error(`Sprint \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n if (sprint.status !== 'active') {\n error(`Sprint \"${name}\" is not active.`, opts);\n process.exit(1);\n }\n\n // Calculate velocity\n const velocity = queryOne<{ velocity: number }>(`\n SELECT COALESCE(SUM(story_points), 0) as velocity\n FROM user_stories\n WHERE sprint_id = ? AND status = 'done'\n `, [sprint.id]);\n\n run(`UPDATE sprints SET status = 'closed', velocity = ?, updated_at = datetime('now') WHERE name = ?`, [velocity?.velocity ?? 0, name]);\n success(`Sprint \"${name}\" closed with velocity ${velocity?.velocity ?? 0}.`, opts);\n });\n\n// Sprint board\nsprintCommand\n .command('board')\n .argument('[name]', 'Sprint name (uses active sprint if not specified)')\n .description('Show sprint board')\n .action((name?: string) => {\n const opts = getOutputOptions(sprintCommand);\n\n let sprint;\n if (name) {\n sprint = queryOne<{ id: string; name: string; status: string }>('SELECT id, name, status FROM sprints WHERE name = ?', [name]);\n } else {\n sprint = queryOne<{ id: string; name: string; status: string }>('SELECT id, name, status FROM sprints WHERE status = \"active\"');\n }\n\n if (!sprint) {\n error(name ? `Sprint \"${name}\" not found.` : 'No active sprint.', opts);\n process.exit(1);\n }\n\n const stories = queryAll<{\n key: string;\n summary: string;\n status: string;\n story_points: number | null;\n }>(`\n SELECT key, summary, status, story_points\n FROM user_stories\n WHERE sprint_id = ?\n ORDER BY status, key\n `, [sprint.id]);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, sprint: sprint.name, data: stories }));\n return;\n }\n\n blank();\n header(`Sprint: ${sprint.name} (${sprint.status})`, opts);\n blank();\n\n if (stories.length === 0) {\n console.log(' No stories in this sprint.');\n return;\n }\n\n const columns = ['backlog', 'selected', 'in_progress', 'in_review', 'done'];\n\n for (const status of columns) {\n const statusStories = stories.filter(s => s.status === status);\n console.log(` ${status.toUpperCase()} (${statusStories.length}):`);\n for (const story of statusStories) {\n const points = story.story_points ? ` [${story.story_points}pts]` : '';\n console.log(` - ${story.key}: ${story.summary}${points}`);\n }\n blank();\n }\n });\n\n// Add story to sprint\nsprintCommand\n .command('add-story')\n .argument('<sprint-name>', 'Sprint name')\n .argument('<story-key>', 'Story key')\n .description('Add a story to a sprint')\n .action((sprintName: string, storyKey: string) => {\n const opts = getOutputOptions(sprintCommand);\n\n const sprint = queryOne<{ id: string }>('SELECT id FROM sprints WHERE name = ?', [sprintName]);\n if (!sprint) {\n error(`Sprint \"${sprintName}\" not found.`, opts);\n process.exit(1);\n }\n\n const story = queryOne<{ id: string }>('SELECT id FROM user_stories WHERE key = ?', [storyKey]);\n if (!story) {\n error(`Story \"${storyKey}\" not found.`, opts);\n process.exit(1);\n }\n\n run(`UPDATE user_stories SET sprint_id = ?, updated_at = datetime('now') WHERE key = ?`, [sprint.id, storyKey]);\n success(`Story \"${storyKey}\" added to sprint \"${sprintName}\".`, opts);\n });\n","/**\n * Date Utilities\n *\n * Provides date validation and standardization for AIGILE CLI.\n * All dates are stored in ISO 8601 format (YYYY-MM-DD).\n *\n * @author Vladimir K.S.\n */\n\n/**\n * Standard date format used throughout AIGILE\n */\nexport const DATE_FORMAT = 'YYYY-MM-DD';\n\n/**\n * Validates that a string is a valid date in YYYY-MM-DD format\n * @param dateStr - The date string to validate\n * @returns true if valid, false otherwise\n */\nexport function isValidDateFormat(dateStr: string): boolean {\n if (!dateStr) return false;\n\n // Check format matches YYYY-MM-DD\n const regex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!regex.test(dateStr)) {\n return false;\n }\n\n // Validate actual date values\n const [year, month, day] = dateStr.split('-').map(Number);\n\n // Check month range\n if (month < 1 || month > 12) {\n return false;\n }\n\n // Check day range for the given month/year\n const daysInMonth = new Date(year, month, 0).getDate();\n if (day < 1 || day > daysInMonth) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Attempts to parse a date string in various formats and convert to YYYY-MM-DD\n *\n * Supported input formats:\n * - YYYY-MM-DD (already standard)\n * - MM/DD/YYYY (US format)\n * - DD/MM/YYYY (EU format) - detected when day > 12\n * - YYYY/MM/DD (slash variant)\n * - DD.MM.YYYY (EU with dots)\n * - ISO 8601 with time (extracts date)\n *\n * @param dateStr - The date string to parse\n * @returns Standardized YYYY-MM-DD string, or null if unparseable\n */\nexport function parseDate(dateStr: string): string | null {\n if (!dateStr || typeof dateStr !== 'string') {\n return null;\n }\n\n const trimmed = dateStr.trim();\n\n // Already in YYYY-MM-DD format\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) {\n return isValidDateFormat(trimmed) ? trimmed : null;\n }\n\n // ISO 8601 with time component (e.g., 2025-12-14T10:30:00Z)\n if (/^\\d{4}-\\d{2}-\\d{2}T/.test(trimmed)) {\n const datePart = trimmed.split('T')[0];\n return isValidDateFormat(datePart) ? datePart : null;\n }\n\n // YYYY/MM/DD format\n const slashYMD = trimmed.match(/^(\\d{4})\\/(\\d{2})\\/(\\d{2})$/);\n if (slashYMD) {\n const result = `${slashYMD[1]}-${slashYMD[2]}-${slashYMD[3]}`;\n return isValidDateFormat(result) ? result : null;\n }\n\n // MM/DD/YYYY or DD/MM/YYYY format\n const slashMDY = trimmed.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (slashMDY) {\n let [, first, second, year] = slashMDY;\n const firstNum = Number(first);\n const secondNum = Number(second);\n\n // If first part > 12, it must be a day (EU format DD/MM/YYYY)\n // Otherwise assume US format MM/DD/YYYY\n let month: string, day: string;\n if (firstNum > 12) {\n day = first.padStart(2, '0');\n month = second.padStart(2, '0');\n } else {\n month = first.padStart(2, '0');\n day = second.padStart(2, '0');\n }\n\n const result = `${year}-${month}-${day}`;\n return isValidDateFormat(result) ? result : null;\n }\n\n // DD.MM.YYYY format (EU with dots)\n const dotDMY = trimmed.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/);\n if (dotDMY) {\n const [, day, month, year] = dotDMY;\n const result = `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n return isValidDateFormat(result) ? result : null;\n }\n\n // Try native Date parsing as fallback\n const parsed = new Date(trimmed);\n if (!isNaN(parsed.getTime())) {\n const year = parsed.getFullYear();\n const month = String(parsed.getMonth() + 1).padStart(2, '0');\n const day = String(parsed.getDate()).padStart(2, '0');\n const result = `${year}-${month}-${day}`;\n return isValidDateFormat(result) ? result : null;\n }\n\n return null;\n}\n\n/**\n * Validates and standardizes a date string, throwing an error if invalid\n *\n * @param dateStr - The date string to validate\n * @param fieldName - The name of the field (for error messages)\n * @returns Standardized YYYY-MM-DD string\n * @throws Error if the date is invalid\n */\nexport function validateAndStandardizeDate(dateStr: string, fieldName: string): string {\n const standardized = parseDate(dateStr);\n\n if (!standardized) {\n throw new Error(\n `Invalid date format for ${fieldName}: \"${dateStr}\". ` +\n `Expected format: ${DATE_FORMAT} (e.g., 2025-12-14)`\n );\n }\n\n return standardized;\n}\n\n/**\n * Validates that end date is after start date\n *\n * @param startDate - Start date in YYYY-MM-DD format\n * @param endDate - End date in YYYY-MM-DD format\n * @returns true if end date is after or equal to start date\n */\nexport function isEndDateValid(startDate: string, endDate: string): boolean {\n return endDate >= startDate;\n}\n\n/**\n * Checks if a date is in the past\n *\n * @param dateStr - Date in YYYY-MM-DD format\n * @returns true if the date is before today\n */\nexport function isDateInPast(dateStr: string): boolean {\n const today = new Date().toISOString().split('T')[0];\n return dateStr < today;\n}\n\n/**\n * Checks if a date is in the future\n *\n * @param dateStr - Date in YYYY-MM-DD format\n * @returns true if the date is after today\n */\nexport function isDateInFuture(dateStr: string): boolean {\n const today = new Date().toISOString().split('T')[0];\n return dateStr > today;\n}\n\n/**\n * Gets today's date in YYYY-MM-DD format\n *\n * @returns Today's date as YYYY-MM-DD\n */\nexport function getTodayDate(): string {\n return new Date().toISOString().split('T')[0];\n}\n","/**\n * Status Command\n *\n * Display project dashboard/status overview.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryOne } from '../db/connection.js';\nimport {\n error,\n header,\n blank,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\n\nexport const statusCommand = new Command('status')\n .description('Show project status dashboard')\n .action(() => {\n const opts = getOutputOptions(statusCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{\n id: string;\n key: string;\n name: string;\n }>('SELECT * FROM projects WHERE key = ?', [config.project.key]);\n\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Get counts\n const epicCount = queryOne<{ count: number }>('SELECT COUNT(*) as count FROM epics WHERE project_id = ?', [project.id]);\n const storyCount = queryOne<{ count: number }>('SELECT COUNT(*) as count FROM user_stories WHERE project_id = ?', [project.id]);\n const taskCount = queryOne<{ count: number }>('SELECT COUNT(*) as count FROM tasks WHERE project_id = ?', [project.id]);\n const bugCount = queryOne<{ count: number }>('SELECT COUNT(*) as count FROM bugs WHERE project_id = ?', [project.id]);\n\n // Get active sprint\n const activeSprint = queryOne<{ name: string; start_date: string; end_date: string }>(`\n SELECT name, start_date, end_date\n FROM sprints\n WHERE project_id = ? AND status = 'active'\n `, [project.id]);\n\n // Get in-progress items\n const inProgressStories = queryOne<{ count: number }>(`\n SELECT COUNT(*) as count\n FROM user_stories\n WHERE project_id = ? AND status = 'in_progress'\n `, [project.id]);\n\n const blockedTasks = queryOne<{ count: number }>(`\n SELECT COUNT(*) as count\n FROM tasks\n WHERE project_id = ? AND status = 'blocked'\n `, [project.id]);\n\n const openBugs = queryOne<{ count: number }>(`\n SELECT COUNT(*) as count\n FROM bugs\n WHERE project_id = ? AND status IN ('open', 'in_progress')\n `, [project.id]);\n\n const criticalBugs = queryOne<{ count: number }>(`\n SELECT COUNT(*) as count\n FROM bugs\n WHERE project_id = ? AND status IN ('open', 'in_progress') AND severity IN ('Blocker', 'Critical')\n `, [project.id]);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n project: { key: project.key, name: project.name },\n counts: {\n epics: epicCount?.count ?? 0,\n stories: storyCount?.count ?? 0,\n tasks: taskCount?.count ?? 0,\n bugs: bugCount?.count ?? 0\n },\n active_sprint: activeSprint ?? null,\n status: {\n in_progress_stories: inProgressStories?.count ?? 0,\n blocked_tasks: blockedTasks?.count ?? 0,\n open_bugs: openBugs?.count ?? 0,\n critical_bugs: criticalBugs?.count ?? 0\n }\n }\n }));\n return;\n }\n\n // Human-readable output\n blank();\n header(`Project: ${project.name} (${project.key})`, opts);\n blank();\n\n // Sprint info\n if (activeSprint) {\n console.log(` Active Sprint: ${activeSprint.name}`);\n console.log(` Sprint Period: ${activeSprint.start_date} - ${activeSprint.end_date}`);\n } else {\n console.log(' No active sprint');\n }\n blank();\n\n // Entity counts\n header('Entities:', opts);\n console.log(` Epics: ${epicCount?.count ?? 0}`);\n console.log(` Stories: ${storyCount?.count ?? 0}`);\n console.log(` Tasks: ${taskCount?.count ?? 0}`);\n console.log(` Bugs: ${bugCount?.count ?? 0}`);\n blank();\n\n // Status summary\n header('Status:', opts);\n console.log(` Stories in progress: ${inProgressStories?.count ?? 0}`);\n console.log(` Blocked tasks: ${blockedTasks?.count ?? 0}`);\n console.log(` Open bugs: ${openBugs?.count ?? 0}`);\n if ((criticalBugs?.count ?? 0) > 0) {\n console.log(` Critical/Blocker: ${criticalBugs?.count ?? 0} !!!`);\n }\n blank();\n });\n","/**\n * Initiative Command\n *\n * CRUD operations for initiatives (portfolio-level objectives).\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\nimport { validateAndStandardizeDate, isEndDateValid, DATE_FORMAT } from '../utils/date.js';\n\nexport const initiativeCommand = new Command('initiative')\n .description('Manage initiatives (portfolio-level objectives)');\n\n// Create initiative\ninitiativeCommand\n .command('create')\n .argument('<summary>', 'Initiative summary')\n .option('-d, --description <description>', 'Initiative description')\n .option('-p, --priority <priority>', 'Priority (Highest/High/Medium/Low/Lowest)', 'Medium')\n .option('--owner <owner>', 'Owner')\n .option('--start <date>', `Start date (${DATE_FORMAT})`)\n .option('--target <date>', `Target date (${DATE_FORMAT})`)\n .description('Create a new initiative')\n .action((summary: string, options) => {\n const opts = getOutputOptions(initiativeCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Validate and standardize dates if provided\n let startDate: string | null = null;\n let targetDate: string | null = null;\n try {\n if (options.start) {\n startDate = validateAndStandardizeDate(options.start, 'start date');\n }\n if (options.target) {\n targetDate = validateAndStandardizeDate(options.target, 'target date');\n }\n } catch (err) {\n error(err instanceof Error ? err.message : String(err), opts);\n process.exit(1);\n }\n\n // Validate target date is after start date if both provided\n if (startDate && targetDate && !isEndDateValid(startDate, targetDate)) {\n error(`Target date (${targetDate}) must be after start date (${startDate}).`, opts);\n process.exit(1);\n }\n\n const initiativeId = generateId();\n const initiativeKey = getNextKey(config.project.key);\n\n run(\n `INSERT INTO initiatives (id, project_id, key, summary, description, priority, owner, start_date, target_date, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'draft')`,\n [\n initiativeId,\n project.id,\n initiativeKey,\n summary,\n options.description ?? null,\n options.priority,\n options.owner ?? null,\n startDate,\n targetDate\n ]\n );\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key: initiativeKey, summary } }));\n } else {\n success(`Created initiative ${initiativeKey}: ${summary}`, opts);\n }\n });\n\n// List initiatives\ninitiativeCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status (draft/active/done/archived)')\n .option('-a, --all', 'Show all projects')\n .description('List initiatives')\n .action((options) => {\n const opts = getOutputOptions(initiativeCommand);\n\n let query = `\n SELECT i.key, i.summary, i.status, i.priority, i.owner,\n (SELECT COUNT(*) FROM epics WHERE initiative_id = i.id) as epic_count\n FROM initiatives i\n `;\n const params: unknown[] = [];\n\n if (!options.all) {\n const projectRoot = findProjectRoot();\n if (projectRoot) {\n const config = loadProjectConfig(projectRoot);\n if (config) {\n query += ' JOIN projects p ON i.project_id = p.id WHERE p.key = ?';\n params.push(config.project.key);\n }\n }\n }\n\n if (options.status) {\n query += params.length > 0 ? ' AND' : ' WHERE';\n query += ' i.status = ?';\n params.push(options.status);\n }\n\n query += ' ORDER BY i.created_at DESC';\n\n const initiatives = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n owner: string | null;\n epic_count: number;\n }>(query, params);\n\n data(\n initiatives,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 40 },\n { header: 'Status', key: 'status', width: 10 },\n { header: 'Priority', key: 'priority', width: 10 },\n { header: 'Owner', key: 'owner', width: 15 },\n { header: 'Epics', key: 'epic_count', width: 8 }\n ],\n opts\n );\n });\n\n// Show initiative details\ninitiativeCommand\n .command('show')\n .argument('<key>', 'Initiative key')\n .description('Show initiative details')\n .action((key: string) => {\n const opts = getOutputOptions(initiativeCommand);\n\n const initiative = queryOne(`\n SELECT i.*, p.key as project_key\n FROM initiatives i\n JOIN projects p ON i.project_id = p.id\n WHERE i.key = ?\n `, [key]);\n\n if (!initiative) {\n error(`Initiative \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n details(\n initiative as Record<string, unknown>,\n [\n { label: 'Key', key: 'key' },\n { label: 'Summary', key: 'summary' },\n { label: 'Status', key: 'status' },\n { label: 'Priority', key: 'priority' },\n { label: 'Owner', key: 'owner' },\n { label: 'Start Date', key: 'start_date' },\n { label: 'Target Date', key: 'target_date' },\n { label: 'Description', key: 'description' },\n { label: 'Created', key: 'created_at' }\n ],\n opts\n );\n });\n\n// Update initiative\ninitiativeCommand\n .command('update')\n .argument('<key>', 'Initiative key')\n .option('-s, --summary <summary>', 'New summary')\n .option('-d, --description <description>', 'New description')\n .option('-p, --priority <priority>', 'New priority')\n .option('--owner <owner>', 'New owner')\n .option('--start <date>', `New start date (${DATE_FORMAT})`)\n .option('--target <date>', `New target date (${DATE_FORMAT})`)\n .description('Update initiative')\n .action((key: string, options) => {\n const opts = getOutputOptions(initiativeCommand);\n\n const initiative = queryOne<{ id: string; start_date: string | null; target_date: string | null }>(\n 'SELECT id, start_date, target_date FROM initiatives WHERE key = ?',\n [key]\n );\n if (!initiative) {\n error(`Initiative \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n\n if (options.summary) {\n updates.push('summary = ?');\n params.push(options.summary);\n }\n if (options.description) {\n updates.push('description = ?');\n params.push(options.description);\n }\n if (options.priority) {\n updates.push('priority = ?');\n params.push(options.priority);\n }\n if (options.owner) {\n updates.push('owner = ?');\n params.push(options.owner);\n }\n\n // Validate and standardize dates if provided\n let startDate: string | null = null;\n let targetDate: string | null = null;\n try {\n if (options.start) {\n startDate = validateAndStandardizeDate(options.start, 'start date');\n updates.push('start_date = ?');\n params.push(startDate);\n }\n if (options.target) {\n targetDate = validateAndStandardizeDate(options.target, 'target date');\n updates.push('target_date = ?');\n params.push(targetDate);\n }\n } catch (err) {\n error(err instanceof Error ? err.message : String(err), opts);\n process.exit(1);\n }\n\n // Validate date order if both are being set or one is being updated\n const effectiveStart = startDate ?? initiative.start_date;\n const effectiveTarget = targetDate ?? initiative.target_date;\n if (effectiveStart && effectiveTarget && !isEndDateValid(effectiveStart, effectiveTarget)) {\n error(`Target date (${effectiveTarget}) must be after start date (${effectiveStart}).`, opts);\n process.exit(1);\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(key);\n\n run(`UPDATE initiatives SET ${updates.join(', ')} WHERE key = ?`, params);\n success(`Initiative \"${key}\" updated.`, opts);\n });\n\n// Transition initiative status\ninitiativeCommand\n .command('transition')\n .argument('<key>', 'Initiative key')\n .argument('<status>', 'New status (draft/active/done/archived)')\n .description('Transition initiative to new status')\n .action((key: string, status: string) => {\n const opts = getOutputOptions(initiativeCommand);\n\n const initiative = queryOne<{ id: string; status: string }>('SELECT id, status FROM initiatives WHERE key = ?', [key]);\n if (!initiative) {\n error(`Initiative \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('initiative', initiative.status, status);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('initiative', initiative.status);\n error(formatTransitionError('initiative', key, initiative.status, status, validTransitions), opts);\n process.exit(1);\n }\n\n run(`UPDATE initiatives SET status = ?, updated_at = datetime('now') WHERE key = ?`, [status, key]);\n success(`Initiative \"${key}\" transitioned from \"${initiative.status}\" to \"${status}\".`, opts);\n });\n\n// Delete initiative\ninitiativeCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Initiative key')\n .option('--force', 'Delete without confirmation')\n .description('Delete initiative')\n .action((key: string) => {\n const opts = getOutputOptions(initiativeCommand);\n\n const initiative = queryOne('SELECT id FROM initiatives WHERE key = ?', [key]);\n if (!initiative) {\n error(`Initiative \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM initiatives WHERE key = ?', [key]);\n success(`Initiative \"${key}\" deleted.`, opts);\n });\n","/**\n * Sync Command\n *\n * File synchronization and document tracking commands.\n * Scans repository files, tracks changes, and parses comments.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { join } from 'path';\nimport { queryOne } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n scanDirectory,\n syncFilesToDatabase,\n getSyncStatus,\n getDocuments,\n ScanOptions\n} from '../services/file-scanner.js';\nimport {\n parseComments,\n syncCommentsToDatabase,\n getCommentStats\n} from '../services/comment-parser.js';\n\nexport const syncCommand = new Command('sync')\n .description('File synchronization and document tracking');\n\n// Scan command - scan and sync files\nsyncCommand\n .command('scan')\n .option('--patterns <patterns>', 'Comma-separated glob patterns (e.g., \"**/*.md,**/*.feature\")')\n .option('--ignore <dirs>', 'Comma-separated directories to ignore')\n .option('--comments', 'Also parse and sync comments from files')\n .option('--shadow', 'Shadow mode: track files without modifying them (for brownfield projects)')\n .option('--track-all', 'Track all source files, not just docs (use with --shadow)')\n .option('--include <patterns>', 'Additional patterns to include (e.g., \"**/*.ts,**/*.js\")')\n .option('--exclude <patterns>', 'Additional patterns to exclude')\n .description('Scan repository files and sync to database')\n .action((options) => {\n const opts = getOutputOptions(syncCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Build scan options\n const scanOptions: ScanOptions = {};\n\n // Shadow mode with --track-all expands patterns to include source files\n if (options.trackAll) {\n // Track all common source files for brownfield analysis\n scanOptions.patterns = [\n '**/*.md', '**/*.feature', '**/*.yaml', '**/*.yml',\n '**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx',\n '**/*.py', '**/*.go', '**/*.rs', '**/*.java',\n '**/*.css', '**/*.scss', '**/*.less',\n '**/*.json', '**/*.toml',\n '**/*.sql', '**/*.graphql'\n ];\n }\n\n // Custom patterns override\n if (options.patterns) {\n scanOptions.patterns = options.patterns.split(',').map((p: string) => p.trim());\n }\n\n // Add include patterns\n if (options.include) {\n const includePatterns = options.include.split(',').map((p: string) => p.trim());\n scanOptions.patterns = [...(scanOptions.patterns ?? []), ...includePatterns];\n }\n\n // Handle ignore/exclude\n if (options.ignore) {\n scanOptions.ignore = options.ignore.split(',').map((d: string) => d.trim());\n }\n if (options.exclude) {\n const excludePatterns = options.exclude.split(',').map((d: string) => d.trim());\n scanOptions.ignore = [...(scanOptions.ignore ?? []), ...excludePatterns];\n }\n\n // Log shadow mode\n const isShadowMode = options.shadow || options.trackAll;\n if (isShadowMode) {\n info('Shadow mode: tracking files without modification', opts);\n }\n\n // Scan files\n info('Scanning files...', opts);\n const files = scanDirectory(projectRoot, scanOptions);\n\n // Sync to database\n const result = syncFilesToDatabase(project.id, projectRoot, files);\n\n // Parse comments if requested\n let commentStats = { new: 0, resolved: 0 };\n if (options.comments) {\n info('Parsing comments...', opts);\n for (const file of files) {\n if (['md', 'feature', 'yaml', 'yml'].includes(file.extension)) {\n try {\n const fullPath = join(projectRoot, file.path);\n const comments = parseComments(fullPath);\n\n // Get document ID\n const doc = queryOne<{ id: string }>(\n 'SELECT id FROM documents WHERE project_id = ? AND path = ?',\n [project.id, file.path]\n );\n\n if (doc && comments.length > 0) {\n const syncResult = syncCommentsToDatabase(doc.id, comments);\n commentStats.new += syncResult.new;\n commentStats.resolved += syncResult.resolved;\n }\n } catch {\n // Skip files that can't be parsed\n }\n }\n }\n }\n\n // Calculate file type breakdown for shadow mode\n const fileTypeBreakdown: Record<string, number> = {};\n for (const file of files) {\n const ext = file.extension || 'other';\n fileTypeBreakdown[ext] = (fileTypeBreakdown[ext] || 0) + 1;\n }\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n shadowMode: isShadowMode,\n files: {\n total: result.total,\n new: result.new,\n modified: result.modified,\n deleted: result.deleted,\n unchanged: result.unchanged\n },\n breakdown: isShadowMode ? fileTypeBreakdown : undefined,\n comments: options.comments ? commentStats : undefined\n }\n }));\n } else {\n success(`Scan complete: ${result.total} files`, opts);\n console.log(` New: ${result.new}`);\n console.log(` Modified: ${result.modified}`);\n console.log(` Deleted: ${result.deleted}`);\n console.log(` Unchanged: ${result.unchanged}`);\n if (options.comments) {\n console.log(` Comments: ${commentStats.new} new, ${commentStats.resolved} resolved`);\n }\n if (isShadowMode && Object.keys(fileTypeBreakdown).length > 0) {\n console.log('\\n File types:');\n for (const [ext, count] of Object.entries(fileTypeBreakdown).sort((a, b) => b[1] - a[1]).slice(0, 10)) {\n console.log(` .${ext}: ${count}`);\n }\n }\n }\n });\n\n// Status command - show sync status\nsyncCommand\n .command('status')\n .description('Show file sync status')\n .action(() => {\n const opts = getOutputOptions(syncCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const status = getSyncStatus(project.id);\n const comments = getCommentStats(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n files: status,\n comments\n }\n }));\n } else {\n details(\n {\n total_files: status.total,\n tracked: status.tracked,\n modified: status.modified,\n deleted: status.deleted,\n last_scan: status.lastScan ?? 'Never',\n total_comments: comments.totalComments,\n user_comments: comments.userComments,\n ai_comments: comments.aiComments,\n docs_with_comments: comments.documentsWithComments\n },\n [\n { label: 'Total Files', key: 'total_files' },\n { label: 'Tracked', key: 'tracked' },\n { label: 'Modified', key: 'modified' },\n { label: 'Deleted', key: 'deleted' },\n { label: 'Last Scan', key: 'last_scan' },\n { label: 'Total Comments', key: 'total_comments' },\n { label: 'User Comments', key: 'user_comments' },\n { label: 'AI Comments', key: 'ai_comments' },\n { label: 'Docs with Comments', key: 'docs_with_comments' }\n ],\n opts\n );\n }\n });\n\n// List command - list tracked documents\nsyncCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status (tracked/modified/deleted)')\n .option('-e, --extension <ext>', 'Filter by extension (md/feature/yaml)')\n .description('List tracked documents')\n .action((options) => {\n const opts = getOutputOptions(syncCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n let documents = getDocuments(project.id, options.status);\n\n // Filter by extension if specified\n if (options.extension) {\n documents = documents.filter((d) => d.extension === options.extension);\n }\n\n data(\n documents,\n [\n { header: 'Path', key: 'path', width: 50 },\n { header: 'Extension', key: 'extension', width: 10 },\n { header: 'Status', key: 'status', width: 10 },\n { header: 'Size', key: 'size_bytes', width: 10 },\n { header: 'Last Scan', key: 'last_scanned_at', width: 20 }\n ],\n opts\n );\n });\n\n// Comments command - list comments across documents\nsyncCommand\n .command('comments')\n .option('-t, --type <type>', 'Filter by type (user/ai)')\n .description('List all unresolved comments')\n .action((options) => {\n const opts = getOutputOptions(syncCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n let query = `\n SELECT dc.id, dc.marker_type as type, dc.line_number, dc.content, d.path\n FROM doc_comments dc\n JOIN documents d ON dc.document_id = d.id\n WHERE d.project_id = ? AND dc.resolved = 0\n `;\n const params: unknown[] = [project.id];\n\n if (options.type) {\n query += ' AND dc.marker_type = ?';\n params.push(options.type);\n }\n\n query += ' ORDER BY d.path, dc.line_number';\n\n const { queryAll } = require('../db/connection.js');\n const comments = queryAll(query, params);\n\n data(\n comments,\n [\n { header: 'Path', key: 'path', width: 40 },\n { header: 'Line', key: 'line_number', width: 6 },\n { header: 'Type', key: 'type', width: 6 },\n { header: 'Content', key: 'content', width: 50 }\n ],\n opts\n );\n });\n","/**\n * File Scanner Service\n *\n * Scans repository files, computes hashes, and tracks changes.\n * Supports glob patterns for filtering files.\n *\n * Implements Tri-State Monitoring:\n * - ALLOW: Focus files - fully tracked + parsed\n * - DENY: Ignored files - skip entirely\n * - UNKNOWN: Unclassified files - tracked minimally, flagged for review\n *\n * @author Vladimir K.S.\n */\n\nimport { createHash } from 'crypto';\nimport { readFileSync, statSync, readdirSync, existsSync } from 'fs';\nimport { join, relative, extname, basename } from 'path';\nimport { queryOne, queryAll, run, generateId } from '../db/connection.js';\nimport { parseFrontmatterFromFile, type FrontmatterMetadata } from './frontmatter-parser.js';\nimport {\n getHardIgnorePatterns,\n getDefaultAllowPatterns,\n getDefaultDenyPatterns,\n isBinaryExtension,\n type MonitoringCategory,\n} from '../config/monitoring-patterns.js';\nimport { loadIgnorePatterns, loadAllowPatterns } from '../utils/config.js';\nimport picomatch from 'picomatch';\n\nexport interface FileInfo {\n path: string;\n filename: string;\n extension: string;\n size: number;\n hash: string | null;\n // Frontmatter metadata (if present)\n hasFrontmatter: boolean;\n frontmatterRaw?: string;\n metadata?: FrontmatterMetadata;\n // Tri-state monitoring\n category: MonitoringCategory;\n isBinary: boolean;\n}\n\nexport interface ScanResult {\n total: number;\n new: number;\n modified: number;\n deleted: number;\n unchanged: number;\n files: FileInfo[];\n}\n\nexport interface ScanOptions {\n patterns?: string[];\n ignore?: string[];\n trackUnknown?: boolean;\n}\n\n// Re-export MonitoringCategory for external use\nexport type { MonitoringCategory };\n\n/**\n * Compute SHA256 hash of file content\n */\nexport function computeFileHash(filePath: string): string {\n const content = readFileSync(filePath);\n return createHash('sha256').update(content).digest('hex');\n}\n\n/**\n * File classifier using tri-state monitoring\n */\nclass FileClassifier {\n private hardIgnoreMatcher: picomatch.Matcher;\n private allowMatcher: picomatch.Matcher;\n private denyMatcher: picomatch.Matcher;\n\n constructor(allowPatterns: string[], denyPatterns: string[]) {\n this.hardIgnoreMatcher = picomatch(getHardIgnorePatterns());\n this.allowMatcher = picomatch(allowPatterns);\n this.denyMatcher = picomatch(denyPatterns);\n }\n\n /**\n * Classify a file into allow/deny/unknown category\n */\n classify(relativePath: string): MonitoringCategory {\n // Hard ignores always take precedence\n if (this.hardIgnoreMatcher(relativePath)) {\n return 'deny';\n }\n\n // Check allow patterns first (focus files)\n if (this.allowMatcher(relativePath)) {\n return 'allow';\n }\n\n // Check deny patterns (soft ignores)\n if (this.denyMatcher(relativePath)) {\n return 'deny';\n }\n\n // File doesn't match either list - unknown (needs review)\n return 'unknown';\n }\n\n /**\n * Check if file should be completely skipped (hard ignore)\n */\n isHardIgnored(relativePath: string): boolean {\n return this.hardIgnoreMatcher(relativePath);\n }\n}\n\n/**\n * Recursively collect files from a directory with tri-state classification\n */\nfunction collectFiles(\n dir: string,\n rootDir: string,\n classifier: FileClassifier,\n trackUnknown: boolean,\n files: FileInfo[] = []\n): FileInfo[] {\n if (!existsSync(dir)) {\n return files;\n }\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = relative(rootDir, fullPath);\n\n // Skip hard-ignored paths entirely (including directories)\n if (classifier.isHardIgnored(relativePath)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n // Check if directory itself should be skipped\n const dirCategory = classifier.classify(relativePath + '/');\n if (dirCategory === 'deny') {\n continue;\n }\n collectFiles(fullPath, rootDir, classifier, trackUnknown, files);\n } else if (entry.isFile()) {\n const category = classifier.classify(relativePath);\n\n // Skip deny files entirely\n if (category === 'deny') {\n continue;\n }\n\n // Skip unknown files if trackUnknown is disabled\n if (category === 'unknown' && !trackUnknown) {\n continue;\n }\n\n try {\n const stats = statSync(fullPath);\n const ext = extname(entry.name).toLowerCase().slice(1);\n const isBinary = isBinaryExtension(ext);\n\n // For binary/unknown files, minimal tracking (no hash for large binaries)\n const shouldComputeHash = category === 'allow' || (!isBinary && stats.size < 10 * 1024 * 1024); // 10MB limit\n const hash = shouldComputeHash ? computeFileHash(fullPath) : null;\n\n // Parse frontmatter only for allow category markdown files\n let hasFrontmatter = false;\n let frontmatterRaw: string | undefined;\n let metadata: FrontmatterMetadata | undefined;\n\n if (category === 'allow' && (ext === 'md' || ext === 'markdown') && !isBinary) {\n const parsed = parseFrontmatterFromFile(fullPath);\n if (parsed) {\n hasFrontmatter = true;\n frontmatterRaw = parsed.raw;\n metadata = parsed.metadata;\n }\n }\n\n files.push({\n path: relativePath,\n filename: entry.name,\n extension: ext,\n size: stats.size,\n hash,\n hasFrontmatter,\n frontmatterRaw,\n metadata,\n category,\n isBinary,\n });\n } catch {\n // Skip files that can't be read\n }\n }\n }\n\n return files;\n}\n\n/**\n * Scan a project directory for tracked files\n */\nexport function scanDirectory(\n projectPath: string,\n options: ScanOptions = {}\n): FileInfo[] {\n // Load patterns from project config or use defaults\n const allowPatterns = options.patterns ?? loadAllowPatterns(projectPath);\n const denyPatterns = options.ignore ?? loadIgnorePatterns(projectPath);\n const trackUnknown = options.trackUnknown ?? true;\n\n // Use default patterns if none provided/loaded\n const finalAllowPatterns = allowPatterns.length > 0 ? allowPatterns : getDefaultAllowPatterns();\n const finalDenyPatterns = denyPatterns.length > 0 ? denyPatterns : getDefaultDenyPatterns();\n\n const classifier = new FileClassifier(finalAllowPatterns, finalDenyPatterns);\n\n return collectFiles(projectPath, projectPath, classifier, trackUnknown);\n}\n\n/**\n * Sync scanned files with the database\n */\nexport function syncFilesToDatabase(\n projectId: string,\n projectPath: string,\n files: FileInfo[]\n): ScanResult {\n const result: ScanResult = {\n total: files.length,\n new: 0,\n modified: 0,\n deleted: 0,\n unchanged: 0,\n files\n };\n\n const now = new Date().toISOString();\n const processedPaths = new Set<string>();\n\n // Process each scanned file\n for (const file of files) {\n processedPaths.add(file.path);\n\n const existing = queryOne<{\n id: string;\n content_hash: string | null;\n status: string;\n }>(\n 'SELECT id, content_hash, status FROM documents WHERE project_id = ? AND path = ?',\n [projectId, file.path]\n );\n\n // Serialize arrays to JSON for storage\n const metaModules = file.metadata?.modules ? JSON.stringify(file.metadata.modules) : null;\n const metaDependencies = file.metadata?.dependencies ? JSON.stringify(file.metadata.dependencies) : null;\n const metaCodeRefs = file.metadata?.code_refs ? JSON.stringify(file.metadata.code_refs) : null;\n const metaAuthors = file.metadata?.authors ? JSON.stringify(file.metadata.authors) : null;\n const needsReview = file.category === 'unknown' ? 1 : 0;\n\n if (!existing) {\n // New file - include frontmatter metadata and monitoring category\n run(\n `INSERT INTO documents (\n id, project_id, path, filename, extension, content_hash, size_bytes, status, last_scanned_at,\n has_frontmatter, frontmatter_raw, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors,\n monitoring_category, needs_review\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'tracked', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n generateId(), projectId, file.path, file.filename, file.extension, file.hash, file.size, now,\n file.hasFrontmatter ? 1 : 0, file.frontmatterRaw ?? null,\n file.metadata?.status ?? null, file.metadata?.version ?? null,\n file.metadata?.tldr ?? null, file.metadata?.title ?? null,\n metaModules, metaDependencies, metaCodeRefs, metaAuthors,\n file.category, needsReview\n ]\n );\n result.new++;\n } else if (existing.content_hash !== file.hash) {\n // Modified file - update with new frontmatter metadata and monitoring category\n run(\n `UPDATE documents SET\n content_hash = ?, size_bytes = ?, status = 'modified', last_scanned_at = ?, updated_at = datetime('now'),\n has_frontmatter = ?, frontmatter_raw = ?, meta_status = ?, meta_version = ?, meta_tldr = ?, meta_title = ?,\n meta_modules = ?, meta_dependencies = ?, meta_code_refs = ?, meta_authors = ?,\n monitoring_category = ?\n WHERE id = ?`,\n [\n file.hash, file.size, now,\n file.hasFrontmatter ? 1 : 0, file.frontmatterRaw ?? null,\n file.metadata?.status ?? null, file.metadata?.version ?? null,\n file.metadata?.tldr ?? null, file.metadata?.title ?? null,\n metaModules, metaDependencies, metaCodeRefs, metaAuthors,\n file.category,\n existing.id\n ]\n );\n result.modified++;\n } else {\n // Unchanged file - just update scan time and ensure category is current\n run(\n `UPDATE documents SET last_scanned_at = ?, status = 'tracked', monitoring_category = ? WHERE id = ?`,\n [now, file.category, existing.id]\n );\n result.unchanged++;\n }\n }\n\n // Mark deleted files (files in DB but not found in scan)\n const dbFiles = queryAll<{ id: string; path: string }>(\n 'SELECT id, path FROM documents WHERE project_id = ? AND status != ?',\n [projectId, 'deleted']\n );\n\n for (const dbFile of dbFiles) {\n if (!processedPaths.has(dbFile.path)) {\n run(\n `UPDATE documents SET status = 'deleted', updated_at = datetime('now') WHERE id = ?`,\n [dbFile.id]\n );\n result.deleted++;\n }\n }\n\n return result;\n}\n\n/**\n * Get sync status for a project\n */\nexport function getSyncStatus(projectId: string): {\n total: number;\n tracked: number;\n modified: number;\n deleted: number;\n lastScan: string | null;\n byCategory: { allow: number; deny: number; unknown: number };\n} {\n const stats = queryOne<{\n total: number;\n tracked: number;\n modified: number;\n deleted: number;\n }>(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'tracked' THEN 1 ELSE 0 END) as tracked,\n SUM(CASE WHEN status = 'modified' THEN 1 ELSE 0 END) as modified,\n SUM(CASE WHEN status = 'deleted' THEN 1 ELSE 0 END) as deleted\n FROM documents\n WHERE project_id = ?\n `, [projectId]);\n\n const categoryStats = queryOne<{\n allow: number;\n deny: number;\n unknown: number;\n }>(`\n SELECT\n SUM(CASE WHEN monitoring_category = 'allow' THEN 1 ELSE 0 END) as allow,\n SUM(CASE WHEN monitoring_category = 'deny' THEN 1 ELSE 0 END) as deny,\n SUM(CASE WHEN monitoring_category = 'unknown' OR monitoring_category IS NULL THEN 1 ELSE 0 END) as unknown\n FROM documents\n WHERE project_id = ?\n `, [projectId]);\n\n const lastScan = queryOne<{ last_scanned_at: string }>(\n 'SELECT MAX(last_scanned_at) as last_scanned_at FROM documents WHERE project_id = ?',\n [projectId]\n );\n\n return {\n total: stats?.total ?? 0,\n tracked: stats?.tracked ?? 0,\n modified: stats?.modified ?? 0,\n deleted: stats?.deleted ?? 0,\n lastScan: lastScan?.last_scanned_at ?? null,\n byCategory: {\n allow: categoryStats?.allow ?? 0,\n deny: categoryStats?.deny ?? 0,\n unknown: categoryStats?.unknown ?? 0\n }\n };\n}\n\n/**\n * Get list of documents for a project\n */\nexport function getDocuments(\n projectId: string,\n status?: string\n): Array<{\n path: string;\n filename: string;\n extension: string;\n status: string;\n size_bytes: number;\n last_scanned_at: string;\n}> {\n let query = `\n SELECT path, filename, extension, status, size_bytes, last_scanned_at\n FROM documents\n WHERE project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n if (status) {\n query += ' AND status = ?';\n params.push(status);\n }\n\n query += ' ORDER BY path';\n\n return queryAll(query, params);\n}\n\n/**\n * Document with frontmatter metadata\n */\nexport interface DocumentWithMetadata {\n id: string;\n path: string;\n filename: string;\n extension: string;\n status: string;\n size_bytes: number;\n last_scanned_at: string;\n has_frontmatter: number;\n meta_status: string | null;\n meta_version: string | null;\n meta_tldr: string | null;\n meta_title: string | null;\n meta_modules: string | null;\n meta_dependencies: string | null;\n meta_code_refs: string | null;\n meta_authors: string | null;\n}\n\n/**\n * Document with shadow mode analysis metadata\n */\nexport interface DocumentWithAnalysis extends DocumentWithMetadata {\n shadow_mode: number;\n analyzed_at: string | null;\n analysis_confidence: number | null;\n file_type: string | null;\n complexity_score: number | null;\n exports: string | null;\n inferred_module: string | null;\n inferred_component: string | null;\n analysis_notes: string | null;\n}\n\n/**\n * Analysis metadata for updating a document\n */\nexport interface AnalysisMetadata {\n tldr?: string;\n module?: string;\n component?: string;\n fileType?: string;\n dependencies?: string[];\n exports?: string[];\n complexity?: number;\n confidence?: number;\n notes?: string;\n}\n\n/**\n * Analysis progress statistics\n */\nexport interface AnalysisProgress {\n total: number;\n analyzed: number;\n unanalyzed: number;\n lowConfidence: number;\n byModule: Record<string, { analyzed: number; total: number }>;\n byFileType: Record<string, number>;\n}\n\n/**\n * Get documents by frontmatter status (e.g., DRAFT, IN-REVIEW, APPROVED, TEMPLATE)\n */\nexport function getDocumentsByMetaStatus(\n projectId: string,\n metaStatus: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_status = ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, metaStatus]\n );\n}\n\n/**\n * Get documents that contain a specific module\n * Modules are stored as JSON arrays, so we use LIKE for matching\n */\nexport function getDocumentsByModule(\n projectId: string,\n module: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_modules LIKE ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, `%\"${module}\"%`]\n );\n}\n\n/**\n * Get documents that depend on a specific file path\n * Dependencies are stored as JSON arrays\n */\nexport function getDocumentsByDependency(\n projectId: string,\n dependencyPath: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_dependencies LIKE ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, `%\"${dependencyPath}\"%`]\n );\n}\n\n/**\n * Get documents that reference a specific code directory\n */\nexport function getDocumentsByCodeRef(\n projectId: string,\n codeRef: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_code_refs LIKE ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, `%\"${codeRef}\"%`]\n );\n}\n\n/**\n * Get all documents with valid frontmatter\n */\nexport function getDocumentsWithFrontmatter(\n projectId: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND has_frontmatter = 1 AND status != 'deleted'\n ORDER BY path`,\n [projectId]\n );\n}\n\n/**\n * Get all documents without frontmatter (shadow mode candidates)\n */\nexport function getDocumentsWithoutFrontmatter(\n projectId: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND (has_frontmatter = 0 OR has_frontmatter IS NULL) AND status != 'deleted'\n ORDER BY path`,\n [projectId]\n );\n}\n\n/**\n * Get document by path with full metadata\n */\nexport function getDocumentByPath(\n projectId: string,\n filePath: string\n): DocumentWithMetadata | undefined {\n return queryOne<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND path = ?`,\n [projectId, filePath]\n );\n}\n\n/**\n * Get TEMPLATE documents for workplan (ordered by path)\n */\nexport function getTemplateDocuments(\n projectId: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_status = 'TEMPLATE' AND status != 'deleted'\n ORDER BY path`,\n [projectId]\n );\n}\n\n/**\n * Search documents by tldr content\n */\nexport function searchDocumentsByTldr(\n projectId: string,\n searchTerm: string\n): DocumentWithMetadata[] {\n return queryAll<DocumentWithMetadata>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors\n FROM documents\n WHERE project_id = ? AND meta_tldr LIKE ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, `%${searchTerm}%`]\n );\n}\n\n// ============================================\n// Shadow Mode Analysis Functions\n// ============================================\n\n/**\n * Get all unanalyzed documents (no analysis metadata set)\n */\nexport function getUnanalyzedDocuments(\n projectId: string,\n limit?: number,\n offset?: number\n): DocumentWithAnalysis[] {\n let query = `\n SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors,\n shadow_mode, analyzed_at, analysis_confidence, file_type,\n complexity_score, exports, inferred_module, inferred_component, analysis_notes\n FROM documents\n WHERE project_id = ? AND analyzed_at IS NULL AND status != 'deleted'\n ORDER BY path\n `;\n const params: unknown[] = [projectId];\n\n if (limit !== undefined) {\n query += ' LIMIT ?';\n params.push(limit);\n }\n if (offset !== undefined) {\n query += ' OFFSET ?';\n params.push(offset);\n }\n\n return queryAll<DocumentWithAnalysis>(query, params);\n}\n\n/**\n * Get count of unanalyzed documents\n */\nexport function getUnanalyzedCount(projectId: string): number {\n const result = queryOne<{ count: number }>(\n `SELECT COUNT(*) as count FROM documents\n WHERE project_id = ? AND analyzed_at IS NULL AND status != 'deleted'`,\n [projectId]\n );\n return result?.count ?? 0;\n}\n\n/**\n * Get documents with analysis (already analyzed)\n */\nexport function getAnalyzedDocuments(\n projectId: string,\n limit?: number\n): DocumentWithAnalysis[] {\n let query = `\n SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors,\n shadow_mode, analyzed_at, analysis_confidence, file_type,\n complexity_score, exports, inferred_module, inferred_component, analysis_notes\n FROM documents\n WHERE project_id = ? AND analyzed_at IS NOT NULL AND status != 'deleted'\n ORDER BY analyzed_at DESC\n `;\n const params: unknown[] = [projectId];\n\n if (limit !== undefined) {\n query += ' LIMIT ?';\n params.push(limit);\n }\n\n return queryAll<DocumentWithAnalysis>(query, params);\n}\n\n/**\n * Get documents with low confidence analysis\n */\nexport function getLowConfidenceDocuments(\n projectId: string,\n threshold: number = 70\n): DocumentWithAnalysis[] {\n return queryAll<DocumentWithAnalysis>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors,\n shadow_mode, analyzed_at, analysis_confidence, file_type,\n complexity_score, exports, inferred_module, inferred_component, analysis_notes\n FROM documents\n WHERE project_id = ? AND analyzed_at IS NOT NULL\n AND analysis_confidence IS NOT NULL AND analysis_confidence < ?\n AND status != 'deleted'\n ORDER BY analysis_confidence ASC`,\n [projectId, threshold]\n );\n}\n\n/**\n * Get documents by inferred module\n */\nexport function getDocumentsByInferredModule(\n projectId: string,\n module: string\n): DocumentWithAnalysis[] {\n return queryAll<DocumentWithAnalysis>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors,\n shadow_mode, analyzed_at, analysis_confidence, file_type,\n complexity_score, exports, inferred_module, inferred_component, analysis_notes\n FROM documents\n WHERE project_id = ? AND inferred_module = ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, module]\n );\n}\n\n/**\n * Get documents by file type\n */\nexport function getDocumentsByFileType(\n projectId: string,\n fileType: string\n): DocumentWithAnalysis[] {\n return queryAll<DocumentWithAnalysis>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors,\n shadow_mode, analyzed_at, analysis_confidence, file_type,\n complexity_score, exports, inferred_module, inferred_component, analysis_notes\n FROM documents\n WHERE project_id = ? AND file_type = ? AND status != 'deleted'\n ORDER BY path`,\n [projectId, fileType]\n );\n}\n\n/**\n * Get document by path with full analysis metadata\n */\nexport function getDocumentWithAnalysis(\n projectId: string,\n filePath: string\n): DocumentWithAnalysis | undefined {\n return queryOne<DocumentWithAnalysis>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors,\n shadow_mode, analyzed_at, analysis_confidence, file_type,\n complexity_score, exports, inferred_module, inferred_component, analysis_notes\n FROM documents\n WHERE project_id = ? AND path = ?`,\n [projectId, filePath]\n );\n}\n\n/**\n * Update document with analysis metadata\n */\nexport function updateDocumentAnalysis(\n projectId: string,\n filePath: string,\n analysis: AnalysisMetadata\n): boolean {\n const doc = getDocumentByPath(projectId, filePath);\n if (!doc) {\n return false;\n }\n\n const now = new Date().toISOString();\n const deps = analysis.dependencies ? JSON.stringify(analysis.dependencies) : null;\n const exps = analysis.exports ? JSON.stringify(analysis.exports) : null;\n\n run(\n `UPDATE documents SET\n meta_tldr = COALESCE(?, meta_tldr),\n meta_dependencies = COALESCE(?, meta_dependencies),\n inferred_module = COALESCE(?, inferred_module),\n inferred_component = COALESCE(?, inferred_component),\n file_type = COALESCE(?, file_type),\n exports = COALESCE(?, exports),\n complexity_score = COALESCE(?, complexity_score),\n analysis_confidence = COALESCE(?, analysis_confidence),\n analysis_notes = COALESCE(?, analysis_notes),\n analyzed_at = ?,\n updated_at = datetime('now')\n WHERE id = ?`,\n [\n analysis.tldr ?? null,\n deps,\n analysis.module ?? null,\n analysis.component ?? null,\n analysis.fileType ?? null,\n exps,\n analysis.complexity ?? null,\n analysis.confidence ?? null,\n analysis.notes ?? null,\n now,\n doc.id\n ]\n );\n\n return true;\n}\n\n/**\n * Get analysis progress statistics\n */\nexport function getAnalysisProgress(projectId: string): AnalysisProgress {\n // Get basic counts\n const counts = queryOne<{\n total: number;\n analyzed: number;\n unanalyzed: number;\n low_confidence: number;\n }>(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN analyzed_at IS NOT NULL THEN 1 ELSE 0 END) as analyzed,\n SUM(CASE WHEN analyzed_at IS NULL THEN 1 ELSE 0 END) as unanalyzed,\n SUM(CASE WHEN analysis_confidence IS NOT NULL AND analysis_confidence < 70 THEN 1 ELSE 0 END) as low_confidence\n FROM documents\n WHERE project_id = ? AND status != 'deleted'\n `, [projectId]);\n\n // Get breakdown by module\n const moduleStats = queryAll<{\n module: string | null;\n analyzed: number;\n total: number;\n }>(`\n SELECT\n COALESCE(inferred_module, 'unknown') as module,\n SUM(CASE WHEN analyzed_at IS NOT NULL THEN 1 ELSE 0 END) as analyzed,\n COUNT(*) as total\n FROM documents\n WHERE project_id = ? AND status != 'deleted'\n GROUP BY COALESCE(inferred_module, 'unknown')\n ORDER BY total DESC\n `, [projectId]);\n\n // Get breakdown by file type\n const typeStats = queryAll<{\n file_type: string | null;\n count: number;\n }>(`\n SELECT\n COALESCE(file_type, extension, 'unknown') as file_type,\n COUNT(*) as count\n FROM documents\n WHERE project_id = ? AND status != 'deleted'\n GROUP BY COALESCE(file_type, extension, 'unknown')\n ORDER BY count DESC\n `, [projectId]);\n\n const byModule: Record<string, { analyzed: number; total: number }> = {};\n for (const stat of moduleStats) {\n byModule[stat.module ?? 'unknown'] = {\n analyzed: stat.analyzed,\n total: stat.total\n };\n }\n\n const byFileType: Record<string, number> = {};\n for (const stat of typeStats) {\n byFileType[stat.file_type ?? 'unknown'] = stat.count;\n }\n\n return {\n total: counts?.total ?? 0,\n analyzed: counts?.analyzed ?? 0,\n unanalyzed: counts?.unanalyzed ?? 0,\n lowConfidence: counts?.low_confidence ?? 0,\n byModule,\n byFileType\n };\n}\n\n/**\n * Get shadow mode documents (tracked but can't have frontmatter)\n */\nexport function getShadowDocuments(projectId: string): DocumentWithAnalysis[] {\n return queryAll<DocumentWithAnalysis>(\n `SELECT id, path, filename, extension, status, size_bytes, last_scanned_at,\n has_frontmatter, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors,\n shadow_mode, analyzed_at, analysis_confidence, file_type,\n complexity_score, exports, inferred_module, inferred_component, analysis_notes\n FROM documents\n WHERE project_id = ? AND shadow_mode = 1 AND status != 'deleted'\n ORDER BY path`,\n [projectId]\n );\n}\n\n/**\n * Mark a document as shadow mode (can't have frontmatter)\n */\nexport function markAsShadowMode(projectId: string, filePath: string): boolean {\n const doc = getDocumentByPath(projectId, filePath);\n if (!doc) {\n return false;\n }\n\n run(\n `UPDATE documents SET shadow_mode = 1, updated_at = datetime('now') WHERE id = ?`,\n [doc.id]\n );\n\n return true;\n}\n\n/**\n * Track a new file in shadow mode (for brownfield projects)\n */\nexport function trackShadowFile(\n projectId: string,\n projectPath: string,\n filePath: string\n): DocumentWithAnalysis | null {\n const fullPath = join(projectPath, filePath);\n if (!existsSync(fullPath)) {\n return null;\n }\n\n // Check if already tracked\n const existing = getDocumentByPath(projectId, filePath);\n if (existing) {\n // Mark as shadow if not already\n markAsShadowMode(projectId, filePath);\n return getDocumentWithAnalysis(projectId, filePath) ?? null;\n }\n\n // Create new shadow document\n try {\n const stats = statSync(fullPath);\n const hash = computeFileHash(fullPath);\n const filename = filePath.split('/').pop() ?? filePath;\n const ext = extname(filename).slice(1);\n const now = new Date().toISOString();\n const id = generateId();\n\n run(\n `INSERT INTO documents (\n id, project_id, path, filename, extension, content_hash, size_bytes,\n status, last_scanned_at, shadow_mode, has_frontmatter\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'tracked', ?, 1, 0)`,\n [id, projectId, filePath, filename, ext, hash, stats.size, now]\n );\n\n return getDocumentWithAnalysis(projectId, filePath) ?? null;\n } catch {\n return null;\n }\n}\n","/**\n * Frontmatter Parser Service\n *\n * Extracts and parses YAML frontmatter from markdown files.\n * Supports the standard AIGILE metadata schema.\n *\n * @author Vladimir K.S.\n */\n\nimport { readFileSync } from 'fs';\nimport { parse as parseYaml } from 'yaml';\n\n/**\n * AIGILE standard frontmatter metadata structure\n */\nexport interface FrontmatterMetadata {\n status?: string; // DRAFT, IN-REVIEW, APPROVED, TEMPLATE, PRODUCTION\n version?: string; // e.g., \"1.0\", \"0.1\"\n tldr?: string; // One-sentence summary\n modules?: string[]; // e.g., [\"auth\", \"auth/oauth\"]\n dependencies?: string[]; // Relative paths to dependent docs\n code_refs?: string[]; // Relative paths to code directories\n authors?: string[]; // Author names\n title?: string; // Document title\n}\n\n/**\n * Full frontmatter structure (may contain nested metadata object)\n */\nexport interface Frontmatter {\n metadata?: FrontmatterMetadata;\n // Allow other top-level keys\n [key: string]: unknown;\n}\n\n/**\n * Result of parsing a file's frontmatter\n */\nexport interface ParsedFrontmatter {\n raw: string; // Raw YAML string\n data: Frontmatter; // Parsed object\n metadata: FrontmatterMetadata; // Extracted metadata (flattened)\n contentStart: number; // Line number where content starts (after frontmatter)\n hasMetadata: boolean; // Whether file has valid frontmatter\n}\n\nconst FRONTMATTER_REGEX = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\n/**\n * Extract frontmatter from markdown content\n */\nexport function extractFrontmatter(content: string): ParsedFrontmatter | null {\n const match = content.match(FRONTMATTER_REGEX);\n\n if (!match) {\n return null;\n }\n\n const raw = match[1];\n const contentStart = content.substring(0, match[0].length).split('\\n').length;\n\n try {\n const data = parseYaml(raw) as Frontmatter;\n\n // Extract metadata - may be nested under 'metadata' key or at root\n let metadata: FrontmatterMetadata = {};\n\n if (data?.metadata && typeof data.metadata === 'object') {\n // Nested metadata object (preferred format)\n metadata = data.metadata as FrontmatterMetadata;\n } else {\n // Check for metadata fields at root level (legacy support)\n metadata = {\n status: data?.status as string | undefined,\n version: data?.version as string | undefined,\n tldr: data?.tldr as string | undefined,\n modules: data?.modules as string[] | undefined,\n dependencies: data?.dependencies as string[] | undefined,\n code_refs: data?.code_refs as string[] | undefined,\n authors: data?.authors as string[] | undefined,\n title: data?.title as string | undefined,\n };\n }\n\n // Normalize arrays\n if (metadata.modules && !Array.isArray(metadata.modules)) {\n metadata.modules = [String(metadata.modules)];\n }\n if (metadata.dependencies && !Array.isArray(metadata.dependencies)) {\n metadata.dependencies = [String(metadata.dependencies)];\n }\n if (metadata.code_refs && !Array.isArray(metadata.code_refs)) {\n metadata.code_refs = [String(metadata.code_refs)];\n }\n if (metadata.authors && !Array.isArray(metadata.authors)) {\n metadata.authors = [String(metadata.authors)];\n }\n\n return {\n raw,\n data,\n metadata,\n contentStart,\n hasMetadata: true\n };\n } catch {\n // Invalid YAML - return null\n return null;\n }\n}\n\n/**\n * Parse frontmatter from a file path\n */\nexport function parseFrontmatterFromFile(filePath: string): ParsedFrontmatter | null {\n try {\n const content = readFileSync(filePath, 'utf-8');\n return extractFrontmatter(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Check if a file has valid frontmatter\n */\nexport function hasFrontmatter(filePath: string): boolean {\n const result = parseFrontmatterFromFile(filePath);\n return result !== null && result.hasMetadata;\n}\n\n/**\n * Get just the metadata from a file (convenience function)\n */\nexport function getFileMetadata(filePath: string): FrontmatterMetadata | null {\n const result = parseFrontmatterFromFile(filePath);\n return result?.metadata ?? null;\n}\n\n/**\n * Serialize metadata back to YAML frontmatter string\n */\nexport function serializeMetadata(metadata: FrontmatterMetadata): string {\n // Build YAML manually for clean output\n const lines: string[] = ['---', 'metadata:'];\n\n if (metadata.status) {\n lines.push(` status: ${metadata.status}`);\n }\n if (metadata.version) {\n lines.push(` version: ${metadata.version}`);\n }\n if (metadata.tldr) {\n lines.push(` tldr: \"${metadata.tldr.replace(/\"/g, '\\\\\"')}\"`);\n }\n if (metadata.title) {\n lines.push(` title: \"${metadata.title.replace(/\"/g, '\\\\\"')}\"`);\n }\n if (metadata.authors && metadata.authors.length > 0) {\n lines.push(` authors: [${metadata.authors.map(a => `\"${a}\"`).join(', ')}]`);\n }\n if (metadata.modules && metadata.modules.length > 0) {\n lines.push(` modules: [${metadata.modules.join(', ')}]`);\n }\n if (metadata.dependencies && metadata.dependencies.length > 0) {\n lines.push(` dependencies: [${metadata.dependencies.join(', ')}]`);\n }\n if (metadata.code_refs && metadata.code_refs.length > 0) {\n lines.push(` code_refs: [${metadata.code_refs.join(', ')}]`);\n }\n\n lines.push('---');\n return lines.join('\\n');\n}\n\n/**\n * Update metadata in a file's content (returns new content)\n */\nexport function updateFrontmatterContent(\n content: string,\n updates: Partial<FrontmatterMetadata>\n): string {\n const existing = extractFrontmatter(content);\n\n if (!existing) {\n // No existing frontmatter - add it\n const metadata: FrontmatterMetadata = {\n status: updates.status ?? 'DRAFT',\n version: updates.version ?? '0.1',\n tldr: updates.tldr ?? '',\n modules: updates.modules ?? [],\n dependencies: updates.dependencies ?? [],\n code_refs: updates.code_refs ?? [],\n };\n return serializeMetadata(metadata) + '\\n\\n' + content;\n }\n\n // Merge updates with existing metadata\n const merged: FrontmatterMetadata = {\n ...existing.metadata,\n ...updates\n };\n\n // Handle array merging for dependencies, modules, code_refs\n if (updates.dependencies && existing.metadata.dependencies) {\n merged.dependencies = [...new Set([\n ...existing.metadata.dependencies,\n ...updates.dependencies\n ])];\n }\n if (updates.modules && existing.metadata.modules) {\n merged.modules = [...new Set([\n ...existing.metadata.modules,\n ...updates.modules\n ])];\n }\n if (updates.code_refs && existing.metadata.code_refs) {\n merged.code_refs = [...new Set([\n ...existing.metadata.code_refs,\n ...updates.code_refs\n ])];\n }\n\n // Replace frontmatter in content\n const newFrontmatter = serializeMetadata(merged);\n return content.replace(FRONTMATTER_REGEX, newFrontmatter + '\\n\\n');\n}\n","/**\n * Comment Parser Service\n *\n * Parses document files for special comment markers:\n * - [[! ... ]] - User comments/questions\n * - [{! ... }] - AI suggestions/responses\n *\n * Supports both single-line and multi-line comments.\n *\n * @author Vladimir K.S.\n */\n\nimport { readFileSync } from 'fs';\nimport { run, queryAll, queryOne, generateId } from '../db/connection.js';\n\nexport type MarkerType = 'user' | 'ai';\n\nexport interface ParsedComment {\n type: MarkerType;\n content: string;\n lineNumber: number;\n raw: string;\n}\n\nexport interface CommentSyncResult {\n total: number;\n new: number;\n resolved: number;\n}\n\n// Regex patterns for comment markers\nconst USER_COMMENT_PATTERN = /\\[\\[!\\s*([\\s\\S]*?)\\s*\\]\\]/g;\nconst AI_COMMENT_PATTERN = /\\[\\{!\\s*([\\s\\S]*?)\\s*\\}]/g;\n\n/**\n * Parse a file for comment markers\n */\nexport function parseComments(filePath: string): ParsedComment[] {\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n');\n const comments: ParsedComment[] = [];\n\n // Track which line each character position maps to\n const positionToLine: number[] = [];\n let pos = 0;\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const lineLength = lines[lineNum].length + 1; // +1 for newline\n for (let i = 0; i < lineLength; i++) {\n positionToLine[pos++] = lineNum + 1; // 1-indexed line numbers\n }\n }\n\n // Find user comments [[! ... ]]\n let match: RegExpExecArray | null;\n USER_COMMENT_PATTERN.lastIndex = 0;\n while ((match = USER_COMMENT_PATTERN.exec(content)) !== null) {\n comments.push({\n type: 'user',\n content: match[1].trim(),\n lineNumber: positionToLine[match.index] ?? 1,\n raw: match[0]\n });\n }\n\n // Find AI comments [{! ... }]\n AI_COMMENT_PATTERN.lastIndex = 0;\n while ((match = AI_COMMENT_PATTERN.exec(content)) !== null) {\n comments.push({\n type: 'ai',\n content: match[1].trim(),\n lineNumber: positionToLine[match.index] ?? 1,\n raw: match[0]\n });\n }\n\n // Sort by line number\n comments.sort((a, b) => a.lineNumber - b.lineNumber);\n\n return comments;\n}\n\n/**\n * Sync parsed comments to the database\n */\nexport function syncCommentsToDatabase(\n documentId: string,\n comments: ParsedComment[]\n): CommentSyncResult {\n const result: CommentSyncResult = {\n total: comments.length,\n new: 0,\n resolved: 0\n };\n\n // Get existing unresolved comments for this document\n const existingComments = queryAll<{\n id: string;\n marker_type: string;\n line_number: number;\n content: string;\n }>(\n 'SELECT id, marker_type, line_number, content FROM doc_comments WHERE document_id = ? AND resolved = 0',\n [documentId]\n );\n\n const processedIds = new Set<string>();\n\n // Process each parsed comment\n for (const comment of comments) {\n const markerType = comment.type === 'user' ? 'user' : 'ai';\n\n // Check if this comment already exists (match by type and content)\n const existing = existingComments.find(\n (e) => e.marker_type === markerType && e.content === comment.content\n );\n\n if (existing) {\n processedIds.add(existing.id);\n // Update line number if changed\n if (existing.line_number !== comment.lineNumber) {\n run(\n 'UPDATE doc_comments SET line_number = ? WHERE id = ?',\n [comment.lineNumber, existing.id]\n );\n }\n } else {\n // New comment\n run(\n `INSERT INTO doc_comments (id, document_id, marker_type, line_number, content)\n VALUES (?, ?, ?, ?, ?)`,\n [generateId(), documentId, markerType, comment.lineNumber, comment.content]\n );\n result.new++;\n }\n }\n\n // Mark comments as resolved if they no longer exist in the file\n for (const existing of existingComments) {\n if (!processedIds.has(existing.id)) {\n run('UPDATE doc_comments SET resolved = 1 WHERE id = ?', [existing.id]);\n result.resolved++;\n }\n }\n\n return result;\n}\n\n/**\n * Get all unresolved comments for a document\n */\nexport function getDocumentComments(documentId: string): Array<{\n id: string;\n type: MarkerType;\n lineNumber: number;\n content: string;\n}> {\n const comments = queryAll<{\n id: string;\n marker_type: string;\n line_number: number;\n content: string;\n }>(\n 'SELECT id, marker_type, line_number, content FROM doc_comments WHERE document_id = ? AND resolved = 0 ORDER BY line_number',\n [documentId]\n );\n\n return comments.map((c) => ({\n id: c.id,\n type: c.marker_type as MarkerType,\n lineNumber: c.line_number,\n content: c.content\n }));\n}\n\n/**\n * Get comment statistics for a project\n */\nexport function getCommentStats(projectId: string): {\n totalComments: number;\n userComments: number;\n aiComments: number;\n documentsWithComments: number;\n} {\n const stats = queryOne<{\n total: number;\n user_count: number;\n ai_count: number;\n doc_count: number;\n }>(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN dc.marker_type = 'user' THEN 1 ELSE 0 END) as user_count,\n SUM(CASE WHEN dc.marker_type = 'ai' THEN 1 ELSE 0 END) as ai_count,\n COUNT(DISTINCT dc.document_id) as doc_count\n FROM doc_comments dc\n JOIN documents d ON dc.document_id = d.id\n WHERE d.project_id = ? AND dc.resolved = 0\n `, [projectId]);\n\n return {\n totalComments: stats?.total ?? 0,\n userComments: stats?.user_count ?? 0,\n aiComments: stats?.ai_count ?? 0,\n documentsWithComments: stats?.doc_count ?? 0\n };\n}\n\n/**\n * Mark a comment as resolved\n */\nexport function resolveComment(commentId: string): boolean {\n const comment = queryOne('SELECT id FROM doc_comments WHERE id = ?', [commentId]);\n if (!comment) {\n return false;\n }\n\n run('UPDATE doc_comments SET resolved = 1 WHERE id = ?', [commentId]);\n return true;\n}\n","/**\n * Session Command\n *\n * Manages AI work sessions for context continuity.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryOne } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n startSession,\n endSession,\n getActiveSession,\n listSessions,\n getSession\n} from '../services/session-service.js';\nimport {\n getActivityLog,\n getActivitySummary\n} from '../services/activity-logger.js';\n\nexport const sessionCommand = new Command('session')\n .description('Manage AI work sessions');\n\n// Start a new session\nsessionCommand\n .command('start')\n .description('Start a new AI work session')\n .action(() => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const session = startSession(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n sessionId: session.id,\n startedAt: session.startedAt\n }\n }));\n } else {\n success(`Session started: ${session.id.slice(0, 8)}...`, opts);\n info(`Started at: ${session.startedAt}`, opts);\n }\n });\n\n// End the current session\nsessionCommand\n .command('end')\n .option('-s, --summary <summary>', 'Session summary')\n .description('End the current AI work session')\n .action((options) => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const session = endSession(project.id, options.summary);\n\n if (!session) {\n error('No active session to end.', opts);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n sessionId: session.id,\n startedAt: session.startedAt,\n endedAt: session.endedAt,\n entitiesModified: session.entitiesModified,\n filesModified: session.filesModified\n }\n }));\n } else {\n success(`Session ended: ${session.id.slice(0, 8)}...`, opts);\n console.log(` Duration: ${calculateDuration(session.startedAt, session.endedAt)}`);\n console.log(` Entities modified: ${session.entitiesModified}`);\n console.log(` Files modified: ${session.filesModified}`);\n }\n });\n\n// Show current session status\nsessionCommand\n .command('status')\n .description('Show current session status')\n .action(() => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const session = getActiveSession(project.id);\n\n if (!session) {\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { active: false } }));\n } else {\n info('No active session.', opts);\n }\n return;\n }\n\n const activitySummary = getActivitySummary(project.id, session.startedAt);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n active: true,\n sessionId: session.id,\n startedAt: session.startedAt,\n duration: calculateDuration(session.startedAt, null),\n entitiesModified: session.entitiesModified,\n filesModified: session.filesModified,\n activity: activitySummary\n }\n }));\n } else {\n details(\n {\n session_id: session.id.slice(0, 8) + '...',\n started_at: session.startedAt,\n duration: calculateDuration(session.startedAt, null),\n entities_modified: session.entitiesModified,\n files_modified: session.filesModified,\n creates: activitySummary.creates,\n updates: activitySummary.updates,\n transitions: activitySummary.transitions\n },\n [\n { label: 'Session ID', key: 'session_id' },\n { label: 'Started', key: 'started_at' },\n { label: 'Duration', key: 'duration' },\n { label: 'Entities Modified', key: 'entities_modified' },\n { label: 'Files Modified', key: 'files_modified' },\n { label: 'Creates', key: 'creates' },\n { label: 'Updates', key: 'updates' },\n { label: 'Transitions', key: 'transitions' }\n ],\n opts\n );\n }\n });\n\n// List sessions\nsessionCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status (active/completed/abandoned)')\n .option('-n, --limit <n>', 'Limit number of results', '10')\n .description('List sessions')\n .action((options) => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const sessions = listSessions(project.id, {\n status: options.status,\n limit: parseInt(options.limit, 10)\n });\n\n data(\n sessions.map((s) => ({\n id: s.id.slice(0, 8) + '...',\n started: s.startedAt,\n duration: s.duration,\n status: s.status,\n entities: s.entitiesModified,\n files: s.filesModified\n })),\n [\n { header: 'ID', key: 'id', width: 12 },\n { header: 'Started', key: 'started', width: 20 },\n { header: 'Duration', key: 'duration', width: 10 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Entities', key: 'entities', width: 10 },\n { header: 'Files', key: 'files', width: 8 }\n ],\n opts\n );\n });\n\n// Show session details with activity\nsessionCommand\n .command('show')\n .argument('<id>', 'Session ID (or partial ID)')\n .description('Show session details and activity')\n .action((id: string) => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Try to find session by full or partial ID\n const sessions = listSessions(project.id, { limit: 100 });\n const session = sessions.find((s) => s.id.startsWith(id) || s.id === id);\n\n if (!session) {\n error(`Session \"${id}\" not found.`, opts);\n process.exit(1);\n }\n\n const fullSession = getSession(session.id);\n if (!fullSession) {\n error(`Session \"${id}\" not found.`, opts);\n process.exit(1);\n }\n\n const activity = getActivityLog(project.id, {\n since: fullSession.startedAt,\n limit: 20\n });\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n session: fullSession,\n activity\n }\n }));\n } else {\n details(\n {\n id: fullSession.id,\n status: fullSession.status,\n started: fullSession.startedAt,\n ended: fullSession.endedAt ?? 'Active',\n duration: calculateDuration(fullSession.startedAt, fullSession.endedAt),\n entities: fullSession.entitiesModified,\n files: fullSession.filesModified,\n summary: fullSession.summary ?? '-'\n },\n [\n { label: 'Session ID', key: 'id' },\n { label: 'Status', key: 'status' },\n { label: 'Started', key: 'started' },\n { label: 'Ended', key: 'ended' },\n { label: 'Duration', key: 'duration' },\n { label: 'Entities Modified', key: 'entities' },\n { label: 'Files Modified', key: 'files' },\n { label: 'Summary', key: 'summary' }\n ],\n opts\n );\n\n if (activity.length > 0) {\n console.log('\\nRecent Activity:');\n data(\n activity.map((a) => ({\n time: a.createdAt.split('T')[1]?.split('.')[0] ?? a.createdAt,\n type: a.entityType,\n action: a.action,\n entity: a.entityId.slice(0, 8) + '...'\n })),\n [\n { header: 'Time', key: 'time', width: 10 },\n { header: 'Type', key: 'type', width: 12 },\n { header: 'Action', key: 'action', width: 12 },\n { header: 'Entity', key: 'entity', width: 12 }\n ],\n opts\n );\n }\n }\n });\n\n// Activity log command\nsessionCommand\n .command('activity')\n .option('-t, --type <type>', 'Filter by entity type')\n .option('-a, --action <action>', 'Filter by action (create/update/delete/transition)')\n .option('-n, --limit <n>', 'Limit number of results', '20')\n .description('Show recent activity log')\n .action((options) => {\n const opts = getOutputOptions(sessionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const activity = getActivityLog(project.id, {\n entityType: options.type,\n action: options.action,\n limit: parseInt(options.limit, 10)\n });\n\n data(\n activity.map((a) => ({\n time: a.createdAt,\n type: a.entityType,\n action: a.action,\n entity: a.entityId.slice(0, 8) + '...',\n actor: a.actor ?? '-'\n })),\n [\n { header: 'Time', key: 'time', width: 20 },\n { header: 'Type', key: 'type', width: 12 },\n { header: 'Action', key: 'action', width: 12 },\n { header: 'Entity', key: 'entity', width: 12 },\n { header: 'Actor', key: 'actor', width: 15 }\n ],\n opts\n );\n });\n\n/**\n * Calculate duration string\n */\nfunction calculateDuration(start: string, end: string | null): string {\n const startDate = new Date(start);\n const endDate = end ? new Date(end) : new Date();\n\n const diffMs = endDate.getTime() - startDate.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) {\n return '<1m';\n } else if (diffMins < 60) {\n return `${diffMins}m`;\n } else {\n const hours = Math.floor(diffMins / 60);\n const mins = diffMins % 60;\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n}\n","/**\n * Session Service\n *\n * Manages AI work sessions for context continuity.\n * Tracks session duration, entities modified, and files changed.\n *\n * @author Vladimir K.S.\n */\n\nimport { queryOne, queryAll, run, generateId } from '../db/connection.js';\n\nexport interface Session {\n id: string;\n projectId: string;\n startedAt: string;\n endedAt: string | null;\n summary: string | null;\n entitiesModified: number;\n filesModified: number;\n status: 'active' | 'completed' | 'abandoned';\n}\n\nexport interface SessionSummary {\n id: string;\n startedAt: string;\n endedAt: string | null;\n duration: string;\n status: string;\n entitiesModified: number;\n filesModified: number;\n summary: string | null;\n}\n\n/**\n * Start a new session\n */\nexport function startSession(projectId: string): Session {\n // Check for existing active session\n const existing = queryOne<{ id: string }>(\n 'SELECT id FROM sessions WHERE project_id = ? AND status = ?',\n [projectId, 'active']\n );\n\n if (existing) {\n // End the existing session as abandoned\n run(\n `UPDATE sessions SET status = 'abandoned', ended_at = datetime('now') WHERE id = ?`,\n [existing.id]\n );\n }\n\n const sessionId = generateId();\n const now = new Date().toISOString();\n\n run(\n `INSERT INTO sessions (id, project_id, started_at, status, entities_modified, files_modified)\n VALUES (?, ?, ?, 'active', 0, 0)`,\n [sessionId, projectId, now]\n );\n\n return {\n id: sessionId,\n projectId,\n startedAt: now,\n endedAt: null,\n summary: null,\n entitiesModified: 0,\n filesModified: 0,\n status: 'active'\n };\n}\n\n/**\n * End the current active session\n */\nexport function endSession(projectId: string, summary?: string): Session | null {\n const session = queryOne<{\n id: string;\n started_at: string;\n entities_modified: number;\n files_modified: number;\n }>(\n 'SELECT id, started_at, entities_modified, files_modified FROM sessions WHERE project_id = ? AND status = ?',\n [projectId, 'active']\n );\n\n if (!session) {\n return null;\n }\n\n const now = new Date().toISOString();\n\n run(\n `UPDATE sessions SET status = 'completed', ended_at = ?, summary = ? WHERE id = ?`,\n [now, summary ?? null, session.id]\n );\n\n return {\n id: session.id,\n projectId,\n startedAt: session.started_at,\n endedAt: now,\n summary: summary ?? null,\n entitiesModified: session.entities_modified,\n filesModified: session.files_modified,\n status: 'completed'\n };\n}\n\n/**\n * Get the current active session\n */\nexport function getActiveSession(projectId: string): Session | null {\n const session = queryOne<{\n id: string;\n project_id: string;\n started_at: string;\n ended_at: string | null;\n summary: string | null;\n entities_modified: number;\n files_modified: number;\n status: string;\n }>(\n 'SELECT * FROM sessions WHERE project_id = ? AND status = ?',\n [projectId, 'active']\n );\n\n if (!session) {\n return null;\n }\n\n return {\n id: session.id,\n projectId: session.project_id,\n startedAt: session.started_at,\n endedAt: session.ended_at,\n summary: session.summary,\n entitiesModified: session.entities_modified,\n filesModified: session.files_modified,\n status: session.status as 'active'\n };\n}\n\n/**\n * Increment entity count for active session\n */\nexport function incrementSessionEntities(projectId: string, count: number = 1): void {\n run(\n `UPDATE sessions SET entities_modified = entities_modified + ? WHERE project_id = ? AND status = 'active'`,\n [count, projectId]\n );\n}\n\n/**\n * Increment file count for active session\n */\nexport function incrementSessionFiles(projectId: string, count: number = 1): void {\n run(\n `UPDATE sessions SET files_modified = files_modified + ? WHERE project_id = ? AND status = 'active'`,\n [count, projectId]\n );\n}\n\n/**\n * List sessions for a project\n */\nexport function listSessions(\n projectId: string,\n options: { status?: string; limit?: number } = {}\n): SessionSummary[] {\n let query = `\n SELECT id, started_at, ended_at, status, entities_modified, files_modified, summary\n FROM sessions\n WHERE project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n if (options.status) {\n query += ' AND status = ?';\n params.push(options.status);\n }\n\n query += ' ORDER BY started_at DESC';\n\n if (options.limit) {\n query += ' LIMIT ?';\n params.push(options.limit);\n }\n\n const sessions = queryAll<{\n id: string;\n started_at: string;\n ended_at: string | null;\n status: string;\n entities_modified: number;\n files_modified: number;\n summary: string | null;\n }>(query, params);\n\n return sessions.map((s) => ({\n id: s.id,\n startedAt: s.started_at,\n endedAt: s.ended_at,\n duration: calculateDuration(s.started_at, s.ended_at),\n status: s.status,\n entitiesModified: s.entities_modified,\n filesModified: s.files_modified,\n summary: s.summary\n }));\n}\n\n/**\n * Get session by ID\n */\nexport function getSession(sessionId: string): Session | null {\n const session = queryOne<{\n id: string;\n project_id: string;\n started_at: string;\n ended_at: string | null;\n summary: string | null;\n entities_modified: number;\n files_modified: number;\n status: string;\n }>('SELECT * FROM sessions WHERE id = ?', [sessionId]);\n\n if (!session) {\n return null;\n }\n\n return {\n id: session.id,\n projectId: session.project_id,\n startedAt: session.started_at,\n endedAt: session.ended_at,\n summary: session.summary,\n entitiesModified: session.entities_modified,\n filesModified: session.files_modified,\n status: session.status as Session['status']\n };\n}\n\n/**\n * Calculate human-readable duration\n */\nfunction calculateDuration(start: string, end: string | null): string {\n const startDate = new Date(start);\n const endDate = end ? new Date(end) : new Date();\n\n const diffMs = endDate.getTime() - startDate.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) {\n return '<1m';\n } else if (diffMins < 60) {\n return `${diffMins}m`;\n } else {\n const hours = Math.floor(diffMins / 60);\n const mins = diffMins % 60;\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n}\n","/**\n * Activity Logger Service\n *\n * Logs all entity changes for audit trail and AI context.\n * Tracks create, update, delete, and transition actions.\n *\n * @author Vladimir K.S.\n */\n\nimport { queryAll, run, generateId } from '../db/connection.js';\nimport { incrementSessionEntities } from './session-service.js';\n\nexport type EntityType = 'initiative' | 'epic' | 'story' | 'task' | 'bug' | 'sprint' | 'document' | 'component' | 'version' | 'persona' | 'ux_journey';\nexport type ActionType = 'create' | 'update' | 'delete' | 'transition' | 'link' | 'unlink';\n\nexport interface ActivityEntry {\n id: string;\n projectId: string;\n entityType: EntityType;\n entityId: string;\n action: ActionType;\n oldValue: string | null;\n newValue: string | null;\n actor: string | null;\n createdAt: string;\n}\n\nexport interface ActivityLogOptions {\n entityType?: EntityType;\n entityId?: string;\n action?: ActionType;\n limit?: number;\n since?: string;\n}\n\n/**\n * Log an activity\n */\nexport function logActivity(\n projectId: string,\n entityType: EntityType,\n entityId: string,\n action: ActionType,\n options: {\n oldValue?: string | Record<string, unknown>;\n newValue?: string | Record<string, unknown>;\n actor?: string;\n } = {}\n): void {\n const id = generateId();\n\n const oldVal = options.oldValue\n ? typeof options.oldValue === 'string'\n ? options.oldValue\n : JSON.stringify(options.oldValue)\n : null;\n\n const newVal = options.newValue\n ? typeof options.newValue === 'string'\n ? options.newValue\n : JSON.stringify(options.newValue)\n : null;\n\n run(\n `INSERT INTO activity_log (id, project_id, entity_type, entity_id, action, old_value, new_value, actor)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, projectId, entityType, entityId, action, oldVal, newVal, options.actor ?? null]\n );\n\n // Increment session entity count\n incrementSessionEntities(projectId, 1);\n}\n\n/**\n * Log a create action\n */\nexport function logCreate(\n projectId: string,\n entityType: EntityType,\n entityId: string,\n data: Record<string, unknown>,\n actor?: string\n): void {\n logActivity(projectId, entityType, entityId, 'create', {\n newValue: data,\n actor\n });\n}\n\n/**\n * Log an update action\n */\nexport function logUpdate(\n projectId: string,\n entityType: EntityType,\n entityId: string,\n changes: { field: string; oldValue: unknown; newValue: unknown }[],\n actor?: string\n): void {\n const oldValue: Record<string, unknown> = {};\n const newValue: Record<string, unknown> = {};\n\n for (const change of changes) {\n oldValue[change.field] = change.oldValue;\n newValue[change.field] = change.newValue;\n }\n\n logActivity(projectId, entityType, entityId, 'update', {\n oldValue,\n newValue,\n actor\n });\n}\n\n/**\n * Log a transition action\n */\nexport function logTransition(\n projectId: string,\n entityType: EntityType,\n entityId: string,\n oldStatus: string,\n newStatus: string,\n actor?: string\n): void {\n logActivity(projectId, entityType, entityId, 'transition', {\n oldValue: oldStatus,\n newValue: newStatus,\n actor\n });\n}\n\n/**\n * Log a delete action\n */\nexport function logDelete(\n projectId: string,\n entityType: EntityType,\n entityId: string,\n data: Record<string, unknown>,\n actor?: string\n): void {\n logActivity(projectId, entityType, entityId, 'delete', {\n oldValue: data,\n actor\n });\n}\n\n/**\n * Get activity log entries\n */\nexport function getActivityLog(\n projectId: string,\n options: ActivityLogOptions = {}\n): ActivityEntry[] {\n let query = `\n SELECT id, project_id, entity_type, entity_id, action, old_value, new_value, actor, created_at\n FROM activity_log\n WHERE project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n if (options.entityType) {\n query += ' AND entity_type = ?';\n params.push(options.entityType);\n }\n\n if (options.entityId) {\n query += ' AND entity_id = ?';\n params.push(options.entityId);\n }\n\n if (options.action) {\n query += ' AND action = ?';\n params.push(options.action);\n }\n\n if (options.since) {\n query += ' AND created_at >= ?';\n params.push(options.since);\n }\n\n query += ' ORDER BY created_at DESC';\n\n if (options.limit) {\n query += ' LIMIT ?';\n params.push(options.limit);\n }\n\n const entries = queryAll<{\n id: string;\n project_id: string;\n entity_type: string;\n entity_id: string;\n action: string;\n old_value: string | null;\n new_value: string | null;\n actor: string | null;\n created_at: string;\n }>(query, params);\n\n return entries.map((e) => ({\n id: e.id,\n projectId: e.project_id,\n entityType: e.entity_type as EntityType,\n entityId: e.entity_id,\n action: e.action as ActionType,\n oldValue: e.old_value,\n newValue: e.new_value,\n actor: e.actor,\n createdAt: e.created_at\n }));\n}\n\n/**\n * Get activity summary for a project\n */\nexport function getActivitySummary(\n projectId: string,\n since?: string\n): {\n totalActions: number;\n creates: number;\n updates: number;\n deletes: number;\n transitions: number;\n byEntityType: Record<string, number>;\n} {\n let query = `\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN action = 'create' THEN 1 ELSE 0 END) as creates,\n SUM(CASE WHEN action = 'update' THEN 1 ELSE 0 END) as updates,\n SUM(CASE WHEN action = 'delete' THEN 1 ELSE 0 END) as deletes,\n SUM(CASE WHEN action = 'transition' THEN 1 ELSE 0 END) as transitions\n FROM activity_log\n WHERE project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n if (since) {\n query += ' AND created_at >= ?';\n params.push(since);\n }\n\n const stats = queryAll<{\n total: number;\n creates: number;\n updates: number;\n deletes: number;\n transitions: number;\n }>(query, params)[0] ?? { total: 0, creates: 0, updates: 0, deletes: 0, transitions: 0 };\n\n // Get counts by entity type\n let typeQuery = `\n SELECT entity_type, COUNT(*) as count\n FROM activity_log\n WHERE project_id = ?\n `;\n const typeParams: unknown[] = [projectId];\n\n if (since) {\n typeQuery += ' AND created_at >= ?';\n typeParams.push(since);\n }\n\n typeQuery += ' GROUP BY entity_type';\n\n const typeCounts = queryAll<{ entity_type: string; count: number }>(typeQuery, typeParams);\n const byEntityType: Record<string, number> = {};\n for (const tc of typeCounts) {\n byEntityType[tc.entity_type] = tc.count;\n }\n\n return {\n totalActions: stats.total,\n creates: stats.creates,\n updates: stats.updates,\n deletes: stats.deletes,\n transitions: stats.transitions,\n byEntityType\n };\n}\n\n/**\n * Get recent activity for an entity\n */\nexport function getEntityHistory(\n entityType: EntityType,\n entityId: string,\n limit: number = 10\n): ActivityEntry[] {\n const entries = queryAll<{\n id: string;\n project_id: string;\n entity_type: string;\n entity_id: string;\n action: string;\n old_value: string | null;\n new_value: string | null;\n actor: string | null;\n created_at: string;\n }>(\n `SELECT * FROM activity_log WHERE entity_type = ? AND entity_id = ? ORDER BY created_at DESC LIMIT ?`,\n [entityType, entityId, limit]\n );\n\n return entries.map((e) => ({\n id: e.id,\n projectId: e.project_id,\n entityType: e.entity_type as EntityType,\n entityId: e.entity_id,\n action: e.action as ActionType,\n oldValue: e.old_value,\n newValue: e.new_value,\n actor: e.actor,\n createdAt: e.created_at\n }));\n}\n","/**\n * Context Command\n *\n * Progressive context loading for AI agents.\n * Provides structured project context at different detail levels.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryOne } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n loadContext,\n getEntityContext,\n getResumeContext,\n ContextLevel\n} from '../services/context-loader.js';\n\nexport const contextCommand = new Command('context')\n .description('Load project context for AI agents');\n\n// Load context at specified level\ncontextCommand\n .command('load')\n .option('-l, --level <level>', 'Context level (minimal/summary/standard/full)', 'standard')\n .description('Load project context at specified detail level')\n .action((options) => {\n const opts = getOutputOptions(contextCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const validLevels: ContextLevel[] = ['minimal', 'summary', 'standard', 'full'];\n if (!validLevels.includes(options.level as ContextLevel)) {\n error(`Invalid level. Valid values: ${validLevels.join(', ')}`, opts);\n process.exit(1);\n }\n\n const context = loadContext(project.id, options.level as ContextLevel);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: context }));\n } else {\n // Human-readable output\n console.log(`\\n=== Project Context (${context.level}) ===\\n`);\n\n console.log(`Project: ${context.project.name} (${context.project.key})`);\n console.log(`Path: ${context.project.path}`);\n console.log(`Session: ${context.session.active ? `Active (${context.session.duration})` : 'None'}`);\n\n if ('counts' in context) {\n console.log('\\nEntity Counts:');\n console.log(` Initiatives: ${context.counts.initiatives}`);\n console.log(` Epics: ${context.counts.epics}`);\n console.log(` Stories: ${context.counts.stories}`);\n console.log(` Tasks: ${context.counts.tasks}`);\n console.log(` Bugs: ${context.counts.bugs}`);\n console.log(` Documents: ${context.counts.documents}`);\n console.log(` Comments: ${context.counts.comments}`);\n\n console.log('\\nRecent Activity (24h):');\n console.log(` Total: ${context.recentActivity.totalActions}`);\n console.log(` Creates: ${context.recentActivity.creates}`);\n console.log(` Updates: ${context.recentActivity.updates}`);\n console.log(` Transitions: ${context.recentActivity.transitions}`);\n }\n\n if ('activeSprint' in context && context.activeSprint) {\n console.log('\\nActive Sprint:');\n console.log(` Name: ${context.activeSprint.name}`);\n console.log(` Goal: ${context.activeSprint.goal ?? '-'}`);\n console.log(` Stories: ${context.activeSprint.storiesCount}`);\n console.log(` Tasks: ${context.activeSprint.tasksCount}`);\n }\n\n if ('inProgress' in context) {\n const total =\n context.inProgress.stories.length +\n context.inProgress.tasks.length +\n context.inProgress.bugs.length;\n console.log(`\\nIn Progress: ${total} items`);\n\n if (context.inProgress.stories.length > 0) {\n console.log(' Stories:');\n for (const s of context.inProgress.stories.slice(0, 5)) {\n console.log(` - ${s.key}: ${s.summary}`);\n }\n }\n\n if (context.blockers.length > 0) {\n console.log(`\\nBlockers: ${context.blockers.length}`);\n for (const b of context.blockers) {\n console.log(` - ${b.key}: ${b.summary}`);\n }\n }\n }\n\n if ('initiatives' in context) {\n console.log(`\\nInitiatives: ${context.initiatives.length}`);\n for (const i of context.initiatives.slice(0, 5)) {\n console.log(` - ${i.key}: ${i.summary} (${i.status})`);\n }\n\n console.log(`\\nEpics: ${context.epics.length}`);\n for (const e of context.epics.slice(0, 5)) {\n console.log(` - ${e.key}: ${e.summary} (${e.status})`);\n }\n\n if (context.pendingComments.length > 0) {\n console.log(`\\nPending Comments: ${context.pendingComments.length}`);\n for (const c of context.pendingComments.slice(0, 5)) {\n console.log(` - ${c.path}:${c.line} [${c.type}]: ${c.content.slice(0, 50)}...`);\n }\n }\n }\n\n console.log('');\n }\n });\n\n// Get resume context for continuing work\ncontextCommand\n .command('resume')\n .description('Get context for resuming work from previous session')\n .action(() => {\n const opts = getOutputOptions(contextCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const resumeContext = getResumeContext(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: resumeContext }));\n } else {\n console.log('\\n=== Resume Context ===\\n');\n\n if (resumeContext.lastSession) {\n console.log('Last Session:');\n console.log(` Ended: ${resumeContext.lastSession.endedAt}`);\n console.log(` Summary: ${resumeContext.lastSession.summary ?? '-'}`);\n console.log(` Entities Modified: ${resumeContext.lastSession.entitiesModified}`);\n } else {\n console.log('No previous session found.');\n }\n\n console.log('\\nRecent Changes:');\n if (resumeContext.recentChanges.length > 0) {\n for (const change of resumeContext.recentChanges) {\n console.log(` - ${change.action} ${change.entityType} ${change.entityKey}`);\n }\n } else {\n console.log(' None');\n }\n\n console.log('\\nPending Work:');\n console.log(` In Progress: ${resumeContext.pendingWork.inProgressCount}`);\n console.log(` Blocked: ${resumeContext.pendingWork.blockedCount}`);\n console.log(` Unresolved Comments: ${resumeContext.pendingWork.unresolvedComments}`);\n\n console.log('');\n }\n });\n\n// Get entity-specific context\ncontextCommand\n .command('entity')\n .argument('<type>', 'Entity type (initiative/epic/story/task/bug)')\n .argument('<key>', 'Entity key')\n .description('Get detailed context for a specific entity')\n .action((type: string, key: string) => {\n const opts = getOutputOptions(contextCommand);\n\n const validTypes = ['initiative', 'epic', 'story', 'task', 'bug'];\n if (!validTypes.includes(type)) {\n error(`Invalid entity type. Valid values: ${validTypes.join(', ')}`, opts);\n process.exit(1);\n }\n\n const entity = getEntityContext(type, key);\n\n if (!entity) {\n error(`${type} \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: entity }));\n } else {\n console.log(`\\n=== ${type.charAt(0).toUpperCase() + type.slice(1)}: ${key} ===\\n`);\n\n // Display common fields\n const displayFields = ['key', 'summary', 'description', 'status', 'priority', 'assignee', 'created_at', 'updated_at'];\n for (const field of displayFields) {\n if (entity[field] !== undefined && entity[field] !== null) {\n const label = field.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n console.log(`${label}: ${entity[field]}`);\n }\n }\n\n // Display recent activity\n const activity = entity.recentActivity as Array<{ action: string; createdAt: string }>;\n if (activity && activity.length > 0) {\n console.log('\\nRecent Activity:');\n for (const a of activity.slice(0, 5)) {\n console.log(` - ${a.action} at ${a.createdAt}`);\n }\n }\n\n console.log('');\n }\n });\n\n// Quick summary for AI\ncontextCommand\n .command('quick')\n .description('Quick context summary optimized for AI agents')\n .action(() => {\n const opts = getOutputOptions(contextCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Get summary context (cast since we explicitly request 'summary' level)\n const context = loadContext(project.id, 'summary') as import('../services/context-loader.js').SummaryContext;\n\n // Build quick summary\n const quick = {\n project: `${context.project.name} (${context.project.key})`,\n session: context.session.active ? `Active ${context.session.duration}` : 'Inactive',\n entities: `${context.counts.initiatives}I/${context.counts.epics}E/${context.counts.stories}S/${context.counts.tasks}T/${context.counts.bugs}B`,\n docs: `${context.counts.documents} files, ${context.counts.comments} comments`,\n activity24h: `${context.recentActivity.totalActions} actions`\n };\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: quick }));\n } else {\n console.log(`Project: ${quick.project}`);\n console.log(`Session: ${quick.session}`);\n console.log(`Entities: ${quick.entities}`);\n console.log(`Documents: ${quick.docs}`);\n console.log(`Activity (24h): ${quick.activity24h}`);\n }\n });\n","/**\n * Context Loader Service\n *\n * Provides progressive context loading for AI agents.\n * Builds structured context packages at different detail levels.\n *\n * Levels:\n * - minimal: Project info + current session only\n * - summary: + entity counts + recent activity\n * - standard: + active sprint + in-progress items\n * - full: + all entities + documents + comments\n *\n * @author Vladimir K.S.\n */\n\nimport { queryOne, queryAll } from '../db/connection.js';\nimport { getActiveSession, listSessions } from './session-service.js';\nimport { getActivityLog, getActivitySummary } from './activity-logger.js';\nimport { getSyncStatus } from './file-scanner.js';\nimport { getCommentStats } from './comment-parser.js';\n\nexport type ContextLevel = 'minimal' | 'summary' | 'standard' | 'full';\n\nexport interface MinimalContext {\n level: 'minimal';\n project: {\n key: string;\n name: string;\n path: string;\n };\n session: {\n active: boolean;\n id?: string;\n startedAt?: string;\n duration?: string;\n };\n}\n\nexport interface SummaryContext extends Omit<MinimalContext, 'level'> {\n level: 'summary';\n counts: {\n initiatives: number;\n epics: number;\n stories: number;\n tasks: number;\n bugs: number;\n documents: number;\n comments: number;\n };\n recentActivity: {\n totalActions: number;\n creates: number;\n updates: number;\n transitions: number;\n };\n}\n\nexport interface StandardContext extends Omit<SummaryContext, 'level'> {\n level: 'standard';\n activeSprint: {\n name: string;\n goal: string | null;\n startDate: string;\n endDate: string;\n storiesCount: number;\n tasksCount: number;\n } | null;\n inProgress: {\n stories: Array<{ key: string; summary: string; assignee: string | null }>;\n tasks: Array<{ key: string; summary: string; assignee: string | null }>;\n bugs: Array<{ key: string; summary: string; severity: string }>;\n };\n blockers: Array<{\n key: string;\n type: string;\n summary: string;\n reason: string | null;\n }>;\n}\n\nexport interface FullContext extends Omit<StandardContext, 'level'> {\n level: 'full';\n initiatives: Array<{\n key: string;\n summary: string;\n status: string;\n epicCount: number;\n }>;\n epics: Array<{\n key: string;\n summary: string;\n status: string;\n initiative: string | null;\n storyCount: number;\n }>;\n backlog: {\n stories: Array<{ key: string; summary: string; points: number | null; epic: string | null }>;\n tasks: Array<{ key: string; summary: string; story: string | null }>;\n };\n documents: {\n total: number;\n modified: number;\n withComments: number;\n recentlyChanged: Array<{ path: string; status: string }>;\n };\n pendingComments: Array<{\n path: string;\n line: number;\n type: string;\n content: string;\n }>;\n}\n\nexport type Context = MinimalContext | SummaryContext | StandardContext | FullContext;\n\n/**\n * Load context at specified level\n */\nexport function loadContext(projectId: string, level: ContextLevel = 'standard'): Context {\n // Get project info\n const project = queryOne<{\n key: string;\n name: string;\n path: string;\n }>('SELECT key, name, path FROM projects WHERE id = ?', [projectId]);\n\n if (!project) {\n throw new Error('Project not found');\n }\n\n // Get session info\n const session = getActiveSession(projectId);\n const sessionInfo = session\n ? {\n active: true,\n id: session.id,\n startedAt: session.startedAt,\n duration: calculateDuration(session.startedAt)\n }\n : { active: false };\n\n // Minimal context\n const minimal: MinimalContext = {\n level: 'minimal',\n project: {\n key: project.key,\n name: project.name,\n path: project.path\n },\n session: sessionInfo\n };\n\n if (level === 'minimal') {\n return minimal;\n }\n\n // Get entity counts\n const counts = getEntityCounts(projectId);\n const activitySummary = getActivitySummary(projectId, getLastDayTimestamp());\n\n // Summary context\n const summary: SummaryContext = {\n ...minimal,\n level: 'summary',\n counts,\n recentActivity: {\n totalActions: activitySummary.totalActions,\n creates: activitySummary.creates,\n updates: activitySummary.updates,\n transitions: activitySummary.transitions\n }\n };\n\n if (level === 'summary') {\n return summary;\n }\n\n // Get active sprint\n const activeSprint = getActiveSprint(projectId);\n\n // Get in-progress items\n const inProgress = getInProgressItems(projectId);\n\n // Get blockers\n const blockers = getBlockers(projectId);\n\n // Standard context\n const standard: StandardContext = {\n ...summary,\n level: 'standard',\n activeSprint,\n inProgress,\n blockers\n };\n\n if (level === 'standard') {\n return standard;\n }\n\n // Full context\n const initiatives = getInitiatives(projectId);\n const epics = getEpics(projectId);\n const backlog = getBacklogItems(projectId);\n const documents = getDocumentsSummary(projectId);\n const pendingComments = getPendingComments(projectId);\n\n const full: FullContext = {\n ...standard,\n level: 'full',\n initiatives,\n epics,\n backlog,\n documents,\n pendingComments\n };\n\n return full;\n}\n\n/**\n * Get entity counts\n */\nfunction getEntityCounts(projectId: string): SummaryContext['counts'] {\n const initiatives = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM initiatives WHERE project_id = ?',\n [projectId]\n );\n const epics = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM epics WHERE project_id = ?',\n [projectId]\n );\n const stories = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM user_stories WHERE project_id = ?',\n [projectId]\n );\n const tasks = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM tasks WHERE project_id = ?',\n [projectId]\n );\n const bugs = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM bugs WHERE project_id = ?',\n [projectId]\n );\n\n const syncStatus = getSyncStatus(projectId);\n const commentStats = getCommentStats(projectId);\n\n return {\n initiatives: initiatives?.count ?? 0,\n epics: epics?.count ?? 0,\n stories: stories?.count ?? 0,\n tasks: tasks?.count ?? 0,\n bugs: bugs?.count ?? 0,\n documents: syncStatus.total,\n comments: commentStats.totalComments\n };\n}\n\n/**\n * Get active sprint info\n */\nfunction getActiveSprint(projectId: string): StandardContext['activeSprint'] {\n const sprint = queryOne<{\n id: string;\n name: string;\n goal: string | null;\n start_date: string;\n end_date: string;\n }>(\n `SELECT id, name, goal, start_date, end_date FROM sprints\n WHERE project_id = ? AND status = 'active'\n ORDER BY start_date DESC LIMIT 1`,\n [projectId]\n );\n\n if (!sprint) {\n return null;\n }\n\n const storiesCount = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM user_stories WHERE sprint_id = ?',\n [sprint.id]\n );\n const tasksCount = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM tasks WHERE sprint_id = ?',\n [sprint.id]\n );\n\n return {\n name: sprint.name,\n goal: sprint.goal,\n startDate: sprint.start_date,\n endDate: sprint.end_date,\n storiesCount: storiesCount?.count ?? 0,\n tasksCount: tasksCount?.count ?? 0\n };\n}\n\n/**\n * Get in-progress items\n */\nfunction getInProgressItems(projectId: string): StandardContext['inProgress'] {\n const stories = queryAll<{ key: string; summary: string; assignee: string | null }>(\n `SELECT key, summary, assignee FROM user_stories\n WHERE project_id = ? AND status = 'in_progress'\n ORDER BY updated_at DESC LIMIT 10`,\n [projectId]\n );\n\n const tasks = queryAll<{ key: string; summary: string; assignee: string | null }>(\n `SELECT key, summary, assignee FROM tasks\n WHERE project_id = ? AND status = 'in_progress'\n ORDER BY updated_at DESC LIMIT 10`,\n [projectId]\n );\n\n const bugs = queryAll<{ key: string; summary: string; severity: string }>(\n `SELECT key, summary, severity FROM bugs\n WHERE project_id = ? AND status = 'in_progress'\n ORDER BY updated_at DESC LIMIT 10`,\n [projectId]\n );\n\n return { stories, tasks, bugs };\n}\n\n/**\n * Get blocked items\n */\nfunction getBlockers(projectId: string): StandardContext['blockers'] {\n const blockedTasks = queryAll<{\n key: string;\n summary: string;\n blocked_reason: string | null;\n }>(\n `SELECT key, summary, blocked_reason FROM tasks\n WHERE project_id = ? AND status = 'blocked'\n ORDER BY updated_at DESC`,\n [projectId]\n );\n\n return blockedTasks.map((t) => ({\n key: t.key,\n type: 'task',\n summary: t.summary,\n reason: t.blocked_reason\n }));\n}\n\n/**\n * Get initiatives summary\n */\nfunction getInitiatives(projectId: string): FullContext['initiatives'] {\n return queryAll<{\n key: string;\n summary: string;\n status: string;\n epicCount: number;\n }>(\n `SELECT i.key, i.summary, i.status,\n (SELECT COUNT(*) FROM epics WHERE initiative_id = i.id) as epicCount\n FROM initiatives i\n WHERE i.project_id = ?\n ORDER BY i.created_at DESC`,\n [projectId]\n );\n}\n\n/**\n * Get epics summary\n */\nfunction getEpics(projectId: string): FullContext['epics'] {\n return queryAll<{\n key: string;\n summary: string;\n status: string;\n initiative: string | null;\n storyCount: number;\n }>(\n `SELECT e.key, e.summary, e.status,\n i.key as initiative,\n (SELECT COUNT(*) FROM user_stories WHERE epic_id = e.id) as storyCount\n FROM epics e\n LEFT JOIN initiatives i ON e.initiative_id = i.id\n WHERE e.project_id = ?\n ORDER BY e.created_at DESC`,\n [projectId]\n );\n}\n\n/**\n * Get backlog items\n */\nfunction getBacklogItems(projectId: string): FullContext['backlog'] {\n const stories = queryAll<{\n key: string;\n summary: string;\n points: number | null;\n epic: string | null;\n }>(\n `SELECT s.key, s.summary, s.story_points as points, e.key as epic\n FROM user_stories s\n LEFT JOIN epics e ON s.epic_id = e.id\n WHERE s.project_id = ? AND s.status = 'backlog'\n ORDER BY s.priority, s.created_at DESC\n LIMIT 20`,\n [projectId]\n );\n\n const tasks = queryAll<{\n key: string;\n summary: string;\n story: string | null;\n }>(\n `SELECT t.key, t.summary, s.key as story\n FROM tasks t\n LEFT JOIN user_stories s ON t.story_id = s.id\n WHERE t.project_id = ? AND t.status = 'todo'\n ORDER BY t.priority, t.created_at DESC\n LIMIT 20`,\n [projectId]\n );\n\n return { stories, tasks };\n}\n\n/**\n * Get documents summary\n */\nfunction getDocumentsSummary(projectId: string): FullContext['documents'] {\n const syncStatus = getSyncStatus(projectId);\n const commentStats = getCommentStats(projectId);\n\n const recentlyChanged = queryAll<{ path: string; status: string }>(\n `SELECT path, status FROM documents\n WHERE project_id = ? AND status IN ('modified', 'tracked')\n ORDER BY last_scanned_at DESC LIMIT 10`,\n [projectId]\n );\n\n return {\n total: syncStatus.total,\n modified: syncStatus.modified,\n withComments: commentStats.documentsWithComments,\n recentlyChanged\n };\n}\n\n/**\n * Get pending comments\n */\nfunction getPendingComments(projectId: string): FullContext['pendingComments'] {\n return queryAll<{\n path: string;\n line: number;\n type: string;\n content: string;\n }>(\n `SELECT d.path, dc.line_number as line, dc.marker_type as type, dc.content\n FROM doc_comments dc\n JOIN documents d ON dc.document_id = d.id\n WHERE d.project_id = ? AND dc.resolved = 0\n ORDER BY d.path, dc.line_number\n LIMIT 50`,\n [projectId]\n );\n}\n\n/**\n * Get specific entity context\n */\nexport function getEntityContext(\n entityType: string,\n entityKey: string\n): Record<string, unknown> | null {\n const tableMap: Record<string, string> = {\n initiative: 'initiatives',\n epic: 'epics',\n story: 'user_stories',\n task: 'tasks',\n bug: 'bugs'\n };\n\n const table = tableMap[entityType];\n if (!table) {\n return null;\n }\n\n const entity = queryOne<Record<string, unknown>>(\n `SELECT * FROM ${table} WHERE key = ?`,\n [entityKey]\n );\n\n if (!entity) {\n return null;\n }\n\n // Get related activity\n const activity = getActivityLog(entity.project_id as string, {\n entityId: entity.id as string,\n limit: 10\n });\n\n return {\n ...entity,\n recentActivity: activity\n };\n}\n\n/**\n * Get resume context for continuing work\n */\nexport function getResumeContext(projectId: string): {\n lastSession: {\n endedAt: string;\n summary: string | null;\n entitiesModified: number;\n } | null;\n recentChanges: Array<{\n entityType: string;\n entityKey: string;\n action: string;\n timestamp: string;\n }>;\n pendingWork: {\n inProgressCount: number;\n blockedCount: number;\n unresolvedComments: number;\n };\n} {\n // Get last completed session\n const sessions = listSessions(projectId, { status: 'completed', limit: 1 });\n const lastSession = sessions[0]\n ? {\n endedAt: sessions[0].endedAt ?? '',\n summary: sessions[0].summary,\n entitiesModified: sessions[0].entitiesModified\n }\n : null;\n\n // Get recent changes with entity keys\n const recentActivity = queryAll<{\n entity_type: string;\n entity_id: string;\n action: string;\n created_at: string;\n }>(\n `SELECT entity_type, entity_id, action, created_at\n FROM activity_log\n WHERE project_id = ?\n ORDER BY created_at DESC\n LIMIT 10`,\n [projectId]\n );\n\n // Map entity IDs to keys\n const recentChanges = recentActivity.map((a) => {\n const key = getEntityKey(a.entity_type, a.entity_id);\n return {\n entityType: a.entity_type,\n entityKey: key ?? a.entity_id.slice(0, 8),\n action: a.action,\n timestamp: a.created_at\n };\n });\n\n // Get pending work counts\n const inProgress = queryOne<{ count: number }>(\n `SELECT COUNT(*) as count FROM (\n SELECT id FROM user_stories WHERE project_id = ? AND status = 'in_progress'\n UNION ALL\n SELECT id FROM tasks WHERE project_id = ? AND status = 'in_progress'\n )`,\n [projectId, projectId]\n );\n\n const blocked = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM tasks WHERE project_id = ? AND status = ?',\n [projectId, 'blocked']\n );\n\n const commentStats = getCommentStats(projectId);\n\n return {\n lastSession,\n recentChanges,\n pendingWork: {\n inProgressCount: inProgress?.count ?? 0,\n blockedCount: blocked?.count ?? 0,\n unresolvedComments: commentStats.totalComments\n }\n };\n}\n\n/**\n * Get entity key from ID\n */\nfunction getEntityKey(entityType: string, entityId: string): string | null {\n const tableMap: Record<string, string> = {\n initiative: 'initiatives',\n epic: 'epics',\n story: 'user_stories',\n task: 'tasks',\n bug: 'bugs'\n };\n\n const table = tableMap[entityType];\n if (!table) {\n return null;\n }\n\n const entity = queryOne<{ key: string }>(`SELECT key FROM ${table} WHERE id = ?`, [entityId]);\n return entity?.key ?? null;\n}\n\n/**\n * Calculate duration string\n */\nfunction calculateDuration(start: string): string {\n const startDate = new Date(start);\n const now = new Date();\n const diffMs = now.getTime() - startDate.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) return '<1m';\n if (diffMins < 60) return `${diffMins}m`;\n\n const hours = Math.floor(diffMins / 60);\n const mins = diffMins % 60;\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n}\n\n/**\n * Get timestamp for 24 hours ago\n */\nfunction getLastDayTimestamp(): string {\n const date = new Date();\n date.setDate(date.getDate() - 1);\n return date.toISOString();\n}\n","/**\n * Query Command\n *\n * Unified search and filtering across all entity types.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryOne } from '../db/connection.js';\nimport {\n error,\n data,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n search,\n searchByKey,\n findByAssignee,\n findRecentlyUpdated,\n findByStatus,\n findRelated,\n getQueryStats,\n EntityType,\n QueryFilters\n} from '../services/query-service.js';\n\nexport const queryCommand = new Command('query')\n .alias('q')\n .description('Search and filter across all entities');\n\n// Main search command\nqueryCommand\n .command('search')\n .alias('s')\n .argument('[text]', 'Text to search for in summary/key')\n .option('-t, --type <type>', 'Entity type (initiative/epic/story/task/bug/all)', 'all')\n .option('-s, --status <status>', 'Filter by status (comma-separated for multiple)')\n .option('-p, --priority <priority>', 'Filter by priority (comma-separated for multiple)')\n .option('-a, --assignee <assignee>', 'Filter by assignee')\n .option('-e, --epic <key>', 'Filter by epic key')\n .option('--sprint <name>', 'Filter by sprint name')\n .option('--since <date>', 'Filter by updated since date (YYYY-MM-DD)')\n .option('-n, --limit <n>', 'Limit results', '20')\n .description('Search entities with filters')\n .action((text, options) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const validTypes: EntityType[] = ['initiative', 'epic', 'story', 'task', 'bug', 'all'];\n if (!validTypes.includes(options.type as EntityType)) {\n error(`Invalid type. Valid values: ${validTypes.join(', ')}`, opts);\n process.exit(1);\n }\n\n const filters: QueryFilters = {\n text,\n status: options.status?.split(','),\n priority: options.priority?.split(','),\n assignee: options.assignee,\n epic: options.epic,\n sprint: options.sprint,\n updatedAfter: options.since,\n limit: parseInt(options.limit, 10)\n };\n\n const results = search(project.id, options.type as EntityType, filters);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary.slice(0, 50) + (r.summary.length > 50 ? '...' : ''),\n status: r.status,\n priority: r.priority,\n assignee: r.assignee ?? '-',\n parent: r.parent ?? '-'\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 40 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Priority', key: 'priority', width: 10 },\n { header: 'Assignee', key: 'assignee', width: 12 },\n { header: 'Parent', key: 'parent', width: 10 }\n ],\n opts\n );\n });\n\n// Quick key search\nqueryCommand\n .command('key')\n .argument('<pattern>', 'Key pattern to search for')\n .description('Quick search by key pattern')\n .action((pattern: string) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const results = searchByKey(project.id, pattern);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary,\n status: r.status\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 50 },\n { header: 'Status', key: 'status', width: 12 }\n ],\n opts\n );\n });\n\n// Find by assignee\nqueryCommand\n .command('assignee')\n .argument('<name>', 'Assignee name')\n .description('Find items assigned to a person')\n .action((name: string) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const results = findByAssignee(project.id, name);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary.slice(0, 50),\n status: r.status,\n priority: r.priority,\n assignee: r.assignee ?? '-'\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 50 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Priority', key: 'priority', width: 10 },\n { header: 'Assignee', key: 'assignee', width: 12 }\n ],\n opts\n );\n });\n\n// Find recent changes\nqueryCommand\n .command('recent')\n .option('-h, --hours <n>', 'Hours to look back', '24')\n .description('Find recently updated items')\n .action((options) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const hours = parseInt(options.hours, 10);\n const results = findRecentlyUpdated(project.id, hours);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary.slice(0, 40),\n status: r.status,\n updated: r.updatedAt\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 40 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Updated', key: 'updated', width: 20 }\n ],\n opts\n );\n });\n\n// Find by status\nqueryCommand\n .command('status')\n .argument('<status>', 'Status to filter by (comma-separated for multiple)')\n .option('-t, --type <type>', 'Entity type (initiative/epic/story/task/bug/all)', 'all')\n .description('Find items by status')\n .action((status: string, options) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const statuses = status.split(',');\n const results = findByStatus(project.id, statuses, options.type as EntityType);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary.slice(0, 50),\n status: r.status,\n assignee: r.assignee ?? '-'\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 50 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Assignee', key: 'assignee', width: 12 }\n ],\n opts\n );\n });\n\n// Find related items\nqueryCommand\n .command('related')\n .argument('<type>', 'Entity type (initiative/epic/story)')\n .argument('<key>', 'Entity key')\n .description('Find items related to an entity')\n .action((type: string, key: string) => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const validTypes = ['initiative', 'epic', 'story'];\n if (!validTypes.includes(type)) {\n error(`Invalid type. Valid values: ${validTypes.join(', ')}`, opts);\n process.exit(1);\n }\n\n const results = findRelated(project.id, type, key);\n\n data(\n results.map((r) => ({\n type: r.type,\n key: r.key,\n summary: r.summary.slice(0, 50),\n status: r.status,\n parent: r.parent ?? '-'\n })),\n [\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Summary', key: 'summary', width: 50 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Parent', key: 'parent', width: 10 }\n ],\n opts\n );\n });\n\n// Statistics\nqueryCommand\n .command('stats')\n .description('Show query statistics for the project')\n .action(() => {\n const opts = getOutputOptions(queryCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const stats = getQueryStats(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: stats }));\n } else {\n console.log(`\\nTotal Items: ${stats.total}\\n`);\n\n console.log('By Type:');\n for (const [type, count] of Object.entries(stats.byType)) {\n console.log(` ${type}: ${count}`);\n }\n\n console.log('\\nBy Status:');\n for (const [status, count] of Object.entries(stats.byStatus)) {\n console.log(` ${status}: ${count}`);\n }\n console.log('');\n }\n });\n","/**\n * Query Service\n *\n * Unified search and filtering across all entity types.\n * Supports text search, status/priority filters, and date queries.\n *\n * @author Vladimir K.S.\n */\n\nimport { queryAll } from '../db/connection.js';\n\nexport type EntityType = 'initiative' | 'epic' | 'story' | 'task' | 'bug' | 'all';\n\nexport interface QueryFilters {\n text?: string;\n status?: string | string[];\n priority?: string | string[];\n assignee?: string;\n labels?: string[];\n sprint?: string;\n epic?: string;\n createdAfter?: string;\n updatedAfter?: string;\n limit?: number;\n}\n\nexport interface QueryResult {\n type: string;\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n createdAt: string;\n updatedAt: string;\n parent?: string;\n extra?: Record<string, unknown>;\n}\n\nexport interface QueryStats {\n total: number;\n byType: Record<string, number>;\n byStatus: Record<string, number>;\n}\n\n/**\n * Search across entities\n */\nexport function search(\n projectId: string,\n entityType: EntityType,\n filters: QueryFilters = {}\n): QueryResult[] {\n const results: QueryResult[] = [];\n const limit = filters.limit ?? 50;\n\n if (entityType === 'all' || entityType === 'initiative') {\n results.push(...searchInitiatives(projectId, filters));\n }\n\n if (entityType === 'all' || entityType === 'epic') {\n results.push(...searchEpics(projectId, filters));\n }\n\n if (entityType === 'all' || entityType === 'story') {\n results.push(...searchStories(projectId, filters));\n }\n\n if (entityType === 'all' || entityType === 'task') {\n results.push(...searchTasks(projectId, filters));\n }\n\n if (entityType === 'all' || entityType === 'bug') {\n results.push(...searchBugs(projectId, filters));\n }\n\n // Sort by updated_at descending and limit\n results.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n return results.slice(0, limit);\n}\n\n/**\n * Search initiatives\n */\nfunction searchInitiatives(projectId: string, filters: QueryFilters): QueryResult[] {\n let query = `\n SELECT key, summary, status, priority, owner as assignee, created_at, updated_at\n FROM initiatives\n WHERE project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n query += buildFilterClauses(filters, '', 'owner');\n\n const rows = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n created_at: string;\n updated_at: string;\n }>(query, params);\n\n return rows.map((r) => ({\n type: 'initiative',\n key: r.key,\n summary: r.summary,\n status: r.status,\n priority: r.priority,\n assignee: r.assignee,\n createdAt: r.created_at,\n updatedAt: r.updated_at\n }));\n}\n\n/**\n * Search epics\n */\nfunction searchEpics(projectId: string, filters: QueryFilters): QueryResult[] {\n let query = `\n SELECT e.key, e.summary, e.status, e.priority, e.owner as assignee,\n e.created_at, e.updated_at, i.key as parent\n FROM epics e\n LEFT JOIN initiatives i ON e.initiative_id = i.id\n WHERE e.project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n query += buildFilterClauses(filters, 'e', 'e.owner');\n\n const rows = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n created_at: string;\n updated_at: string;\n parent: string | null;\n }>(query, params);\n\n return rows.map((r) => ({\n type: 'epic',\n key: r.key,\n summary: r.summary,\n status: r.status,\n priority: r.priority,\n assignee: r.assignee,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n parent: r.parent ?? undefined\n }));\n}\n\n/**\n * Search stories\n */\nfunction searchStories(projectId: string, filters: QueryFilters): QueryResult[] {\n let query = `\n SELECT s.key, s.summary, s.status, s.priority, s.assignee,\n s.created_at, s.updated_at, e.key as parent, s.story_points\n FROM user_stories s\n LEFT JOIN epics e ON s.epic_id = e.id\n WHERE s.project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n // Epic filter\n if (filters.epic) {\n query += ` AND e.key = ?`;\n params.push(filters.epic);\n }\n\n // Sprint filter\n if (filters.sprint) {\n query += ` AND s.sprint_id = (SELECT id FROM sprints WHERE name = ? AND project_id = ?)`;\n params.push(filters.sprint, projectId);\n }\n\n query += buildFilterClauses(filters, 's', 's.assignee');\n\n const rows = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n created_at: string;\n updated_at: string;\n parent: string | null;\n story_points: number | null;\n }>(query, params);\n\n return rows.map((r) => ({\n type: 'story',\n key: r.key,\n summary: r.summary,\n status: r.status,\n priority: r.priority,\n assignee: r.assignee,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n parent: r.parent ?? undefined,\n extra: { storyPoints: r.story_points }\n }));\n}\n\n/**\n * Search tasks\n */\nfunction searchTasks(projectId: string, filters: QueryFilters): QueryResult[] {\n let query = `\n SELECT t.key, t.summary, t.status, t.priority, t.assignee,\n t.created_at, t.updated_at, s.key as parent, t.issue_type\n FROM tasks t\n LEFT JOIN user_stories s ON t.story_id = s.id\n WHERE t.project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n // Sprint filter\n if (filters.sprint) {\n query += ` AND t.sprint_id = (SELECT id FROM sprints WHERE name = ? AND project_id = ?)`;\n params.push(filters.sprint, projectId);\n }\n\n query += buildFilterClauses(filters, 't', 't.assignee');\n\n const rows = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n created_at: string;\n updated_at: string;\n parent: string | null;\n issue_type: string;\n }>(query, params);\n\n return rows.map((r) => ({\n type: r.issue_type === 'subtask' ? 'subtask' : 'task',\n key: r.key,\n summary: r.summary,\n status: r.status,\n priority: r.priority,\n assignee: r.assignee,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n parent: r.parent ?? undefined\n }));\n}\n\n/**\n * Search bugs\n */\nfunction searchBugs(projectId: string, filters: QueryFilters): QueryResult[] {\n let query = `\n SELECT b.key, b.summary, b.status, b.priority, b.assignee,\n b.created_at, b.updated_at, b.severity, e.key as parent\n FROM bugs b\n LEFT JOIN epics e ON b.epic_id = e.id\n WHERE b.project_id = ?\n `;\n const params: unknown[] = [projectId];\n\n query += buildFilterClauses(filters, 'b', 'b.assignee');\n\n const rows = queryAll<{\n key: string;\n summary: string;\n status: string;\n priority: string;\n assignee: string | null;\n created_at: string;\n updated_at: string;\n severity: string;\n parent: string | null;\n }>(query, params);\n\n return rows.map((r) => ({\n type: 'bug',\n key: r.key,\n summary: r.summary,\n status: r.status,\n priority: r.priority,\n assignee: r.assignee,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n parent: r.parent ?? undefined,\n extra: { severity: r.severity }\n }));\n}\n\n/**\n * Build filter clauses for SQL query\n * @param filters - Query filters\n * @param tablePrefix - Table alias prefix (e.g., 's' for user_stories, 't' for tasks)\n * @param assigneeColumn - Full assignee column reference (e.g., 's.assignee')\n */\nfunction buildFilterClauses(filters: QueryFilters, tablePrefix: string, assigneeColumn: string): string {\n const clauses: string[] = [];\n const p = tablePrefix && tablePrefix.length > 0 ? `${tablePrefix}.` : '';\n\n // Text search\n if (filters.text) {\n clauses.push(`(${p}summary LIKE '%${escapeSql(filters.text)}%' OR ${p}key LIKE '%${escapeSql(filters.text)}%')`);\n }\n\n // Status filter\n if (filters.status) {\n const statuses = Array.isArray(filters.status) ? filters.status : [filters.status];\n clauses.push(`${p}status IN (${statuses.map((s) => `'${escapeSql(s)}'`).join(', ')})`);\n }\n\n // Priority filter\n if (filters.priority) {\n const priorities = Array.isArray(filters.priority) ? filters.priority : [filters.priority];\n clauses.push(`${p}priority IN (${priorities.map((p) => `'${escapeSql(p)}'`).join(', ')})`);\n }\n\n // Assignee filter\n if (filters.assignee) {\n clauses.push(`${assigneeColumn} = '${escapeSql(filters.assignee)}'`);\n }\n\n // Date filters\n if (filters.createdAfter) {\n clauses.push(`${p}created_at >= '${escapeSql(filters.createdAfter)}'`);\n }\n\n if (filters.updatedAfter) {\n clauses.push(`${p}updated_at >= '${escapeSql(filters.updatedAfter)}'`);\n }\n\n return clauses.length > 0 ? ' AND ' + clauses.join(' AND ') : '';\n}\n\n/**\n * Escape SQL special characters\n */\nfunction escapeSql(str: string): string {\n return str.replace(/'/g, \"''\").replace(/\"/g, '\"\"');\n}\n\n/**\n * Get query statistics\n */\nexport function getQueryStats(projectId: string): QueryStats {\n const results = search(projectId, 'all', { limit: 1000 });\n\n const byType: Record<string, number> = {};\n const byStatus: Record<string, number> = {};\n\n for (const r of results) {\n byType[r.type] = (byType[r.type] ?? 0) + 1;\n byStatus[r.status] = (byStatus[r.status] ?? 0) + 1;\n }\n\n return {\n total: results.length,\n byType,\n byStatus\n };\n}\n\n/**\n * Find related items for an entity\n */\nexport function findRelated(\n projectId: string,\n entityType: string,\n entityKey: string\n): QueryResult[] {\n const results: QueryResult[] = [];\n\n if (entityType === 'initiative') {\n // Find epics under this initiative\n const epics = queryAll<{ id: string; key: string }>(\n `SELECT e.id, e.key FROM epics e\n JOIN initiatives i ON e.initiative_id = i.id\n WHERE i.key = ? AND i.project_id = ?`,\n [entityKey, projectId]\n );\n\n for (const epic of epics) {\n results.push(...search(projectId, 'epic', { text: epic.key, limit: 1 }));\n }\n }\n\n if (entityType === 'epic') {\n // Find stories under this epic\n const stories = search(projectId, 'story', { epic: entityKey });\n results.push(...stories);\n\n // Find bugs under this epic\n const bugs = queryAll<{ key: string }>(\n `SELECT b.key FROM bugs b\n JOIN epics e ON b.epic_id = e.id\n WHERE e.key = ? AND e.project_id = ?`,\n [entityKey, projectId]\n );\n\n for (const bug of bugs) {\n results.push(...search(projectId, 'bug', { text: bug.key, limit: 1 }));\n }\n }\n\n if (entityType === 'story') {\n // Find tasks under this story\n const tasks = queryAll<{ key: string }>(\n `SELECT t.key FROM tasks t\n JOIN user_stories s ON t.story_id = s.id\n WHERE s.key = ? AND s.project_id = ?`,\n [entityKey, projectId]\n );\n\n for (const task of tasks) {\n results.push(...search(projectId, 'task', { text: task.key, limit: 1 }));\n }\n }\n\n return results;\n}\n\n/**\n * Quick search by key pattern\n */\nexport function searchByKey(projectId: string, keyPattern: string): QueryResult[] {\n return search(projectId, 'all', { text: keyPattern, limit: 10 });\n}\n\n/**\n * Find items by assignee\n */\nexport function findByAssignee(projectId: string, assignee: string): QueryResult[] {\n return search(projectId, 'all', { assignee, limit: 100 });\n}\n\n/**\n * Find items updated recently\n */\nexport function findRecentlyUpdated(projectId: string, hours: number = 24): QueryResult[] {\n const since = new Date();\n since.setHours(since.getHours() - hours);\n\n // Use SQLite-compatible format (YYYY-MM-DD HH:MM:SS)\n const sqliteDate = since.toISOString().replace('T', ' ').replace('Z', '').split('.')[0];\n\n return search(projectId, 'all', {\n updatedAfter: sqliteDate,\n limit: 50\n });\n}\n\n/**\n * Find items in a specific status\n */\nexport function findByStatus(\n projectId: string,\n status: string | string[],\n entityType: EntityType = 'all'\n): QueryResult[] {\n return search(projectId, entityType, { status, limit: 100 });\n}\n","/**\n * AI Command\n *\n * Commands optimized for AI agent workflows.\n * Provides structured outputs for LLM consumption.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryOne } from '../db/connection.js';\nimport {\n error,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n getAIBriefing,\n getAIWorkItem,\n getAINextSteps,\n beginAISession,\n endAISession,\n getCompactStatus\n} from '../services/ai-helper.js';\nimport { getResumeContext } from '../services/context-loader.js';\n\nexport const aiCommand = new Command('ai')\n .description('AI agent helper commands');\n\n// Get briefing for starting work\naiCommand\n .command('briefing')\n .alias('b')\n .description('Get AI briefing for starting work')\n .action(() => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const briefing = getAIBriefing(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: briefing }));\n } else {\n console.log('\\n=== AI Briefing ===\\n');\n console.log(`Project: ${briefing.project.name} (${briefing.project.key})`);\n console.log(`Path: ${briefing.project.path}`);\n console.log(`Session: ${briefing.session.isActive ? `Active (${briefing.session.duration})` : 'No active session'}`);\n\n console.log('\\nOverview:');\n console.log(` Total Items: ${briefing.overview.totalItems}`);\n console.log(` In Progress: ${briefing.overview.inProgress}`);\n console.log(` Blocked: ${briefing.overview.blocked}`);\n console.log(` Backlog: ${briefing.overview.backlog}`);\n console.log(` Pending Comments: ${briefing.pendingComments}`);\n\n if (briefing.priorities.length > 0) {\n console.log('\\nPriorities:');\n for (const p of briefing.priorities) {\n console.log(` - [${p.type}] ${p.key}: ${p.summary}`);\n console.log(` Reason: ${p.reason}`);\n }\n }\n\n console.log('');\n }\n });\n\n// Get next steps recommendations\naiCommand\n .command('next')\n .alias('n')\n .description('Get AI recommendations for next steps')\n .action(() => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const nextSteps = getAINextSteps(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: nextSteps }));\n } else {\n console.log('\\n=== Next Steps ===\\n');\n\n if (nextSteps.recommendations.length > 0) {\n console.log('Recommendations:');\n for (const r of nextSteps.recommendations) {\n console.log(` - ${r.action}: ${r.target}`);\n console.log(` Reason: ${r.reason}`);\n console.log(` Command: ${r.command}`);\n }\n } else {\n console.log('No specific recommendations.');\n }\n\n if (nextSteps.blockers.length > 0) {\n console.log('\\nBlockers:');\n for (const b of nextSteps.blockers) {\n console.log(` - ${b.key}: ${b.summary}`);\n if (b.reason) console.log(` Reason: ${b.reason}`);\n }\n }\n\n if (nextSteps.unresolvedComments.length > 0) {\n console.log('\\nUnresolved Comments:');\n for (const c of nextSteps.unresolvedComments) {\n console.log(` - ${c.path}:${c.line} [${c.type}]`);\n console.log(` ${c.preview}...`);\n }\n }\n\n console.log('');\n }\n });\n\n// Get work item details\naiCommand\n .command('item')\n .argument('<type>', 'Entity type (epic/story/task/bug)')\n .argument('<key>', 'Entity key')\n .description('Get detailed work item for AI')\n .action((type: string, key: string) => {\n const opts = getOutputOptions(aiCommand);\n\n const validTypes = ['initiative', 'epic', 'story', 'task', 'bug'];\n if (!validTypes.includes(type)) {\n error(`Invalid type. Valid values: ${validTypes.join(', ')}`, opts);\n process.exit(1);\n }\n\n const item = getAIWorkItem(type, key);\n\n if (!item) {\n error(`${type} \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: item }));\n } else {\n console.log(`\\n=== ${type.charAt(0).toUpperCase() + type.slice(1)}: ${key} ===\\n`);\n console.log(`Summary: ${item.summary}`);\n console.log(`Status: ${item.status}`);\n console.log(`Priority: ${item.priority}`);\n console.log(`Assignee: ${item.assignee ?? '-'}`);\n\n if (item.description) {\n console.log(`\\nDescription:\\n${item.description}`);\n }\n\n if (item.children.length > 0) {\n console.log('\\nChildren:');\n for (const c of item.children) {\n console.log(` - [${c.type}] ${c.key}: ${c.summary} (${c.status})`);\n }\n }\n\n if (item.recentActivity.length > 0) {\n console.log('\\nRecent Activity:');\n for (const a of item.recentActivity) {\n console.log(` - ${a.action} at ${a.timestamp}`);\n }\n }\n\n console.log('');\n }\n });\n\n// Begin AI session\naiCommand\n .command('begin')\n .description('Begin AI work session with full context')\n .action(() => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const result = beginAISession(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: result }));\n } else {\n console.log('\\n=== AI Session Started ===\\n');\n console.log(`Session ID: ${result.session.id.slice(0, 8)}...`);\n console.log(`Started: ${result.session.startedAt}`);\n\n console.log('\\n--- Briefing ---');\n console.log(`Project: ${result.briefing.project.name}`);\n console.log(`Items: ${result.briefing.overview.totalItems} total, ${result.briefing.overview.inProgress} in-progress`);\n\n if (result.nextSteps.recommendations.length > 0) {\n console.log('\\n--- Recommended First Action ---');\n const first = result.nextSteps.recommendations[0];\n console.log(`${first.action}: ${first.target}`);\n console.log(`Command: ${first.command}`);\n }\n\n console.log('');\n }\n });\n\n// End AI session\naiCommand\n .command('end')\n .option('-s, --summary <summary>', 'Session summary')\n .description('End AI work session')\n .action((options) => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const result = endAISession(project.id, options.summary);\n\n if (!result) {\n error('No active session to end.', opts);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: result }));\n } else {\n console.log('\\n=== AI Session Ended ===\\n');\n console.log(`Session ID: ${result.session.id.slice(0, 8)}...`);\n console.log(`Duration: ${result.session.duration}`);\n console.log(`Entities Modified: ${result.session.entitiesModified}`);\n\n if (result.resumeContext.pendingWork.inProgressCount > 0) {\n console.log(`\\nPending Work: ${result.resumeContext.pendingWork.inProgressCount} in-progress`);\n }\n\n console.log('');\n }\n });\n\n// Resume context\naiCommand\n .command('resume')\n .description('Get context for resuming work')\n .action(() => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const resume = getResumeContext(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: resume }));\n } else {\n console.log('\\n=== Resume Context ===\\n');\n\n if (resume.lastSession) {\n console.log('Last Session:');\n console.log(` Ended: ${resume.lastSession.endedAt}`);\n console.log(` Summary: ${resume.lastSession.summary ?? '-'}`);\n console.log(` Changes: ${resume.lastSession.entitiesModified}`);\n } else {\n console.log('No previous session found.');\n }\n\n if (resume.recentChanges.length > 0) {\n console.log('\\nRecent Changes:');\n for (const c of resume.recentChanges.slice(0, 5)) {\n console.log(` - ${c.action} ${c.entityType} ${c.entityKey}`);\n }\n }\n\n console.log('\\nPending Work:');\n console.log(` In Progress: ${resume.pendingWork.inProgressCount}`);\n console.log(` Blocked: ${resume.pendingWork.blockedCount}`);\n console.log(` Unresolved Comments: ${resume.pendingWork.unresolvedComments}`);\n\n console.log('');\n }\n });\n\n// Compact status (one-liner)\naiCommand\n .command('status')\n .alias('s')\n .description('Get compact status line')\n .action(() => {\n const opts = getOutputOptions(aiCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n const status = getCompactStatus(project.id);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { status } }));\n } else {\n console.log(status);\n }\n });\n","/**\n * AI Helper Service\n *\n * Convenience functions for AI agent workflows.\n * Provides structured outputs optimized for LLM consumption.\n *\n * @author Vladimir K.S.\n */\n\nimport { queryOne, queryAll } from '../db/connection.js';\nimport { loadContext, getResumeContext, getEntityContext } from './context-loader.js';\nimport { startSession, endSession, getActiveSession } from './session-service.js';\nimport { logActivity } from './activity-logger.js';\nimport { search, findByStatus } from './query-service.js';\nimport { getSyncStatus } from './file-scanner.js';\nimport { getCommentStats } from './comment-parser.js';\n\nexport interface AIBriefing {\n project: {\n key: string;\n name: string;\n path: string;\n };\n session: {\n isActive: boolean;\n id?: string;\n duration?: string;\n };\n overview: {\n totalItems: number;\n inProgress: number;\n blocked: number;\n backlog: number;\n };\n priorities: Array<{\n type: string;\n key: string;\n summary: string;\n reason: string;\n }>;\n pendingComments: number;\n lastUpdated: string;\n}\n\nexport interface AIWorkItem {\n type: string;\n key: string;\n summary: string;\n description: string | null;\n status: string;\n priority: string;\n assignee: string | null;\n parent: string | null;\n children: Array<{ type: string; key: string; summary: string; status: string }>;\n recentActivity: Array<{ action: string; timestamp: string }>;\n}\n\nexport interface AINextSteps {\n recommendations: Array<{\n action: string;\n target: string;\n reason: string;\n command: string;\n }>;\n blockers: Array<{\n key: string;\n summary: string;\n reason: string | null;\n }>;\n unresolvedComments: Array<{\n path: string;\n line: number;\n type: string;\n preview: string;\n }>;\n}\n\n/**\n * Get AI briefing for starting work\n */\nexport function getAIBriefing(projectId: string): AIBriefing {\n const project = queryOne<{ key: string; name: string; path: string }>(\n 'SELECT key, name, path FROM projects WHERE id = ?',\n [projectId]\n );\n\n if (!project) {\n throw new Error('Project not found');\n }\n\n const session = getActiveSession(projectId);\n\n // Get counts\n const inProgress = queryAll(\n `SELECT id FROM user_stories WHERE project_id = ? AND status = 'in_progress'\n UNION ALL\n SELECT id FROM tasks WHERE project_id = ? AND status = 'in_progress'`,\n [projectId, projectId]\n ).length;\n\n const blocked = queryAll(\n `SELECT id FROM tasks WHERE project_id = ? AND status = 'blocked'`,\n [projectId]\n ).length;\n\n const backlog = queryAll(\n `SELECT id FROM user_stories WHERE project_id = ? AND status = 'backlog'\n UNION ALL\n SELECT id FROM tasks WHERE project_id = ? AND status = 'todo'`,\n [projectId, projectId]\n ).length;\n\n const total = queryAll(\n `SELECT id FROM initiatives WHERE project_id = ?\n UNION ALL SELECT id FROM epics WHERE project_id = ?\n UNION ALL SELECT id FROM user_stories WHERE project_id = ?\n UNION ALL SELECT id FROM tasks WHERE project_id = ?\n UNION ALL SELECT id FROM bugs WHERE project_id = ?`,\n [projectId, projectId, projectId, projectId, projectId]\n ).length;\n\n // Get priorities\n const priorities: AIBriefing['priorities'] = [];\n\n // Critical bugs first\n const criticalBugs = queryAll<{ key: string; summary: string }>(\n `SELECT key, summary FROM bugs WHERE project_id = ? AND severity = 'Critical' AND status != 'closed' LIMIT 3`,\n [projectId]\n );\n for (const bug of criticalBugs) {\n priorities.push({\n type: 'bug',\n key: bug.key,\n summary: bug.summary,\n reason: 'Critical severity bug'\n });\n }\n\n // Blocked items\n const blockedItems = queryAll<{ key: string; summary: string }>(\n `SELECT key, summary FROM tasks WHERE project_id = ? AND status = 'blocked' LIMIT 2`,\n [projectId]\n );\n for (const item of blockedItems) {\n priorities.push({\n type: 'task',\n key: item.key,\n summary: item.summary,\n reason: 'Blocked - needs attention'\n });\n }\n\n // High priority in-progress\n const highPriority = queryAll<{ key: string; summary: string }>(\n `SELECT key, summary FROM user_stories WHERE project_id = ? AND status = 'in_progress' AND priority IN ('Highest', 'High') LIMIT 2`,\n [projectId]\n );\n for (const item of highPriority) {\n priorities.push({\n type: 'story',\n key: item.key,\n summary: item.summary,\n reason: 'High priority in progress'\n });\n }\n\n const commentStats = getCommentStats(projectId);\n\n return {\n project: {\n key: project.key,\n name: project.name,\n path: project.path\n },\n session: session\n ? { isActive: true, id: session.id, duration: calculateDuration(session.startedAt) }\n : { isActive: false },\n overview: {\n totalItems: total,\n inProgress,\n blocked,\n backlog\n },\n priorities,\n pendingComments: commentStats.totalComments,\n lastUpdated: new Date().toISOString()\n };\n}\n\n/**\n * Get detailed work item for AI\n */\nexport function getAIWorkItem(entityType: string, entityKey: string): AIWorkItem | null {\n const context = getEntityContext(entityType, entityKey);\n if (!context) {\n return null;\n }\n\n // Get children based on entity type\n const children: AIWorkItem['children'] = [];\n\n if (entityType === 'epic') {\n const stories = queryAll<{ key: string; summary: string; status: string }>(\n `SELECT s.key, s.summary, s.status FROM user_stories s\n JOIN epics e ON s.epic_id = e.id\n WHERE e.key = ?`,\n [entityKey]\n );\n for (const s of stories) {\n children.push({ type: 'story', ...s });\n }\n }\n\n if (entityType === 'story') {\n const tasks = queryAll<{ key: string; summary: string; status: string }>(\n `SELECT t.key, t.summary, t.status FROM tasks t\n JOIN user_stories s ON t.story_id = s.id\n WHERE s.key = ?`,\n [entityKey]\n );\n for (const t of tasks) {\n children.push({ type: 'task', ...t });\n }\n }\n\n const activity = (context.recentActivity as Array<{ action: string; createdAt: string }>) ?? [];\n\n return {\n type: entityType,\n key: context.key as string,\n summary: context.summary as string,\n description: (context.description as string) ?? null,\n status: context.status as string,\n priority: context.priority as string,\n assignee: (context.assignee as string) ?? null,\n parent: null, // Could be enhanced to include parent\n children,\n recentActivity: activity.slice(0, 5).map((a) => ({\n action: a.action,\n timestamp: a.createdAt\n }))\n };\n}\n\n/**\n * Get AI recommendations for next steps\n */\nexport function getAINextSteps(projectId: string): AINextSteps {\n const recommendations: AINextSteps['recommendations'] = [];\n\n // Check for session\n const session = getActiveSession(projectId);\n if (!session) {\n recommendations.push({\n action: 'Start a session',\n target: 'session',\n reason: 'No active session - start one to track your work',\n command: 'aigile session start'\n });\n }\n\n // Check for in-progress items\n const inProgress = findByStatus(projectId, 'in_progress', 'all');\n if (inProgress.length > 0) {\n const item = inProgress[0];\n recommendations.push({\n action: 'Continue work',\n target: item.key,\n reason: `${item.type} is in progress`,\n command: `aigile ${item.type} show ${item.key}`\n });\n }\n\n // Check for critical bugs\n const criticalBugs = queryAll<{ key: string; summary: string }>(\n `SELECT key, summary FROM bugs WHERE project_id = ? AND severity = 'Critical' AND status = 'open' LIMIT 1`,\n [projectId]\n );\n if (criticalBugs.length > 0) {\n recommendations.push({\n action: 'Fix critical bug',\n target: criticalBugs[0].key,\n reason: 'Critical severity needs immediate attention',\n command: `aigile bug show ${criticalBugs[0].key}`\n });\n }\n\n // Check for backlog items to start\n if (inProgress.length === 0) {\n const backlog = findByStatus(projectId, 'backlog', 'story');\n if (backlog.length > 0) {\n recommendations.push({\n action: 'Start next story',\n target: backlog[0].key,\n reason: 'No work in progress - pick up next story',\n command: `aigile story transition ${backlog[0].key} in_progress`\n });\n }\n }\n\n // Check sync status\n const syncStatus = getSyncStatus(projectId);\n if (syncStatus.modified > 0) {\n recommendations.push({\n action: 'Sync files',\n target: 'documents',\n reason: `${syncStatus.modified} files have been modified`,\n command: 'aigile sync scan --comments'\n });\n }\n\n // Get blockers\n const blockers = queryAll<{ key: string; summary: string; blocked_reason: string | null }>(\n `SELECT key, summary, blocked_reason FROM tasks WHERE project_id = ? AND status = 'blocked'`,\n [projectId]\n );\n\n // Get unresolved comments\n const comments = queryAll<{ path: string; line_number: number; marker_type: string; content: string }>(\n `SELECT d.path, dc.line_number, dc.marker_type, dc.content\n FROM doc_comments dc\n JOIN documents d ON dc.document_id = d.id\n WHERE d.project_id = ? AND dc.resolved = 0\n ORDER BY dc.marker_type DESC\n LIMIT 5`,\n [projectId]\n );\n\n return {\n recommendations,\n blockers: blockers.map((b) => ({\n key: b.key,\n summary: b.summary,\n reason: b.blocked_reason\n })),\n unresolvedComments: comments.map((c) => ({\n path: c.path,\n line: c.line_number,\n type: c.marker_type,\n preview: c.content.slice(0, 100)\n }))\n };\n}\n\n/**\n * Begin AI work session\n */\nexport function beginAISession(projectId: string): {\n session: { id: string; startedAt: string };\n briefing: AIBriefing;\n nextSteps: AINextSteps;\n} {\n const session = startSession(projectId);\n const briefing = getAIBriefing(projectId);\n const nextSteps = getAINextSteps(projectId);\n\n return {\n session: { id: session.id, startedAt: session.startedAt },\n briefing,\n nextSteps\n };\n}\n\n/**\n * End AI work session with summary\n */\nexport function endAISession(\n projectId: string,\n summary?: string\n): {\n session: { id: string; duration: string; entitiesModified: number };\n resumeContext: ReturnType<typeof getResumeContext>;\n} | null {\n const session = endSession(projectId, summary);\n if (!session) {\n return null;\n }\n\n const resumeContext = getResumeContext(projectId);\n\n return {\n session: {\n id: session.id,\n duration: calculateDuration(session.startedAt, session.endedAt),\n entitiesModified: session.entitiesModified\n },\n resumeContext\n };\n}\n\n/**\n * Log AI action for audit trail\n */\nexport function logAIAction(\n projectId: string,\n entityType: string,\n entityId: string,\n action: string,\n details?: Record<string, unknown>\n): void {\n logActivity(projectId, entityType as any, entityId, action as any, {\n newValue: details,\n actor: 'ai-agent'\n });\n}\n\n/**\n * Get compact status for AI prompts\n */\nexport function getCompactStatus(projectId: string): string {\n const briefing = getAIBriefing(projectId);\n\n const lines = [\n `Project: ${briefing.project.name} (${briefing.project.key})`,\n `Session: ${briefing.session.isActive ? 'Active' : 'Inactive'}`,\n `Items: ${briefing.overview.totalItems} total, ${briefing.overview.inProgress} in-progress, ${briefing.overview.blocked} blocked`,\n `Comments: ${briefing.pendingComments} pending`\n ];\n\n if (briefing.priorities.length > 0) {\n lines.push(`Priority: ${briefing.priorities[0].key} - ${briefing.priorities[0].reason}`);\n }\n\n return lines.join(' | ');\n}\n\n/**\n * Calculate duration string\n */\nfunction calculateDuration(start: string, end?: string | null): string {\n const startDate = new Date(start);\n const endDate = end ? new Date(end) : new Date();\n const diffMs = endDate.getTime() - startDate.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) return '<1m';\n if (diffMins < 60) return `${diffMins}m`;\n\n const hours = Math.floor(diffMins / 60);\n const mins = diffMins % 60;\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n}\n","/**\n * Component Command\n *\n * Manage project components (code modules/subsystems).\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { logCreate, logActivity, logDelete, EntityType } from '../services/activity-logger.js';\n\nexport const componentCommand = new Command('component')\n .description('Manage project components');\n\n// Create component\ncomponentCommand\n .command('create')\n .argument('<name>', 'Component name')\n .option('-d, --description <description>', 'Component description')\n .option('-l, --lead <lead>', 'Component lead')\n .option('--default-assignee <assignee>', 'Default assignee for issues in this component')\n .description('Create a new component')\n .action((name: string, options) => {\n const opts = getOutputOptions(componentCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Check if component already exists\n const existing = queryOne<{ id: string }>('SELECT id FROM components WHERE project_id = ? AND name = ?', [project.id, name]);\n if (existing) {\n error(`Component \"${name}\" already exists.`, opts);\n process.exit(1);\n }\n\n const componentId = generateId();\n\n run(\n `INSERT INTO components (id, project_id, name, description, lead, default_assignee)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [componentId, project.id, name, options.description ?? null, options.lead ?? null, options.defaultAssignee ?? null]\n );\n\n logCreate(project.id, 'component', componentId, { name, description: options.description });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { id: componentId, name } }));\n } else {\n success(`Created component \"${name}\"`, opts);\n }\n });\n\n// List components\ncomponentCommand\n .command('list')\n .alias('ls')\n .description('List all components')\n .action(() => {\n const opts = getOutputOptions(componentCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const components = queryAll<{\n name: string;\n description: string | null;\n lead: string | null;\n default_assignee: string | null;\n }>(\n `SELECT name, description, lead, default_assignee FROM components\n WHERE project_id = (SELECT id FROM projects WHERE key = ?)\n ORDER BY name`,\n [config.project.key]\n );\n\n data(\n components,\n [\n { header: 'Name', key: 'name', width: 20 },\n { header: 'Description', key: 'description', width: 40 },\n { header: 'Lead', key: 'lead', width: 15 },\n { header: 'Default Assignee', key: 'default_assignee', width: 15 }\n ],\n opts\n );\n });\n\n// Show component\ncomponentCommand\n .command('show')\n .argument('<name>', 'Component name')\n .description('Show component details')\n .action((name: string) => {\n const opts = getOutputOptions(componentCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const component = queryOne<{\n id: string;\n name: string;\n description: string | null;\n lead: string | null;\n default_assignee: string | null;\n created_at: string;\n updated_at: string;\n }>(\n `SELECT id, name, description, lead, default_assignee, created_at, updated_at FROM components\n WHERE project_id = (SELECT id FROM projects WHERE key = ?) AND name = ?`,\n [config.project.key, name]\n );\n\n if (!component) {\n error(`Component \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n // Count items in this component\n const itemCount = queryOne<{ count: number }>(\n `SELECT COUNT(*) as count FROM (\n SELECT id FROM epics WHERE components LIKE ?\n UNION ALL\n SELECT id FROM user_stories WHERE components LIKE ?\n UNION ALL\n SELECT id FROM tasks WHERE components LIKE ?\n UNION ALL\n SELECT id FROM bugs WHERE components LIKE ?\n )`,\n [`%${name}%`, `%${name}%`, `%${name}%`, `%${name}%`]\n );\n\n details(\n { ...component, items: itemCount?.count ?? 0 },\n [\n { label: 'Name', key: 'name' },\n { label: 'Description', key: 'description' },\n { label: 'Lead', key: 'lead' },\n { label: 'Default Assignee', key: 'default_assignee' },\n { label: 'Items', key: 'items' },\n { label: 'Created', key: 'created_at' },\n { label: 'Updated', key: 'updated_at' }\n ],\n opts\n );\n });\n\n// Update component\ncomponentCommand\n .command('update')\n .argument('<name>', 'Component name')\n .option('-d, --description <description>', 'Component description')\n .option('-l, --lead <lead>', 'Component lead')\n .option('--default-assignee <assignee>', 'Default assignee')\n .option('--rename <newName>', 'Rename component')\n .description('Update a component')\n .action((name: string, options) => {\n const opts = getOutputOptions(componentCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const component = queryOne<{ id: string }>('SELECT id FROM components WHERE project_id = ? AND name = ?', [project.id, name]);\n if (!component) {\n error(`Component \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n const changes: Record<string, unknown> = {};\n\n if (options.description !== undefined) {\n updates.push('description = ?');\n params.push(options.description);\n changes.description = options.description;\n }\n\n if (options.lead !== undefined) {\n updates.push('lead = ?');\n params.push(options.lead);\n changes.lead = options.lead;\n }\n\n if (options.defaultAssignee !== undefined) {\n updates.push('default_assignee = ?');\n params.push(options.defaultAssignee);\n changes.default_assignee = options.defaultAssignee;\n }\n\n if (options.rename) {\n // Check if new name already exists\n const existing = queryOne<{ id: string }>('SELECT id FROM components WHERE project_id = ? AND name = ?', [project.id, options.rename]);\n if (existing) {\n error(`Component \"${options.rename}\" already exists.`, opts);\n process.exit(1);\n }\n updates.push('name = ?');\n params.push(options.rename);\n changes.name = options.rename;\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(component.id);\n\n run(`UPDATE components SET ${updates.join(', ')} WHERE id = ?`, params);\n\n logActivity(project.id, 'component' as EntityType, component.id, 'update', { newValue: changes });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name: options.rename ?? name, ...changes } }));\n } else {\n success(`Updated component \"${name}\"`, opts);\n }\n });\n\n// Delete component\ncomponentCommand\n .command('delete')\n .alias('rm')\n .argument('<name>', 'Component name')\n .option('-f, --force', 'Force delete without confirmation')\n .description('Delete a component')\n .action((name: string, options) => {\n const opts = getOutputOptions(componentCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const component = queryOne<{ id: string; name: string }>('SELECT id, name FROM components WHERE project_id = ? AND name = ?', [project.id, name]);\n if (!component) {\n error(`Component \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM components WHERE id = ?', [component.id]);\n\n logDelete(project.id, 'component', component.id, { name: component.name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name } }));\n } else {\n success(`Deleted component \"${name}\"`, opts);\n }\n });\n","/**\n * Version Command\n *\n * Manage project versions/releases.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { logCreate, logActivity, logDelete, logTransition, EntityType } from '../services/activity-logger.js';\nimport { validateTransition, getValidTransitions, formatTransitionError } from '../services/workflow-engine.js';\nimport { validateAndStandardizeDate, isEndDateValid, DATE_FORMAT } from '../utils/date.js';\n\nexport const versionCommand = new Command('version')\n .description('Manage project versions/releases');\n\n// Create version\nversionCommand\n .command('create')\n .argument('<name>', 'Version name (e.g., v1.0.0)')\n .option('-d, --description <description>', 'Version description')\n .option('--start <date>', `Start date (${DATE_FORMAT})`)\n .option('--release <date>', `Release date (${DATE_FORMAT})`)\n .description('Create a new version')\n .action((name: string, options) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Check if version already exists\n const existing = queryOne<{ id: string }>('SELECT id FROM versions WHERE project_id = ? AND name = ?', [project.id, name]);\n if (existing) {\n error(`Version \"${name}\" already exists.`, opts);\n process.exit(1);\n }\n\n // Validate and standardize dates if provided\n let startDate: string | null = null;\n let releaseDate: string | null = null;\n try {\n if (options.start) {\n startDate = validateAndStandardizeDate(options.start, 'start date');\n }\n if (options.release) {\n releaseDate = validateAndStandardizeDate(options.release, 'release date');\n }\n } catch (err) {\n error(err instanceof Error ? err.message : String(err), opts);\n process.exit(1);\n }\n\n // Validate release date is after start date if both provided\n if (startDate && releaseDate && !isEndDateValid(startDate, releaseDate)) {\n error(`Release date (${releaseDate}) must be after start date (${startDate}).`, opts);\n process.exit(1);\n }\n\n const versionId = generateId();\n\n run(\n `INSERT INTO versions (id, project_id, name, description, status, start_date, release_date)\n VALUES (?, ?, ?, ?, 'unreleased', ?, ?)`,\n [versionId, project.id, name, options.description ?? null, startDate, releaseDate]\n );\n\n logCreate(project.id, 'version', versionId, { name, description: options.description });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { id: versionId, name, status: 'unreleased' } }));\n } else {\n success(`Created version \"${name}\"`, opts);\n }\n });\n\n// List versions\nversionCommand\n .command('list')\n .alias('ls')\n .option('-s, --status <status>', 'Filter by status (unreleased/released/archived)')\n .description('List all versions')\n .action((options) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n let query = `SELECT name, description, status, start_date, release_date FROM versions\n WHERE project_id = (SELECT id FROM projects WHERE key = ?)`;\n const params: unknown[] = [config.project.key];\n\n if (options.status) {\n query += ' AND status = ?';\n params.push(options.status);\n }\n\n query += ' ORDER BY release_date DESC, name';\n\n const versions = queryAll<{\n name: string;\n description: string | null;\n status: string;\n start_date: string | null;\n release_date: string | null;\n }>(query, params);\n\n data(\n versions,\n [\n { header: 'Name', key: 'name', width: 15 },\n { header: 'Status', key: 'status', width: 12 },\n { header: 'Start', key: 'start_date', width: 12 },\n { header: 'Release', key: 'release_date', width: 12 },\n { header: 'Description', key: 'description', width: 35 }\n ],\n opts\n );\n });\n\n// Show version\nversionCommand\n .command('show')\n .argument('<name>', 'Version name')\n .description('Show version details')\n .action((name: string) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const version = queryOne<{\n id: string;\n name: string;\n description: string | null;\n status: string;\n start_date: string | null;\n release_date: string | null;\n created_at: string;\n updated_at: string;\n }>(\n `SELECT id, name, description, status, start_date, release_date, created_at, updated_at FROM versions\n WHERE project_id = (SELECT id FROM projects WHERE key = ?) AND name = ?`,\n [config.project.key, name]\n );\n\n if (!version) {\n error(`Version \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n // Count fix versions\n const fixCount = queryOne<{ count: number }>(\n `SELECT COUNT(*) as count FROM (\n SELECT id FROM epics WHERE fix_versions LIKE ?\n UNION ALL\n SELECT id FROM user_stories WHERE fix_versions LIKE ?\n UNION ALL\n SELECT id FROM bugs WHERE fix_versions LIKE ?\n )`,\n [`%${name}%`, `%${name}%`, `%${name}%`]\n );\n\n details(\n { ...version, fix_items: fixCount?.count ?? 0 },\n [\n { label: 'Name', key: 'name' },\n { label: 'Status', key: 'status' },\n { label: 'Description', key: 'description' },\n { label: 'Start Date', key: 'start_date' },\n { label: 'Release Date', key: 'release_date' },\n { label: 'Fix Items', key: 'fix_items' },\n { label: 'Created', key: 'created_at' },\n { label: 'Updated', key: 'updated_at' }\n ],\n opts\n );\n });\n\n// Update version\nversionCommand\n .command('update')\n .argument('<name>', 'Version name')\n .option('-d, --description <description>', 'Version description')\n .option('--start <date>', `Start date (${DATE_FORMAT})`)\n .option('--release <date>', `Release date (${DATE_FORMAT})`)\n .option('--rename <newName>', 'Rename version')\n .description('Update a version')\n .action((name: string, options) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const version = queryOne<{ id: string; start_date: string | null; release_date: string | null }>(\n 'SELECT id, start_date, release_date FROM versions WHERE project_id = ? AND name = ?',\n [project.id, name]\n );\n if (!version) {\n error(`Version \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n const changes: Record<string, unknown> = {};\n\n if (options.description !== undefined) {\n updates.push('description = ?');\n params.push(options.description);\n changes.description = options.description;\n }\n\n // Validate and standardize dates if provided\n let startDate: string | null = null;\n let releaseDate: string | null = null;\n try {\n if (options.start !== undefined) {\n startDate = validateAndStandardizeDate(options.start, 'start date');\n updates.push('start_date = ?');\n params.push(startDate);\n changes.start_date = startDate;\n }\n\n if (options.release !== undefined) {\n releaseDate = validateAndStandardizeDate(options.release, 'release date');\n updates.push('release_date = ?');\n params.push(releaseDate);\n changes.release_date = releaseDate;\n }\n } catch (err) {\n error(err instanceof Error ? err.message : String(err), opts);\n process.exit(1);\n }\n\n // Validate date order if both are being set or one is being updated\n const effectiveStart = startDate ?? version.start_date;\n const effectiveRelease = releaseDate ?? version.release_date;\n if (effectiveStart && effectiveRelease && !isEndDateValid(effectiveStart, effectiveRelease)) {\n error(`Release date (${effectiveRelease}) must be after start date (${effectiveStart}).`, opts);\n process.exit(1);\n }\n\n if (options.rename) {\n // Check if new name already exists\n const existing = queryOne<{ id: string }>('SELECT id FROM versions WHERE project_id = ? AND name = ?', [project.id, options.rename]);\n if (existing) {\n error(`Version \"${options.rename}\" already exists.`, opts);\n process.exit(1);\n }\n updates.push('name = ?');\n params.push(options.rename);\n changes.name = options.rename;\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(version.id);\n\n run(`UPDATE versions SET ${updates.join(', ')} WHERE id = ?`, params);\n\n logActivity(project.id, 'version' as EntityType, version.id, 'update', { newValue: changes });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name: options.rename ?? name, ...changes } }));\n } else {\n success(`Updated version \"${name}\"`, opts);\n }\n });\n\n// Transition version status\nversionCommand\n .command('transition')\n .argument('<name>', 'Version name')\n .argument('<status>', 'New status (unreleased/released/archived)')\n .description('Transition version status')\n .action((name: string, newStatus: string) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const version = queryOne<{ id: string; status: string }>('SELECT id, status FROM versions WHERE project_id = ? AND name = ?', [project.id, name]);\n if (!version) {\n error(`Version \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n // Validate transition using workflow engine\n const validation = validateTransition('version', version.status, newStatus);\n if (!validation.valid) {\n const validTransitions = getValidTransitions('version', version.status);\n error(formatTransitionError('version', name, version.status, newStatus, validTransitions), opts);\n process.exit(1);\n }\n\n // If releasing, set release_date to today if not set\n let additionalUpdate = '';\n if (newStatus === 'released') {\n additionalUpdate = \", release_date = COALESCE(release_date, date('now'))\";\n }\n\n run(`UPDATE versions SET status = ?, updated_at = datetime('now')${additionalUpdate} WHERE id = ?`, [newStatus, version.id]);\n\n logTransition(project.id, 'version', version.id, version.status, newStatus);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name, oldStatus: version.status, newStatus } }));\n } else {\n success(`Version \"${name}\" transitioned from \"${version.status}\" to \"${newStatus}\"`, opts);\n }\n });\n\n// Delete version\nversionCommand\n .command('delete')\n .alias('rm')\n .argument('<name>', 'Version name')\n .option('-f, --force', 'Force delete without confirmation')\n .description('Delete a version')\n .action((name: string, options) => {\n const opts = getOutputOptions(versionCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const version = queryOne<{ id: string; name: string }>('SELECT id, name FROM versions WHERE project_id = ? AND name = ?', [project.id, name]);\n if (!version) {\n error(`Version \"${name}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM versions WHERE id = ?', [version.id]);\n\n logDelete(project.id, 'version', version.id, { name: version.name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { name } }));\n } else {\n success(`Deleted version \"${name}\"`, opts);\n }\n });\n","/**\n * Persona Command\n *\n * Manage user personas (user archetypes for UX design).\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { logCreate, logActivity, logDelete, EntityType } from '../services/activity-logger.js';\n\nexport const personaCommand = new Command('persona')\n .description('Manage user personas');\n\n// Create persona\npersonaCommand\n .command('create')\n .argument('<name>', 'Persona name')\n .option('-d, --description <description>', 'Persona description')\n .option('-r, --role <role>', 'User role (e.g., \"Developer\", \"Manager\")')\n .option('-g, --goals <goals>', 'User goals (comma-separated)')\n .option('-f, --frustrations <frustrations>', 'User frustrations (comma-separated)')\n .option('--demographics <demographics>', 'Demographics info')\n .description('Create a new persona')\n .action((name: string, options) => {\n const opts = getOutputOptions(personaCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string; key: string }>('SELECT id, key FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const personaId = generateId();\n const key = getNextKey(project.key);\n\n run(\n `INSERT INTO personas (id, project_id, key, name, description, role, goals, frustrations, demographics)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n personaId,\n project.id,\n key,\n name,\n options.description ?? null,\n options.role ?? null,\n options.goals ?? null,\n options.frustrations ?? null,\n options.demographics ?? null\n ]\n );\n\n logCreate(project.id, 'persona', personaId, { key, name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { id: personaId, key, name } }));\n } else {\n success(`Created persona \"${name}\" (${key})`, opts);\n }\n });\n\n// List personas\npersonaCommand\n .command('list')\n .alias('ls')\n .description('List all personas')\n .action(() => {\n const opts = getOutputOptions(personaCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const personas = queryAll<{\n key: string;\n name: string;\n role: string | null;\n description: string | null;\n }>(\n `SELECT key, name, role, description FROM personas\n WHERE project_id = (SELECT id FROM projects WHERE key = ?)\n ORDER BY name`,\n [config.project.key]\n );\n\n data(\n personas,\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Name', key: 'name', width: 20 },\n { header: 'Role', key: 'role', width: 20 },\n { header: 'Description', key: 'description', width: 40 }\n ],\n opts\n );\n });\n\n// Show persona\npersonaCommand\n .command('show')\n .argument('<key>', 'Persona key')\n .description('Show persona details')\n .action((key: string) => {\n const opts = getOutputOptions(personaCommand);\n\n const persona = queryOne<{\n id: string;\n key: string;\n name: string;\n description: string | null;\n role: string | null;\n goals: string | null;\n frustrations: string | null;\n demographics: string | null;\n created_at: string;\n updated_at: string;\n }>(\n `SELECT id, key, name, description, role, goals, frustrations, demographics, created_at, updated_at\n FROM personas WHERE key = ?`,\n [key]\n );\n\n if (!persona) {\n error(`Persona \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Count UX journeys for this persona\n const journeyCount = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM ux_journeys WHERE persona_id = ?',\n [persona.id]\n );\n\n details(\n { ...persona, journeys: journeyCount?.count ?? 0 },\n [\n { label: 'Key', key: 'key' },\n { label: 'Name', key: 'name' },\n { label: 'Role', key: 'role' },\n { label: 'Description', key: 'description' },\n { label: 'Goals', key: 'goals' },\n { label: 'Frustrations', key: 'frustrations' },\n { label: 'Demographics', key: 'demographics' },\n { label: 'UX Journeys', key: 'journeys' },\n { label: 'Created', key: 'created_at' },\n { label: 'Updated', key: 'updated_at' }\n ],\n opts\n );\n });\n\n// Update persona\npersonaCommand\n .command('update')\n .argument('<key>', 'Persona key')\n .option('-n, --name <name>', 'Persona name')\n .option('-d, --description <description>', 'Persona description')\n .option('-r, --role <role>', 'User role')\n .option('-g, --goals <goals>', 'User goals')\n .option('-f, --frustrations <frustrations>', 'User frustrations')\n .option('--demographics <demographics>', 'Demographics info')\n .description('Update a persona')\n .action((key: string, options) => {\n const opts = getOutputOptions(personaCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const persona = queryOne<{ id: string }>('SELECT id FROM personas WHERE key = ?', [key]);\n if (!persona) {\n error(`Persona \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n const changes: Record<string, unknown> = {};\n\n if (options.name !== undefined) {\n updates.push('name = ?');\n params.push(options.name);\n changes.name = options.name;\n }\n\n if (options.description !== undefined) {\n updates.push('description = ?');\n params.push(options.description);\n changes.description = options.description;\n }\n\n if (options.role !== undefined) {\n updates.push('role = ?');\n params.push(options.role);\n changes.role = options.role;\n }\n\n if (options.goals !== undefined) {\n updates.push('goals = ?');\n params.push(options.goals);\n changes.goals = options.goals;\n }\n\n if (options.frustrations !== undefined) {\n updates.push('frustrations = ?');\n params.push(options.frustrations);\n changes.frustrations = options.frustrations;\n }\n\n if (options.demographics !== undefined) {\n updates.push('demographics = ?');\n params.push(options.demographics);\n changes.demographics = options.demographics;\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(persona.id);\n\n run(`UPDATE personas SET ${updates.join(', ')} WHERE id = ?`, params);\n\n logActivity(project.id, 'persona' as EntityType, persona.id, 'update', { newValue: changes });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key, ...changes } }));\n } else {\n success(`Updated persona \"${key}\"`, opts);\n }\n });\n\n// Delete persona\npersonaCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Persona key')\n .option('-f, --force', 'Force delete without confirmation')\n .description('Delete a persona')\n .action((key: string, options) => {\n const opts = getOutputOptions(personaCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const persona = queryOne<{ id: string; key: string; name: string }>('SELECT id, key, name FROM personas WHERE key = ?', [key]);\n if (!persona) {\n error(`Persona \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n // Check for linked UX journeys\n const linkedJourneys = queryOne<{ count: number }>(\n 'SELECT COUNT(*) as count FROM ux_journeys WHERE persona_id = ?',\n [persona.id]\n );\n\n if ((linkedJourneys?.count ?? 0) > 0 && !options.force) {\n error(`Persona \"${key}\" has ${linkedJourneys?.count} linked UX journeys. Use --force to delete.`, opts);\n process.exit(1);\n }\n\n // Unlink UX journeys\n run('UPDATE ux_journeys SET persona_id = NULL WHERE persona_id = ?', [persona.id]);\n\n run('DELETE FROM personas WHERE id = ?', [persona.id]);\n\n logDelete(project.id, 'persona', persona.id, { key: persona.key, name: persona.name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key } }));\n } else {\n success(`Deleted persona \"${key}\"`, opts);\n }\n });\n","/**\n * UX Journey Command\n *\n * Manage user experience journeys.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { queryAll, queryOne, run, generateId, getNextKey } from '../db/connection.js';\nimport {\n success,\n error,\n data,\n details,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport { logCreate, logActivity, logDelete, EntityType } from '../services/activity-logger.js';\n\nexport const uxJourneyCommand = new Command('ux-journey')\n .alias('journey')\n .description('Manage UX journeys');\n\n// Create UX journey\nuxJourneyCommand\n .command('create')\n .argument('<name>', 'Journey name')\n .option('-d, --description <description>', 'Journey description')\n .option('-p, --persona <key>', 'Associated persona key')\n .option('-s, --stages <stages>', 'Journey stages (JSON array or comma-separated)')\n .option('-t, --touchpoints <touchpoints>', 'Touchpoints (comma-separated)')\n .option('--pain-points <painPoints>', 'Pain points (comma-separated)')\n .option('--opportunities <opportunities>', 'Opportunities (comma-separated)')\n .description('Create a new UX journey')\n .action((name: string, options) => {\n const opts = getOutputOptions(uxJourneyCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string; key: string }>('SELECT id, key FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n let personaId: string | null = null;\n if (options.persona) {\n const persona = queryOne<{ id: string }>('SELECT id FROM personas WHERE key = ?', [options.persona]);\n if (!persona) {\n error(`Persona \"${options.persona}\" not found.`, opts);\n process.exit(1);\n }\n personaId = persona.id;\n }\n\n const journeyId = generateId();\n const key = getNextKey(project.key);\n\n run(\n `INSERT INTO ux_journeys (id, project_id, key, name, description, persona_id, stages, touchpoints, pain_points, opportunities)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n journeyId,\n project.id,\n key,\n name,\n options.description ?? null,\n personaId,\n options.stages ?? null,\n options.touchpoints ?? null,\n options.painPoints ?? null,\n options.opportunities ?? null\n ]\n );\n\n logCreate(project.id, 'ux_journey', journeyId, { key, name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { id: journeyId, key, name } }));\n } else {\n success(`Created UX journey \"${name}\" (${key})`, opts);\n }\n });\n\n// List UX journeys\nuxJourneyCommand\n .command('list')\n .alias('ls')\n .option('-p, --persona <key>', 'Filter by persona key')\n .description('List all UX journeys')\n .action((options) => {\n const opts = getOutputOptions(uxJourneyCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n let query = `SELECT j.key, j.name, j.description, p.name as persona_name, p.key as persona_key\n FROM ux_journeys j\n LEFT JOIN personas p ON j.persona_id = p.id\n WHERE j.project_id = (SELECT id FROM projects WHERE key = ?)`;\n const params: unknown[] = [config.project.key];\n\n if (options.persona) {\n query += ' AND p.key = ?';\n params.push(options.persona);\n }\n\n query += ' ORDER BY j.name';\n\n const journeys = queryAll<{\n key: string;\n name: string;\n description: string | null;\n persona_name: string | null;\n persona_key: string | null;\n }>(query, params);\n\n data(\n journeys.map(j => ({\n ...j,\n persona: j.persona_key ? `${j.persona_name} (${j.persona_key})` : '-'\n })),\n [\n { header: 'Key', key: 'key', width: 12 },\n { header: 'Name', key: 'name', width: 25 },\n { header: 'Persona', key: 'persona', width: 25 },\n { header: 'Description', key: 'description', width: 35 }\n ],\n opts\n );\n });\n\n// Show UX journey\nuxJourneyCommand\n .command('show')\n .argument('<key>', 'Journey key')\n .description('Show UX journey details')\n .action((key: string) => {\n const opts = getOutputOptions(uxJourneyCommand);\n\n const journey = queryOne<{\n id: string;\n key: string;\n name: string;\n description: string | null;\n persona_id: string | null;\n stages: string | null;\n touchpoints: string | null;\n pain_points: string | null;\n opportunities: string | null;\n created_at: string;\n updated_at: string;\n }>(\n `SELECT id, key, name, description, persona_id, stages, touchpoints, pain_points, opportunities, created_at, updated_at\n FROM ux_journeys WHERE key = ?`,\n [key]\n );\n\n if (!journey) {\n error(`UX journey \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n let personaInfo = '-';\n if (journey.persona_id) {\n const persona = queryOne<{ key: string; name: string }>('SELECT key, name FROM personas WHERE id = ?', [journey.persona_id]);\n if (persona) {\n personaInfo = `${persona.name} (${persona.key})`;\n }\n }\n\n details(\n { ...journey, persona: personaInfo },\n [\n { label: 'Key', key: 'key' },\n { label: 'Name', key: 'name' },\n { label: 'Persona', key: 'persona' },\n { label: 'Description', key: 'description' },\n { label: 'Stages', key: 'stages' },\n { label: 'Touchpoints', key: 'touchpoints' },\n { label: 'Pain Points', key: 'pain_points' },\n { label: 'Opportunities', key: 'opportunities' },\n { label: 'Created', key: 'created_at' },\n { label: 'Updated', key: 'updated_at' }\n ],\n opts\n );\n });\n\n// Update UX journey\nuxJourneyCommand\n .command('update')\n .argument('<key>', 'Journey key')\n .option('-n, --name <name>', 'Journey name')\n .option('-d, --description <description>', 'Journey description')\n .option('-p, --persona <key>', 'Associated persona key (use \"none\" to unlink)')\n .option('-s, --stages <stages>', 'Journey stages')\n .option('-t, --touchpoints <touchpoints>', 'Touchpoints')\n .option('--pain-points <painPoints>', 'Pain points')\n .option('--opportunities <opportunities>', 'Opportunities')\n .description('Update a UX journey')\n .action((key: string, options) => {\n const opts = getOutputOptions(uxJourneyCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const journey = queryOne<{ id: string }>('SELECT id FROM ux_journeys WHERE key = ?', [key]);\n if (!journey) {\n error(`UX journey \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n const updates: string[] = [];\n const params: unknown[] = [];\n const changes: Record<string, unknown> = {};\n\n if (options.name !== undefined) {\n updates.push('name = ?');\n params.push(options.name);\n changes.name = options.name;\n }\n\n if (options.description !== undefined) {\n updates.push('description = ?');\n params.push(options.description);\n changes.description = options.description;\n }\n\n if (options.persona !== undefined) {\n if (options.persona === 'none') {\n updates.push('persona_id = NULL');\n changes.persona_id = null;\n } else {\n const persona = queryOne<{ id: string }>('SELECT id FROM personas WHERE key = ?', [options.persona]);\n if (!persona) {\n error(`Persona \"${options.persona}\" not found.`, opts);\n process.exit(1);\n }\n updates.push('persona_id = ?');\n params.push(persona.id);\n changes.persona_id = options.persona;\n }\n }\n\n if (options.stages !== undefined) {\n updates.push('stages = ?');\n params.push(options.stages);\n changes.stages = options.stages;\n }\n\n if (options.touchpoints !== undefined) {\n updates.push('touchpoints = ?');\n params.push(options.touchpoints);\n changes.touchpoints = options.touchpoints;\n }\n\n if (options.painPoints !== undefined) {\n updates.push('pain_points = ?');\n params.push(options.painPoints);\n changes.pain_points = options.painPoints;\n }\n\n if (options.opportunities !== undefined) {\n updates.push('opportunities = ?');\n params.push(options.opportunities);\n changes.opportunities = options.opportunities;\n }\n\n if (updates.length === 0) {\n error('No updates specified.', opts);\n process.exit(1);\n }\n\n updates.push(\"updated_at = datetime('now')\");\n params.push(journey.id);\n\n run(`UPDATE ux_journeys SET ${updates.join(', ')} WHERE id = ?`, params);\n\n logActivity(project.id, 'ux_journey' as EntityType, journey.id, 'update', { newValue: changes });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key, ...changes } }));\n } else {\n success(`Updated UX journey \"${key}\"`, opts);\n }\n });\n\n// Delete UX journey\nuxJourneyCommand\n .command('delete')\n .alias('rm')\n .argument('<key>', 'Journey key')\n .option('-f, --force', 'Force delete without confirmation')\n .description('Delete a UX journey')\n .action((key: string) => {\n const opts = getOutputOptions(uxJourneyCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found.`, opts);\n process.exit(1);\n }\n\n const journey = queryOne<{ id: string; key: string; name: string }>('SELECT id, key, name FROM ux_journeys WHERE key = ?', [key]);\n if (!journey) {\n error(`UX journey \"${key}\" not found.`, opts);\n process.exit(1);\n }\n\n run('DELETE FROM ux_journeys WHERE id = ?', [journey.id]);\n\n logDelete(project.id, 'ux_journey', journey.id, { key: journey.key, name: journey.name });\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { key } }));\n } else {\n success(`Deleted UX journey \"${key}\"`, opts);\n }\n });\n","/**\n * Document Command\n *\n * Document management and frontmatter metadata operations.\n * Allows querying, viewing, and updating document frontmatter.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { queryOne } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n data,\n details,\n getOutputOptions,\n type OutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n getDocumentByPath,\n getDocumentsByMetaStatus,\n getDocumentsByModule,\n getDocumentsWithFrontmatter,\n getDocumentsWithoutFrontmatter,\n getTemplateDocuments,\n searchDocumentsByTldr,\n DocumentWithMetadata\n} from '../services/file-scanner.js';\nimport {\n parseFrontmatterFromFile,\n updateFrontmatterContent,\n FrontmatterMetadata\n} from '../services/frontmatter-parser.js';\n\nexport const docCommand = new Command('doc')\n .description('Document management and frontmatter operations');\n\n/**\n * Helper to get project ID from config\n */\nfunction getProjectId(opts: OutputOptions): { projectId: string; projectRoot: string } | null {\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n return null;\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n return null;\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n return null;\n }\n\n return { projectId: project.id, projectRoot };\n}\n\n/**\n * Format document for display\n */\nfunction formatDocForDisplay(doc: DocumentWithMetadata): Record<string, unknown> {\n return {\n path: doc.path,\n filename: doc.filename,\n extension: doc.extension,\n sync_status: doc.status,\n has_frontmatter: doc.has_frontmatter ? 'Yes' : 'No',\n meta_status: doc.meta_status ?? '-',\n meta_version: doc.meta_version ?? '-',\n meta_tldr: doc.meta_tldr ?? '-',\n meta_modules: doc.meta_modules ? JSON.parse(doc.meta_modules).join(', ') : '-',\n meta_dependencies: doc.meta_dependencies ? JSON.parse(doc.meta_dependencies).join(', ') : '-'\n };\n}\n\n// List command - list documents with metadata filters\ndocCommand\n .command('list')\n .alias('ls')\n .option('--meta-status <status>', 'Filter by frontmatter status (DRAFT, IN-REVIEW, APPROVED, TEMPLATE)')\n .option('--module <module>', 'Filter by module')\n .option('--with-frontmatter', 'Only show documents with frontmatter')\n .option('--without-frontmatter', 'Only show documents without frontmatter (shadow mode)')\n .option('--templates', 'Only show TEMPLATE documents')\n .option('--search <term>', 'Search by tldr content')\n .description('List documents with metadata filters')\n .action((options) => {\n const opts = getOutputOptions(docCommand);\n const ctx = getProjectId(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n let documents: DocumentWithMetadata[] = [];\n\n if (options.metaStatus) {\n documents = getDocumentsByMetaStatus(ctx.projectId, options.metaStatus);\n } else if (options.module) {\n documents = getDocumentsByModule(ctx.projectId, options.module);\n } else if (options.withFrontmatter) {\n documents = getDocumentsWithFrontmatter(ctx.projectId);\n } else if (options.withoutFrontmatter) {\n documents = getDocumentsWithoutFrontmatter(ctx.projectId);\n } else if (options.templates) {\n documents = getTemplateDocuments(ctx.projectId);\n } else if (options.search) {\n documents = searchDocumentsByTldr(ctx.projectId, options.search);\n } else {\n // Default: all documents with frontmatter\n documents = getDocumentsWithFrontmatter(ctx.projectId);\n }\n\n const displayDocs = documents.map(formatDocForDisplay);\n\n data(\n displayDocs,\n [\n { header: 'Path', key: 'path', width: 45 },\n { header: 'Status', key: 'meta_status', width: 12 },\n { header: 'Version', key: 'meta_version', width: 8 },\n { header: 'Modules', key: 'meta_modules', width: 20 }\n ],\n opts\n );\n });\n\n// Show command - show document details\ndocCommand\n .command('show <path>')\n .description('Show document details including frontmatter metadata')\n .action((filePath: string) => {\n const opts = getOutputOptions(docCommand);\n const ctx = getProjectId(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n const doc = getDocumentByPath(ctx.projectId, filePath);\n if (!doc) {\n error(`Document not found: ${filePath}`, opts);\n process.exit(1);\n }\n\n // Parse live frontmatter from file\n const fullPath = join(ctx.projectRoot, filePath);\n const parsed = parseFrontmatterFromFile(fullPath);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n database: doc,\n frontmatter: parsed ? {\n raw: parsed.raw,\n metadata: parsed.metadata\n } : null\n }\n }));\n } else {\n const displayData: Record<string, unknown> = {\n path: doc.path,\n filename: doc.filename,\n extension: doc.extension,\n sync_status: doc.status,\n size_bytes: doc.size_bytes,\n last_scanned: doc.last_scanned_at,\n has_frontmatter: doc.has_frontmatter ? 'Yes' : 'No'\n };\n\n if (parsed) {\n displayData.meta_status = parsed.metadata.status ?? '-';\n displayData.meta_version = parsed.metadata.version ?? '-';\n displayData.meta_tldr = parsed.metadata.tldr ?? '-';\n displayData.meta_title = parsed.metadata.title ?? '-';\n displayData.meta_modules = parsed.metadata.modules?.join(', ') ?? '-';\n displayData.meta_dependencies = parsed.metadata.dependencies?.join(', ') ?? '-';\n displayData.meta_code_refs = parsed.metadata.code_refs?.join(', ') ?? '-';\n displayData.meta_authors = parsed.metadata.authors?.join(', ') ?? '-';\n }\n\n details(\n displayData,\n [\n { label: 'Path', key: 'path' },\n { label: 'Filename', key: 'filename' },\n { label: 'Extension', key: 'extension' },\n { label: 'Sync Status', key: 'sync_status' },\n { label: 'Size (bytes)', key: 'size_bytes' },\n { label: 'Last Scanned', key: 'last_scanned' },\n { label: 'Has Frontmatter', key: 'has_frontmatter' },\n { label: 'Meta Status', key: 'meta_status' },\n { label: 'Meta Version', key: 'meta_version' },\n { label: 'Meta Title', key: 'meta_title' },\n { label: 'Meta TLDR', key: 'meta_tldr' },\n { label: 'Meta Modules', key: 'meta_modules' },\n { label: 'Meta Dependencies', key: 'meta_dependencies' },\n { label: 'Meta Code Refs', key: 'meta_code_refs' },\n { label: 'Meta Authors', key: 'meta_authors' }\n ],\n opts\n );\n }\n });\n\n// Update command - update frontmatter metadata\ndocCommand\n .command('update <path>')\n .option('--status <status>', 'Set metadata status (DRAFT, IN-REVIEW, APPROVED, TEMPLATE, PRODUCTION)')\n .option('--version <version>', 'Set metadata version')\n .option('--tldr <tldr>', 'Set one-sentence summary')\n .option('--title <title>', 'Set document title')\n .option('--add-module <module>', 'Add a module to the modules list')\n .option('--add-dependency <dep>', 'Add a dependency path')\n .option('--add-code-ref <ref>', 'Add a code reference path')\n .option('--add-author <author>', 'Add an author')\n .option('--dry-run', 'Show what would be changed without modifying file')\n .description('Update frontmatter metadata in a document')\n .action((filePath: string, options) => {\n const opts = getOutputOptions(docCommand);\n const ctx = getProjectId(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n const fullPath = join(ctx.projectRoot, filePath);\n\n // Read current file content\n let content: string;\n try {\n content = readFileSync(fullPath, 'utf-8');\n } catch {\n error(`Could not read file: ${filePath}`, opts);\n process.exit(1);\n }\n\n // Build updates object\n const updates: Partial<FrontmatterMetadata> = {};\n\n if (options.status) {\n updates.status = options.status;\n }\n if (options.version) {\n updates.version = options.version;\n }\n if (options.tldr) {\n updates.tldr = options.tldr;\n }\n if (options.title) {\n updates.title = options.title;\n }\n if (options.addModule) {\n updates.modules = [options.addModule];\n }\n if (options.addDependency) {\n updates.dependencies = [options.addDependency];\n }\n if (options.addCodeRef) {\n updates.code_refs = [options.addCodeRef];\n }\n if (options.addAuthor) {\n updates.authors = [options.addAuthor];\n }\n\n if (Object.keys(updates).length === 0) {\n error('No updates specified. Use --status, --version, --tldr, etc.', opts);\n process.exit(1);\n }\n\n // Generate updated content\n const newContent = updateFrontmatterContent(content, updates);\n\n if (options.dryRun) {\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n dryRun: true,\n updates,\n preview: newContent.substring(0, 500) + (newContent.length > 500 ? '...' : '')\n }));\n } else {\n info('Dry run - would update frontmatter with:', opts);\n console.log(JSON.stringify(updates, null, 2));\n console.log('\\nNew frontmatter preview:');\n const lines = newContent.split('\\n');\n const endIndex = lines.findIndex((l, i) => i > 0 && l === '---');\n lines.slice(0, endIndex + 1).forEach(l => console.log(l));\n }\n return;\n }\n\n // Write updated content\n try {\n writeFileSync(fullPath, newContent, 'utf-8');\n success(`Updated frontmatter in ${filePath}`, opts);\n\n if (!opts.json) {\n info('Run \"aigile sync scan\" to update the database.', opts);\n }\n } catch (err) {\n error(`Could not write file: ${filePath}`, opts);\n process.exit(1);\n }\n });\n\n// Init command - add frontmatter to a file without it\ndocCommand\n .command('init-frontmatter <path>')\n .option('--status <status>', 'Initial status (default: DRAFT)')\n .option('--version <version>', 'Initial version (default: 0.1)')\n .option('--tldr <tldr>', 'One-sentence summary')\n .option('--title <title>', 'Document title')\n .description('Add frontmatter to a file that does not have it')\n .action((filePath: string, options) => {\n const opts = getOutputOptions(docCommand);\n const ctx = getProjectId(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n const fullPath = join(ctx.projectRoot, filePath);\n\n // Read current file content\n let content: string;\n try {\n content = readFileSync(fullPath, 'utf-8');\n } catch {\n error(`Could not read file: ${filePath}`, opts);\n process.exit(1);\n }\n\n // Check if file already has frontmatter\n const existing = parseFrontmatterFromFile(fullPath);\n if (existing) {\n error('File already has frontmatter. Use \"aigile doc update\" instead.', opts);\n process.exit(1);\n }\n\n // Build initial metadata\n const metadata: Partial<FrontmatterMetadata> = {\n status: options.status ?? 'DRAFT',\n version: options.version ?? '0.1',\n tldr: options.tldr ?? '',\n title: options.title\n };\n\n // Add frontmatter\n const newContent = updateFrontmatterContent(content, metadata);\n\n try {\n writeFileSync(fullPath, newContent, 'utf-8');\n success(`Added frontmatter to ${filePath}`, opts);\n\n if (!opts.json) {\n info('Run \"aigile sync scan\" to update the database.', opts);\n }\n } catch {\n error(`Could not write file: ${filePath}`, opts);\n process.exit(1);\n }\n });\n\n// Stats command - show frontmatter statistics\ndocCommand\n .command('stats')\n .description('Show frontmatter statistics for the project')\n .action(() => {\n const opts = getOutputOptions(docCommand);\n const ctx = getProjectId(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n const withFrontmatter = getDocumentsWithFrontmatter(ctx.projectId);\n const withoutFrontmatter = getDocumentsWithoutFrontmatter(ctx.projectId);\n const templates = getTemplateDocuments(ctx.projectId);\n const drafts = getDocumentsByMetaStatus(ctx.projectId, 'DRAFT');\n const inReview = getDocumentsByMetaStatus(ctx.projectId, 'IN-REVIEW');\n const approved = getDocumentsByMetaStatus(ctx.projectId, 'APPROVED');\n\n const stats = {\n total_documents: withFrontmatter.length + withoutFrontmatter.length,\n with_frontmatter: withFrontmatter.length,\n without_frontmatter: withoutFrontmatter.length,\n templates: templates.length,\n drafts: drafts.length,\n in_review: inReview.length,\n approved: approved.length\n };\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: stats }));\n } else {\n details(\n stats,\n [\n { label: 'Total Documents', key: 'total_documents' },\n { label: 'With Frontmatter', key: 'with_frontmatter' },\n { label: 'Without Frontmatter', key: 'without_frontmatter' },\n { label: 'TEMPLATE', key: 'templates' },\n { label: 'DRAFT', key: 'drafts' },\n { label: 'IN-REVIEW', key: 'in_review' },\n { label: 'APPROVED', key: 'approved' }\n ],\n opts\n );\n }\n });\n","/**\n * Daemon Command\n *\n * Manages the AIGILE file watcher daemon for automatic file synchronization.\n * Supports installation, start, stop, status, and uninstall operations.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { existsSync, writeFileSync, unlinkSync, readFileSync, mkdirSync, statSync, renameSync, readdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { homedir, platform } from 'os';\nimport { spawn, execSync } from 'child_process';\nimport { queryOne, queryAll } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n warning,\n details,\n data,\n getOutputOptions\n} from '../services/output-formatter.js';\nimport {\n findProjectRoot,\n loadProjectConfig,\n getAigileHome,\n getIgnoreFilePath,\n hasIgnoreFile,\n getDbPath,\n} from '../utils/config.js';\nimport { createFileWatcher, FileWatcher } from '../services/file-watcher.js';\nimport { scanDirectory, syncFilesToDatabase } from '../services/file-scanner.js';\nimport { DaemonManager, getDaemonManager, DaemonStatus } from '../services/daemon-manager.js';\n\n// Constants for reliability features\nconst CRASH_DIR_NAME = 'crashes';\nconst MAX_CRASH_REPORTS = 10;\nconst MAX_LOG_SIZE = 10 * 1024 * 1024; // 10MB\nconst MAX_LOG_FILES = 5;\nconst SHUTDOWN_TIMEOUT_MS = 10000; // 10 seconds\n\nexport const daemonCommand = new Command('daemon')\n .description('Manage the file watcher daemon');\n\n// Platform-specific paths and configurations\nconst PLATFORM = platform();\nconst DAEMON_NAME = 'com.aigile.watcher';\n\ninterface DaemonPaths {\n plist?: string; // macOS LaunchAgent plist\n service?: string; // Linux systemd service\n pidFile: string; // PID file location\n logFile: string; // Log file location\n}\n\nfunction getDaemonPaths(): DaemonPaths {\n const aigileHome = getAigileHome();\n const basePaths = {\n pidFile: join(aigileHome, 'daemon.pid'),\n logFile: join(aigileHome, 'daemon.log')\n };\n\n if (PLATFORM === 'darwin') {\n return {\n ...basePaths,\n plist: join(homedir(), 'Library', 'LaunchAgents', `${DAEMON_NAME}.plist`)\n };\n } else if (PLATFORM === 'linux') {\n return {\n ...basePaths,\n service: join(homedir(), '.config', 'systemd', 'user', `${DAEMON_NAME}.service`)\n };\n }\n\n return basePaths;\n}\n\n/**\n * Check if daemon is running\n */\nfunction isDaemonRunning(): { running: boolean; pid?: number } {\n const paths = getDaemonPaths();\n\n if (!existsSync(paths.pidFile)) {\n return { running: false };\n }\n\n try {\n const pid = parseInt(readFileSync(paths.pidFile, 'utf-8').trim(), 10);\n\n // Check if process is running\n try {\n process.kill(pid, 0); // Signal 0 = check if process exists\n return { running: true, pid };\n } catch {\n // Process not running, clean up stale PID file\n unlinkSync(paths.pidFile);\n return { running: false };\n }\n } catch {\n return { running: false };\n }\n}\n\n/**\n * Write a crash report to the crashes directory\n */\nfunction writeCrashReport(error: unknown): void {\n try {\n const crashDir = join(getAigileHome(), CRASH_DIR_NAME);\n if (!existsSync(crashDir)) {\n mkdirSync(crashDir, { recursive: true });\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const crashFile = join(crashDir, `crash-${timestamp}.log`);\n\n const report = [\n `AIGILE Daemon Crash Report`,\n `==========================`,\n ``,\n `Time: ${new Date().toISOString()}`,\n `Node: ${process.version}`,\n `Platform: ${platform()}`,\n `PID: ${process.pid}`,\n ``,\n `Error:`,\n error instanceof Error ? (error.stack || error.message) : String(error),\n ].join('\\n');\n\n writeFileSync(crashFile, report);\n console.error(`[${new Date().toISOString()}] Crash report saved: ${crashFile}`);\n\n // Cleanup old crash reports (keep only MAX_CRASH_REPORTS most recent)\n cleanupOldCrashReports(crashDir);\n } catch (writeErr) {\n console.error(`[${new Date().toISOString()}] Failed to write crash report: ${writeErr}`);\n }\n}\n\n/**\n * Remove old crash reports, keeping only the most recent ones\n */\nfunction cleanupOldCrashReports(crashDir: string): void {\n try {\n const files = readdirSync(crashDir)\n .filter(f => f.startsWith('crash-') && f.endsWith('.log'))\n .map(f => ({ name: f, path: join(crashDir, f) }))\n .sort((a, b) => b.name.localeCompare(a.name)); // Sort descending (newest first)\n\n // Remove files beyond the limit\n for (let i = MAX_CRASH_REPORTS; i < files.length; i++) {\n try {\n unlinkSync(files[i].path);\n } catch { /* ignore */ }\n }\n } catch { /* ignore */ }\n}\n\n/**\n * Rotate log file if it exceeds MAX_LOG_SIZE\n */\nfunction rotateLogIfNeeded(): void {\n const paths = getDaemonPaths();\n const logPath = paths.logFile;\n\n try {\n if (!existsSync(logPath)) return;\n\n const stats = statSync(logPath);\n if (stats.size < MAX_LOG_SIZE) return;\n\n // Rotate the log\n const timestamp = Date.now();\n const rotatedPath = `${logPath}.${timestamp}`;\n renameSync(logPath, rotatedPath);\n console.log(`[${new Date().toISOString()}] Log rotated: ${rotatedPath}`);\n\n // Cleanup old rotated logs\n cleanupOldLogs(dirname(logPath));\n } catch (err) {\n console.error(`[${new Date().toISOString()}] Log rotation error: ${err}`);\n }\n}\n\n/**\n * Remove old rotated log files, keeping only the most recent ones\n */\nfunction cleanupOldLogs(logDir: string): void {\n try {\n const files = readdirSync(logDir)\n .filter(f => f.startsWith('daemon.log.'))\n .map(f => ({ name: f, path: join(logDir, f) }))\n .sort((a, b) => b.name.localeCompare(a.name)); // Sort descending (newest first)\n\n // Remove files beyond the limit\n for (let i = MAX_LOG_FILES; i < files.length; i++) {\n try {\n unlinkSync(files[i].path);\n console.log(`[${new Date().toISOString()}] Removed old log: ${files[i].name}`);\n } catch { /* ignore */ }\n }\n } catch { /* ignore */ }\n}\n\n/**\n * Generate macOS LaunchAgent plist content\n * Note: No longer requires projectPath - daemon watches ALL registered projects\n */\nfunction generateLaunchAgentPlist(): string {\n const paths = getDaemonPaths();\n const nodePath = process.execPath;\n const aigilePath = join(dirname(dirname(import.meta.url.replace('file://', ''))), 'bin', 'aigile.js');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${DAEMON_NAME}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${aigilePath}</string>\n <string>daemon</string>\n <string>run</string>\n </array>\n <key>WorkingDirectory</key>\n <string>${homedir()}</string>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n <key>ThrottleInterval</key>\n <integer>10</integer>\n <key>StandardOutPath</key>\n <string>${paths.logFile}</string>\n <key>StandardErrorPath</key>\n <string>${paths.logFile}</string>\n</dict>\n</plist>`;\n}\n\n/**\n * Generate Linux systemd user service content\n * Note: No longer requires projectPath - daemon watches ALL registered projects\n */\nfunction generateSystemdService(): string {\n const paths = getDaemonPaths();\n const nodePath = process.execPath;\n const aigilePath = join(dirname(dirname(import.meta.url.replace('file://', ''))), 'bin', 'aigile.js');\n\n return `[Unit]\nDescription=AIGILE File Watcher Daemon\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=${nodePath} ${aigilePath} daemon run\nWorkingDirectory=${homedir()}\nRestart=on-failure\nRestartSec=10\nStartLimitIntervalSec=300\nStartLimitBurst=5\nStandardOutput=append:${paths.logFile}\nStandardError=append:${paths.logFile}\n\n[Install]\nWantedBy=default.target`;\n}\n\n// Install command - install daemon to auto-start on boot\ndaemonCommand\n .command('install')\n .description('Install daemon to start automatically on system boot (watches ALL registered projects)')\n .action(() => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n // No longer requires being in a project - daemon watches ALL projects\n\n if (PLATFORM === 'darwin') {\n // macOS LaunchAgent\n const plistDir = dirname(paths.plist!);\n if (!existsSync(plistDir)) {\n mkdirSync(plistDir, { recursive: true });\n }\n\n const plistContent = generateLaunchAgentPlist();\n writeFileSync(paths.plist!, plistContent);\n\n success('Installed macOS LaunchAgent', opts);\n info(`Plist location: ${paths.plist}`, opts);\n info('Daemon will watch ALL registered projects', opts);\n info('Run \"aigile daemon start\" to start the watcher', opts);\n\n } else if (PLATFORM === 'linux') {\n // Linux systemd user service\n const serviceDir = dirname(paths.service!);\n if (!existsSync(serviceDir)) {\n mkdirSync(serviceDir, { recursive: true });\n }\n\n const serviceContent = generateSystemdService();\n writeFileSync(paths.service!, serviceContent);\n\n // Reload systemd user daemon\n try {\n execSync('systemctl --user daemon-reload');\n execSync(`systemctl --user enable ${DAEMON_NAME}`);\n success('Installed and enabled systemd user service', opts);\n info(`Service location: ${paths.service}`, opts);\n info('Daemon will watch ALL registered projects', opts);\n info('Run \"aigile daemon start\" to start the watcher', opts);\n } catch (err) {\n warning('Service file created but could not enable. You may need to run:', opts);\n console.log(` systemctl --user daemon-reload`);\n console.log(` systemctl --user enable ${DAEMON_NAME}`);\n }\n\n } else {\n error(`Daemon installation not supported on ${PLATFORM}`, opts);\n info('You can run \"aigile daemon run\" manually instead', opts);\n process.exit(1);\n }\n });\n\n// Uninstall command - remove daemon from auto-start\ndaemonCommand\n .command('uninstall')\n .description('Remove daemon from auto-start')\n .action(() => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n // Stop daemon first\n const status = isDaemonRunning();\n if (status.running) {\n info('Stopping daemon first...', opts);\n try {\n process.kill(status.pid!, 'SIGTERM');\n } catch {\n // Ignore\n }\n }\n\n if (PLATFORM === 'darwin' && paths.plist && existsSync(paths.plist)) {\n try {\n execSync(`launchctl unload ${paths.plist}`);\n } catch {\n // Might not be loaded\n }\n unlinkSync(paths.plist);\n success('Removed macOS LaunchAgent', opts);\n\n } else if (PLATFORM === 'linux' && paths.service && existsSync(paths.service)) {\n try {\n execSync(`systemctl --user stop ${DAEMON_NAME}`);\n execSync(`systemctl --user disable ${DAEMON_NAME}`);\n } catch {\n // Might not be running\n }\n unlinkSync(paths.service);\n try {\n execSync('systemctl --user daemon-reload');\n } catch {\n // Ignore\n }\n success('Removed systemd user service', opts);\n\n } else {\n info('No daemon installation found', opts);\n }\n\n // Clean up PID file\n if (existsSync(paths.pidFile)) {\n unlinkSync(paths.pidFile);\n }\n });\n\n// Start command - start the daemon (watches ALL registered projects)\ndaemonCommand\n .command('start')\n .description('Start the file watcher daemon (watches ALL registered projects)')\n .action(() => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n const status = isDaemonRunning();\n if (status.running) {\n info(`Daemon already running (PID: ${status.pid})`, opts);\n return;\n }\n\n if (PLATFORM === 'darwin' && paths.plist && existsSync(paths.plist)) {\n try {\n execSync(`launchctl load ${paths.plist}`);\n success('Started daemon via launchctl (watching all projects)', opts);\n } catch (err) {\n error('Failed to start daemon via launchctl', opts);\n process.exit(1);\n }\n\n } else if (PLATFORM === 'linux' && paths.service && existsSync(paths.service)) {\n try {\n execSync(`systemctl --user start ${DAEMON_NAME}`);\n success('Started daemon via systemctl (watching all projects)', opts);\n } catch (err) {\n error('Failed to start daemon via systemctl', opts);\n process.exit(1);\n }\n\n } else {\n // Fallback: start as background process (no longer requires project context)\n const child = spawn(process.execPath, [process.argv[1], 'daemon', 'run'], {\n detached: true,\n stdio: 'ignore'\n });\n\n child.unref();\n\n if (child.pid) {\n // Validate process is actually running before writing PID\n try {\n process.kill(child.pid, 0);\n writeFileSync(paths.pidFile, String(child.pid));\n success(`Started daemon (PID: ${child.pid}) - watching all projects`, opts);\n } catch {\n error('Failed to start daemon - process died immediately', opts);\n process.exit(1);\n }\n } else {\n error('Failed to start daemon', opts);\n process.exit(1);\n }\n }\n });\n\n// Stop command - stop the daemon\ndaemonCommand\n .command('stop')\n .description('Stop the file watcher daemon')\n .action(() => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n if (PLATFORM === 'darwin' && paths.plist && existsSync(paths.plist)) {\n try {\n execSync(`launchctl unload ${paths.plist}`);\n success('Stopped daemon via launchctl', opts);\n } catch {\n // Might not be loaded\n info('Daemon was not running', opts);\n }\n\n } else if (PLATFORM === 'linux' && paths.service && existsSync(paths.service)) {\n try {\n execSync(`systemctl --user stop ${DAEMON_NAME}`);\n success('Stopped daemon via systemctl', opts);\n } catch {\n info('Daemon was not running', opts);\n }\n\n } else {\n const status = isDaemonRunning();\n if (status.running && status.pid) {\n try {\n process.kill(status.pid, 'SIGTERM');\n if (existsSync(paths.pidFile)) {\n unlinkSync(paths.pidFile);\n }\n success(`Stopped daemon (PID: ${status.pid})`, opts);\n } catch {\n error('Failed to stop daemon', opts);\n process.exit(1);\n }\n } else {\n info('Daemon is not running', opts);\n }\n }\n });\n\n// Status command - show daemon status for ALL projects\ndaemonCommand\n .command('status')\n .description('Show daemon status for ALL registered projects')\n .action(() => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n const status = isDaemonRunning();\n\n // Get all registered projects with their file counts\n const projects = queryAll<{\n id: string;\n key: string;\n name: string;\n path: string;\n is_default: number;\n }>('SELECT id, key, name, path, is_default FROM projects ORDER BY is_default DESC, key');\n\n // Get file counts per project\n const projectStats: Array<{\n key: string;\n name: string;\n path: string;\n valid: boolean;\n allow: number;\n unknown: number;\n total: number;\n }> = [];\n\n let totalFiles = { allow: 0, unknown: 0, total: 0 };\n\n for (const project of projects) {\n const valid = existsSync(project.path) && existsSync(join(project.path, '.aigile'));\n\n // Get category counts for this project\n const counts = queryAll<{ monitoring_category: string; count: number }>(`\n SELECT COALESCE(monitoring_category, 'unknown') as monitoring_category, COUNT(*) as count\n FROM documents\n WHERE project_id = ? AND status != 'deleted'\n GROUP BY monitoring_category\n `, [project.id]);\n\n let allow = 0;\n let unknown = 0;\n for (const row of counts) {\n if (row.monitoring_category === 'allow') allow = row.count;\n else if (row.monitoring_category === 'unknown') unknown = row.count;\n }\n\n projectStats.push({\n key: project.key,\n name: project.name,\n path: project.path,\n valid,\n allow,\n unknown,\n total: allow + unknown,\n });\n\n if (valid) {\n totalFiles.allow += allow;\n totalFiles.unknown += unknown;\n totalFiles.total += allow + unknown;\n }\n }\n\n const validCount = projectStats.filter(p => p.valid).length;\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n running: status.running,\n pid: status.pid ?? null,\n platform: PLATFORM,\n installed: PLATFORM === 'darwin'\n ? (paths.plist && existsSync(paths.plist))\n : PLATFORM === 'linux'\n ? (paths.service && existsSync(paths.service))\n : false,\n projectCount: projects.length,\n validProjectCount: validCount,\n projects: projectStats,\n totalFiles,\n paths: {\n database: getDbPath(),\n pidFile: paths.pidFile,\n logFile: paths.logFile,\n }\n }\n }));\n return;\n }\n\n console.log('\\n📊 Daemon Status\\n');\n console.log(`├── Running: ${status.running ? '✅ Yes' : '❌ No'}${status.pid ? ` (PID: ${status.pid})` : ''}`);\n console.log(`├── Platform: ${PLATFORM}`);\n\n const installed = PLATFORM === 'darwin'\n ? (paths.plist && existsSync(paths.plist))\n : PLATFORM === 'linux'\n ? (paths.service && existsSync(paths.service))\n : false;\n console.log(`├── Installed: ${installed ? '✅ Yes' : '❌ No'}`);\n\n console.log(`├── Projects: ${validCount}/${projects.length} valid`);\n\n if (projectStats.length > 0) {\n for (let i = 0; i < projectStats.length; i++) {\n const p = projectStats[i];\n const isLast = i === projectStats.length - 1;\n const prefix = isLast ? '│ └──' : '│ ├──';\n const validStr = p.valid ? '✓' : '✗';\n console.log(`${prefix} ${validStr} ${p.key}: ${p.allow} allow, ${p.unknown} unknown`);\n }\n }\n\n console.log('├── Total Files:');\n console.log(`│ ├── Allow (focus): ${totalFiles.allow}`);\n console.log(`│ └── Unknown (review): ${totalFiles.unknown}`);\n\n console.log('└── System:');\n console.log(` ├── Database: ${getDbPath()}`);\n console.log(` ├── PID File: ${paths.pidFile}`);\n console.log(` └── Log File: ${paths.logFile}`);\n console.log('');\n\n if (projectStats.some(p => !p.valid)) {\n console.log('⚠️ Some projects have invalid paths. Run \"aigile project cleanup\" to remove them.\\n');\n }\n });\n\n/**\n * Get relative time string from ISO date\n */\nfunction getRelativeTime(isoDate: string): string {\n try {\n const date = new Date(isoDate);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n\n if (diffSec < 60) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n if (diffHour < 24) return `${diffHour}h ago`;\n return `${diffDay}d ago`;\n } catch {\n return isoDate;\n }\n}\n\n// Run command - run the watcher in foreground for ALL projects\ndaemonCommand\n .command('run')\n .option('--skip-resync', 'Skip initial resync on startup')\n .description('Run the file watcher in foreground for ALL registered projects')\n .action(async (options) => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n // Set up global exception handlers FIRST (before any async work)\n process.on('uncaughtException', (err) => {\n console.error(`[${new Date().toISOString()}] FATAL: Uncaught exception:`);\n console.error(err.stack || err.message);\n writeCrashReport(err);\n // Clean up PID file before exit\n if (existsSync(paths.pidFile)) {\n try { unlinkSync(paths.pidFile); } catch { /* ignore */ }\n }\n process.exit(1); // Exit - LaunchAgent/systemd will restart\n });\n\n process.on('unhandledRejection', (reason, promise) => {\n console.error(`[${new Date().toISOString()}] FATAL: Unhandled promise rejection:`);\n console.error(reason);\n writeCrashReport(reason);\n // Clean up PID file before exit\n if (existsSync(paths.pidFile)) {\n try { unlinkSync(paths.pidFile); } catch { /* ignore */ }\n }\n process.exit(1);\n });\n\n // Rotate log if needed before we start\n rotateLogIfNeeded();\n\n // Write PID file\n writeFileSync(paths.pidFile, String(process.pid));\n\n console.log(`[${new Date().toISOString()}] Starting AIGILE daemon for all registered projects...`);\n console.log(`[${new Date().toISOString()}] PID: ${process.pid}, Node: ${process.version}, Platform: ${platform()}`);\n\n // Use DaemonManager for multi-project watching\n const manager = getDaemonManager();\n\n // Perform initial resync for all projects if requested\n if (!options.skipResync) {\n console.log(`[${new Date().toISOString()}] Performing initial resync for all projects...`);\n try {\n const results = await manager.resyncAll();\n const projectCount = Object.keys(results).length;\n console.log(`[${new Date().toISOString()}] Resync complete: ${projectCount} projects synced`);\n } catch (err) {\n console.error(`[${new Date().toISOString()}] Resync warning: ${err}`);\n // Continue anyway - live watching will pick up changes\n }\n }\n\n // Set up event handlers\n manager.on('sync', (event) => {\n const categoryStr = event.category ? ` [${event.category}]` : '';\n console.log(`[${new Date().toISOString()}] [${event.project}] Synced: ${event.type} ${event.path}${categoryStr}`);\n });\n\n manager.on('syncError', ({ project, event, error: err }) => {\n console.error(`[${new Date().toISOString()}] [${project}] Sync error: ${event.type} ${event.path} - ${err}`);\n });\n\n manager.on('watcherError', ({ project, error: err }) => {\n console.error(`[${new Date().toISOString()}] [${project}] Watcher error: ${err}`);\n });\n\n // Handle shutdown signals with timeout\n let isShuttingDown = false;\n const shutdown = async () => {\n if (isShuttingDown) return; // Prevent multiple shutdown attempts\n isShuttingDown = true;\n\n console.log(`[${new Date().toISOString()}] Shutting down...`);\n\n // Set a timeout for graceful shutdown\n const forceExitTimeout = setTimeout(() => {\n console.error(`[${new Date().toISOString()}] Shutdown timeout (${SHUTDOWN_TIMEOUT_MS}ms) - forcing exit`);\n if (existsSync(paths.pidFile)) {\n try { unlinkSync(paths.pidFile); } catch { /* ignore */ }\n }\n process.exit(1);\n }, SHUTDOWN_TIMEOUT_MS);\n\n try {\n await manager.stop();\n } catch (err) {\n console.error(`[${new Date().toISOString()}] Error during shutdown: ${err}`);\n }\n\n clearTimeout(forceExitTimeout);\n if (existsSync(paths.pidFile)) {\n unlinkSync(paths.pidFile);\n }\n console.log(`[${new Date().toISOString()}] Daemon stopped gracefully`);\n process.exit(0);\n };\n\n process.on('SIGTERM', shutdown);\n process.on('SIGINT', shutdown);\n\n // Set up periodic log rotation check (every hour)\n const logRotationInterval = setInterval(() => {\n rotateLogIfNeeded();\n }, 60 * 60 * 1000); // 1 hour\n\n // Clean up interval on shutdown\n process.on('exit', () => {\n clearInterval(logRotationInterval);\n });\n\n // Start watching all projects\n try {\n const status = await manager.start();\n console.log(`[${new Date().toISOString()}] Daemon started - watching ${status.watchingCount} projects`);\n for (const p of status.projects) {\n if (p.watching) {\n console.log(`[${new Date().toISOString()}] ✓ ${p.key}: ${p.path}`);\n }\n }\n } catch (err) {\n console.error(`[${new Date().toISOString()}] Failed to start daemon: ${err}`);\n if (existsSync(paths.pidFile)) {\n unlinkSync(paths.pidFile);\n }\n process.exit(1);\n }\n });\n\n// Logs command - show recent logs\ndaemonCommand\n .command('logs')\n .option('-n, --lines <number>', 'Number of lines to show', '50')\n .option('-f, --follow', 'Follow log output')\n .description('Show daemon logs')\n .action((options) => {\n const opts = getOutputOptions(daemonCommand);\n const paths = getDaemonPaths();\n\n if (!existsSync(paths.logFile)) {\n info('No log file found. Daemon may not have run yet.', opts);\n return;\n }\n\n if (options.follow) {\n // Use tail -f\n const tail = spawn('tail', ['-f', paths.logFile], {\n stdio: 'inherit'\n });\n\n process.on('SIGINT', () => {\n tail.kill();\n process.exit(0);\n });\n } else {\n // Show last N lines\n try {\n const output = execSync(`tail -n ${options.lines} \"${paths.logFile}\"`, { encoding: 'utf-8' });\n console.log(output);\n } catch {\n error('Failed to read log file', opts);\n }\n }\n });\n\n// Resync command - perform full resync of ALL projects\ndaemonCommand\n .command('resync')\n .option('--project <key>', 'Resync only a specific project')\n .description('Perform a full resync of all files for all registered projects')\n .action(async (options) => {\n const opts = getOutputOptions(daemonCommand);\n const manager = getDaemonManager();\n\n if (options.project) {\n // Resync specific project\n info(`Resyncing project ${options.project}...`, opts);\n\n try {\n const result = await manager.resyncProject(options.project);\n if (!result) {\n error(`Project \"${options.project}\" not found or invalid.`, opts);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n project: options.project,\n ...result,\n }\n }));\n } else {\n success(`Resync complete for ${options.project}:`, opts);\n console.log(` Allow: ${result.allow}`);\n console.log(` Deny: ${result.deny}`);\n console.log(` Unknown: ${result.unknown}`);\n }\n } catch (err) {\n error(`Resync failed: ${err}`, opts);\n process.exit(1);\n }\n return;\n }\n\n // Resync ALL projects\n info('Resyncing all registered projects...', opts);\n info('This may take a while for large repositories.', opts);\n\n try {\n const results = await manager.resyncAll();\n const projectKeys = Object.keys(results);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n projectCount: projectKeys.length,\n projects: results,\n }\n }));\n } else {\n success(`Resync complete: ${projectKeys.length} projects`, opts);\n for (const [key, result] of Object.entries(results)) {\n console.log(` ${key}: ${result.allow} allow, ${result.unknown} unknown`);\n }\n }\n } catch (err) {\n error(`Resync failed: ${err}`, opts);\n process.exit(1);\n }\n });\n\n// Review command - review unknown files\ndaemonCommand\n .command('review')\n .option('--list', 'Just list unknown files without interactive review')\n .option('--auto', 'Auto-suggest category based on extension')\n .description('Review and classify unknown files')\n .action((options) => {\n const opts = getOutputOptions(daemonCommand);\n\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n process.exit(1);\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n process.exit(1);\n }\n\n const project = queryOne<{ id: string }>('SELECT id FROM projects WHERE key = ?', [config.project.key]);\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n process.exit(1);\n }\n\n // Get unknown files\n const unknownFiles = queryAll<{\n id: string;\n path: string;\n extension: string;\n size_bytes: number;\n updated_at: string;\n }>(`\n SELECT id, path, extension, size_bytes, updated_at\n FROM documents\n WHERE project_id = ? AND monitoring_category = 'unknown' AND status != 'deleted'\n ORDER BY path\n `, [project.id]);\n\n if (unknownFiles.length === 0) {\n success('No unknown files to review! All files are classified.', opts);\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n count: unknownFiles.length,\n files: unknownFiles,\n }\n }));\n return;\n }\n\n if (options.list) {\n // Just list the files\n console.log(`\\n📋 Unknown Files (${unknownFiles.length} total)\\n`);\n data(\n unknownFiles.map(f => ({\n path: f.path,\n extension: f.extension || '-',\n size: formatBytes(f.size_bytes),\n updated: getRelativeTime(f.updated_at),\n })),\n [\n { header: 'Path', key: 'path', width: 60 },\n { header: 'Ext', key: 'extension', width: 8 },\n { header: 'Size', key: 'size', width: 10 },\n { header: 'Updated', key: 'updated', width: 12 },\n ],\n opts\n );\n console.log('\\nUse \"aigile daemon allow <pattern>\" or \"aigile daemon deny <pattern>\" to classify files.');\n return;\n }\n\n // Interactive or auto mode would require readline\n // For now, just show the list with suggestions\n console.log(`\\n📋 Unknown Files (${unknownFiles.length} total)\\n`);\n console.log('Run \"aigile daemon review --list\" to see all files.');\n console.log('Use \"aigile daemon allow <pattern>\" or \"aigile daemon deny <pattern>\" to classify.\\n');\n\n // Show sample\n const sample = unknownFiles.slice(0, 10);\n for (const file of sample) {\n console.log(` ${file.path} (.${file.extension || 'no ext'})`);\n }\n if (unknownFiles.length > 10) {\n console.log(` ... and ${unknownFiles.length - 10} more files`);\n }\n });\n\n/**\n * Format bytes to human readable\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`;\n}\n","/**\n * Daemon Manager Service\n *\n * Orchestrates multiple FileWatcher instances to monitor ALL registered projects.\n * Provides a unified interface for managing the daemon across projects.\n *\n * @author Vladimir K.S.\n */\n\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { EventEmitter } from 'events';\nimport { FileWatcher, WatcherConfig, WatcherStats } from './file-watcher.js';\nimport { scanDirectory, syncFilesToDatabase, getSyncStatus } from './file-scanner.js';\nimport { queryAll } from '../db/connection.js';\n\n/**\n * Scan results from file scanner\n */\nexport interface ScanResults {\n total: number;\n new: number;\n modified: number;\n deleted: number;\n unchanged: number;\n allow: number;\n deny: number;\n unknown: number;\n}\n\n/**\n * Project record from database\n */\nexport interface Project {\n id: string;\n key: string;\n name: string;\n path: string;\n is_default: number;\n}\n\n/**\n * Per-project status\n */\nexport interface ProjectStatus {\n key: string;\n name: string;\n path: string;\n valid: boolean;\n watching: boolean;\n stats: WatcherStats | null;\n}\n\n/**\n * Overall daemon status\n */\nexport interface DaemonStatus {\n running: boolean;\n projectCount: number;\n watchingCount: number;\n projects: ProjectStatus[];\n totalFiles: {\n allow: number;\n deny: number;\n unknown: number;\n };\n}\n\n// Constants for watcher retry logic\nconst MAX_WATCHER_RETRIES = 3;\nconst INITIAL_RETRY_DELAY_MS = 5000; // 5 seconds\n\n/**\n * Daemon Manager - manages multiple FileWatcher instances\n */\nexport class DaemonManager extends EventEmitter {\n private watchers: Map<string, FileWatcher> = new Map();\n private watcherRetries: Map<string, number> = new Map();\n private running: boolean = false;\n private startedAt: Date | null = null;\n\n /**\n * Start watching all registered projects\n */\n async start(): Promise<DaemonStatus> {\n if (this.running) {\n throw new Error('Daemon is already running');\n }\n\n const projects = await this.getActiveProjects();\n\n if (projects.length === 0) {\n console.log('No valid projects to watch. Register projects with \"aigile init\".');\n this.running = true;\n this.startedAt = new Date();\n return this.getStatus();\n }\n\n console.log(`Starting watchers for ${projects.length} project(s)...`);\n\n for (const project of projects) {\n await this.startWatcherWithRetry(project);\n }\n\n this.running = true;\n this.startedAt = new Date();\n this.emit('started', { projectCount: this.watchers.size });\n\n return this.getStatus();\n }\n\n /**\n * Start a watcher for a project with automatic retry on failure\n */\n private async startWatcherWithRetry(project: Project): Promise<void> {\n const retryCount = this.watcherRetries.get(project.key) ?? 0;\n\n try {\n const config: WatcherConfig = {\n projectId: project.id,\n projectPath: project.path,\n trackUnknown: true,\n };\n\n const watcher = new FileWatcher(config);\n\n // Forward events\n watcher.on('sync', (event) => {\n this.emit('sync', { project: project.key, ...event });\n });\n\n watcher.on('syncError', (data) => {\n this.emit('syncError', { project: project.key, ...data });\n });\n\n // Handle watcher errors with auto-recovery\n watcher.on('error', async (err) => {\n console.error(`[${new Date().toISOString()}] [${project.key}] Watcher error: ${err}`);\n this.emit('watcherError', { project: project.key, error: err });\n\n // Stop the failed watcher\n try {\n await watcher.stop();\n } catch { /* ignore */ }\n this.watchers.delete(project.key);\n\n // Attempt restart with retry logic\n const currentRetries = this.watcherRetries.get(project.key) ?? 0;\n if (currentRetries < MAX_WATCHER_RETRIES) {\n this.watcherRetries.set(project.key, currentRetries + 1);\n const delay = INITIAL_RETRY_DELAY_MS * Math.pow(2, currentRetries); // Exponential backoff\n console.log(`[${new Date().toISOString()}] [${project.key}] Will retry in ${delay}ms (attempt ${currentRetries + 1}/${MAX_WATCHER_RETRIES})`);\n\n setTimeout(async () => {\n if (this.running) {\n console.log(`[${new Date().toISOString()}] [${project.key}] Attempting restart...`);\n await this.startWatcherWithRetry(project);\n }\n }, delay);\n } else {\n console.error(`[${new Date().toISOString()}] [${project.key}] Max retries (${MAX_WATCHER_RETRIES}) exceeded - watcher disabled`);\n this.emit('watcherDisabled', { project: project.key });\n }\n });\n\n watcher.start();\n this.watchers.set(project.key, watcher);\n this.watcherRetries.set(project.key, 0); // Reset retry count on success\n console.log(` ✓ ${project.key}: ${project.path}`);\n } catch (error) {\n console.error(` ✗ ${project.key}: Failed to start watcher - ${error}`);\n this.emit('watcherError', { project: project.key, error });\n\n // Schedule retry on startup failure\n if (retryCount < MAX_WATCHER_RETRIES) {\n this.watcherRetries.set(project.key, retryCount + 1);\n const delay = INITIAL_RETRY_DELAY_MS * Math.pow(2, retryCount);\n console.log(`[${new Date().toISOString()}] [${project.key}] Will retry in ${delay}ms (attempt ${retryCount + 1}/${MAX_WATCHER_RETRIES})`);\n\n setTimeout(async () => {\n if (this.running) {\n await this.startWatcherWithRetry(project);\n }\n }, delay);\n }\n }\n }\n\n /**\n * Stop all watchers\n */\n async stop(): Promise<void> {\n if (!this.running) {\n return;\n }\n\n console.log('Stopping all watchers...');\n\n for (const [key, watcher] of this.watchers) {\n try {\n await watcher.stop();\n console.log(` ✓ Stopped: ${key}`);\n } catch (error) {\n console.error(` ✗ Error stopping ${key}: ${error}`);\n }\n }\n\n this.watchers.clear();\n this.running = false;\n this.startedAt = null;\n this.emit('stopped');\n }\n\n /**\n * Resync all projects\n */\n async resyncAll(): Promise<Record<string, ScanResults>> {\n const results: Record<string, ScanResults> = {};\n const projects = await this.getActiveProjects();\n\n console.log(`Resyncing ${projects.length} project(s)...`);\n\n for (const project of projects) {\n try {\n // Scan all files\n const files = scanDirectory(project.path);\n\n // Sync to database\n const syncResult = syncFilesToDatabase(project.id, project.path, files);\n\n // Get category counts\n const status = getSyncStatus(project.id);\n\n const result: ScanResults = {\n total: syncResult.total,\n new: syncResult.new,\n modified: syncResult.modified,\n deleted: syncResult.deleted,\n unchanged: syncResult.unchanged,\n allow: status.byCategory.allow,\n deny: status.byCategory.deny,\n unknown: status.byCategory.unknown,\n };\n\n results[project.key] = result;\n console.log(` ✓ ${project.key}: ${result.allow} allow, ${result.unknown} unknown`);\n } catch (error) {\n console.error(` ✗ ${project.key}: Resync failed - ${error}`);\n }\n }\n\n return results;\n }\n\n /**\n * Resync a specific project\n */\n async resyncProject(key: string): Promise<ScanResults | null> {\n const projects = await this.getActiveProjects();\n const project = projects.find(p => p.key === key);\n\n if (!project) {\n throw new Error(`Project \"${key}\" not found or invalid`);\n }\n\n // Scan all files\n const files = scanDirectory(project.path);\n\n // Sync to database\n const syncResult = syncFilesToDatabase(project.id, project.path, files);\n\n // Get category counts\n const status = getSyncStatus(project.id);\n\n return {\n total: syncResult.total,\n new: syncResult.new,\n modified: syncResult.modified,\n deleted: syncResult.deleted,\n unchanged: syncResult.unchanged,\n allow: status.byCategory.allow,\n deny: status.byCategory.deny,\n unknown: status.byCategory.unknown,\n };\n }\n\n /**\n * Get daemon status\n */\n getStatus(): DaemonStatus {\n const projectStatuses: ProjectStatus[] = [];\n const totalFiles = { allow: 0, deny: 0, unknown: 0 };\n\n // Get all registered projects\n const allProjects = queryAll<Project>('SELECT * FROM projects ORDER BY key');\n\n for (const project of allProjects) {\n const valid = this.isValidProject(project.path);\n const watcher = this.watchers.get(project.key);\n const stats = watcher?.getStats() ?? null;\n\n if (stats) {\n totalFiles.allow += stats.categoryCounts.allow;\n totalFiles.deny += stats.categoryCounts.deny;\n totalFiles.unknown += stats.categoryCounts.unknown;\n }\n\n projectStatuses.push({\n key: project.key,\n name: project.name,\n path: project.path,\n valid,\n watching: watcher !== undefined,\n stats,\n });\n }\n\n return {\n running: this.running,\n projectCount: allProjects.length,\n watchingCount: this.watchers.size,\n projects: projectStatuses,\n totalFiles,\n };\n }\n\n /**\n * Check if daemon is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get uptime in milliseconds\n */\n getUptime(): number {\n if (!this.startedAt) {\n return 0;\n }\n return Date.now() - this.startedAt.getTime();\n }\n\n /**\n * Get all valid registered projects\n */\n private async getActiveProjects(): Promise<Project[]> {\n const projects = queryAll<Project>('SELECT * FROM projects ORDER BY key');\n return projects.filter(p => this.isValidProject(p.path));\n }\n\n /**\n * Check if a project path is valid\n */\n private isValidProject(path: string): boolean {\n return existsSync(path) && existsSync(join(path, '.aigile'));\n }\n}\n\n/**\n * Singleton instance for the daemon process\n */\nlet daemonManagerInstance: DaemonManager | null = null;\n\n/**\n * Get or create the daemon manager instance\n */\nexport function getDaemonManager(): DaemonManager {\n if (!daemonManagerInstance) {\n daemonManagerInstance = new DaemonManager();\n }\n return daemonManagerInstance;\n}\n\n/**\n * Reset the daemon manager instance (for testing)\n */\nexport function resetDaemonManager(): void {\n daemonManagerInstance = null;\n}\n","/**\n * File Watcher Service\n *\n * Watches repository files for changes and automatically syncs\n * to the AIGILE database. Uses chokidar for cross-platform file watching.\n *\n * Implements Tri-State Monitoring:\n * - ALLOW: Focus files - fully tracked + parsed\n * - DENY: Ignored files - skip entirely\n * - UNKNOWN: Unclassified files - tracked minimally, flagged for review\n *\n * @author Vladimir K.S.\n */\n\nimport { watch, FSWatcher } from 'chokidar';\nimport { join, relative, extname, basename } from 'path';\nimport { existsSync, readFileSync, statSync } from 'fs';\nimport { EventEmitter } from 'events';\nimport { queryOne, queryAll, run, generateId } from '../db/connection.js';\nimport { computeFileHash } from './file-scanner.js';\nimport { parseFrontmatterFromFile, FrontmatterMetadata } from './frontmatter-parser.js';\nimport {\n getHardIgnorePatterns,\n getDefaultAllowPatterns,\n getDefaultDenyPatterns,\n isBinaryExtension,\n type MonitoringCategory,\n} from '../config/monitoring-patterns.js';\nimport { loadIgnorePatterns, loadAllowPatterns } from '../utils/config.js';\nimport picomatch from 'picomatch';\n\nexport interface WatcherConfig {\n projectId: string;\n projectPath: string;\n patterns?: string[];\n ignore?: string[];\n useGitignore?: boolean;\n debounceMs?: number;\n trackUnknown?: boolean;\n}\n\nexport interface WatchEvent {\n type: 'add' | 'change' | 'unlink';\n path: string;\n timestamp: Date;\n category?: MonitoringCategory;\n}\n\nexport interface WatcherStats {\n isRunning: boolean;\n startedAt: Date | null;\n filesWatched: number;\n eventsProcessed: number;\n lastEvent: WatchEvent | null;\n categoryCounts: {\n allow: number;\n deny: number;\n unknown: number;\n };\n}\n\n/**\n * File Watcher Service - watches for file changes and syncs to database\n */\nexport class FileWatcher extends EventEmitter {\n private watcher: FSWatcher | null = null;\n private config: WatcherConfig;\n private stats: WatcherStats;\n private debounceTimers: Map<string, NodeJS.Timeout> = new Map();\n\n // Tri-state pattern matchers\n private allowMatcher: picomatch.Matcher | null = null;\n private denyMatcher: picomatch.Matcher | null = null;\n private hardIgnoreMatcher: picomatch.Matcher | null = null;\n\n constructor(config: WatcherConfig) {\n super();\n\n // Load patterns from project config if available\n const projectAllowPatterns = config.patterns ?? loadAllowPatterns(config.projectPath);\n const projectDenyPatterns = config.ignore ?? loadIgnorePatterns(config.projectPath);\n\n this.config = {\n patterns: projectAllowPatterns.length > 0 ? projectAllowPatterns : getDefaultAllowPatterns(),\n ignore: projectDenyPatterns.length > 0 ? projectDenyPatterns : getDefaultDenyPatterns(),\n useGitignore: false, // Changed: don't use gitignore by default\n debounceMs: 300,\n trackUnknown: true,\n ...config,\n };\n\n this.stats = {\n isRunning: false,\n startedAt: null,\n filesWatched: 0,\n eventsProcessed: 0,\n lastEvent: null,\n categoryCounts: {\n allow: 0,\n deny: 0,\n unknown: 0,\n },\n };\n\n // Initialize pattern matchers for tri-state classification\n this.initializeMatchers();\n }\n\n /**\n * Initialize picomatch matchers for tri-state classification\n */\n private initializeMatchers(): void {\n // Hard ignores (always ignored, no override)\n this.hardIgnoreMatcher = picomatch(getHardIgnorePatterns());\n\n // Allow patterns (focus files)\n this.allowMatcher = picomatch(this.config.patterns!);\n\n // Deny patterns (soft ignores, from .aigile/ignore or defaults)\n this.denyMatcher = picomatch(this.config.ignore!);\n }\n\n /**\n * Classify a file into allow/deny/unknown category\n */\n classifyFile(relativePath: string): MonitoringCategory {\n // Hard ignores always take precedence\n if (this.hardIgnoreMatcher && this.hardIgnoreMatcher(relativePath)) {\n return 'deny';\n }\n\n // Check allow patterns first (focus files)\n if (this.allowMatcher && this.allowMatcher(relativePath)) {\n return 'allow';\n }\n\n // Check deny patterns (soft ignores)\n if (this.denyMatcher && this.denyMatcher(relativePath)) {\n return 'deny';\n }\n\n // File doesn't match either list - unknown (needs review)\n return 'unknown';\n }\n\n /**\n * Start watching for file changes\n */\n start(): void {\n if (this.watcher) {\n return; // Already running\n }\n\n // Watch all files in project, use internal classification for processing\n // Only hard ignores are passed to chokidar for efficiency\n this.watcher = watch(this.config.projectPath, {\n ignored: getHardIgnorePatterns(),\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 200,\n pollInterval: 100,\n },\n // Watch all directories but we'll filter files during processing\n depth: Infinity,\n });\n\n this.watcher.on('add', (path) => this.handleFileEvent('add', path));\n this.watcher.on('change', (path) => this.handleFileEvent('change', path));\n this.watcher.on('unlink', (path) => this.handleFileEvent('unlink', path));\n this.watcher.on('error', (error) => this.emit('error', error));\n\n this.watcher.on('ready', () => {\n this.stats.isRunning = true;\n this.stats.startedAt = new Date();\n this.stats.filesWatched = this.getWatchedFilesCount();\n this.updateCategoryCounts();\n this.emit('ready', this.stats);\n });\n }\n\n /**\n * Update category counts from database\n * This is best-effort - if DB isn't ready, we'll get counts later\n */\n private updateCategoryCounts(): void {\n // Skip if called before database is ready (can happen during startup)\n // The counts will be updated on the next file event\n try {\n const counts = queryAll<{ monitoring_category: string; count: number }>(`\n SELECT monitoring_category, COUNT(*) as count\n FROM documents\n WHERE project_id = ? AND status != 'deleted'\n GROUP BY monitoring_category\n `, [this.config.projectId]);\n\n this.stats.categoryCounts = { allow: 0, deny: 0, unknown: 0 };\n for (const row of counts) {\n const cat = row.monitoring_category as MonitoringCategory;\n if (cat in this.stats.categoryCounts) {\n this.stats.categoryCounts[cat] = row.count;\n }\n }\n } catch {\n // Silently ignore - database might not be ready yet\n // This is expected during daemon startup race conditions\n }\n }\n\n /**\n * Stop watching for file changes\n */\n async stop(): Promise<void> {\n if (!this.watcher) {\n return;\n }\n\n // Clear all debounce timers\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n\n await this.watcher.close();\n this.watcher = null;\n this.stats.isRunning = false;\n this.emit('stopped');\n }\n\n /**\n * Get current watcher statistics\n */\n getStats(): WatcherStats {\n return { ...this.stats };\n }\n\n /**\n * Get the project path being watched\n */\n getProjectPath(): string {\n return this.config.projectPath;\n }\n\n /**\n * Get the project ID\n */\n getProjectId(): string {\n return this.config.projectId;\n }\n\n /**\n * Handle a file event with debouncing\n */\n private handleFileEvent(type: 'add' | 'change' | 'unlink', absolutePath: string): void {\n // Clear existing debounce timer for this path\n const existingTimer = this.debounceTimers.get(absolutePath);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set new debounce timer\n const timer = setTimeout(() => {\n this.debounceTimers.delete(absolutePath);\n this.processFileEvent(type, absolutePath);\n }, this.config.debounceMs);\n\n this.debounceTimers.set(absolutePath, timer);\n }\n\n /**\n * Process a file event (after debounce)\n */\n private processFileEvent(type: 'add' | 'change' | 'unlink', absolutePath: string): void {\n const relativePath = relative(this.config.projectPath, absolutePath);\n\n // Classify the file\n const category = this.classifyFile(relativePath);\n\n // Skip deny files entirely (except for tracking deletions of previously tracked files)\n if (category === 'deny' && type !== 'unlink') {\n return;\n }\n\n // Skip unknown files if trackUnknown is disabled\n if (category === 'unknown' && !this.config.trackUnknown && type !== 'unlink') {\n return;\n }\n\n const event: WatchEvent = {\n type,\n path: relativePath,\n timestamp: new Date(),\n category,\n };\n\n this.stats.lastEvent = event;\n this.stats.eventsProcessed++;\n\n try {\n switch (type) {\n case 'add':\n this.syncFileAdd(absolutePath, relativePath, category);\n break;\n case 'change':\n this.syncFileChange(absolutePath, relativePath, category);\n break;\n case 'unlink':\n this.syncFileDelete(relativePath);\n break;\n }\n\n this.emit('sync', event);\n } catch (error) {\n this.emit('syncError', { event, error });\n }\n }\n\n /**\n * Sync a new file to the database\n */\n private syncFileAdd(absolutePath: string, relativePath: string, category: MonitoringCategory): void {\n const ext = extname(relativePath).slice(1);\n const filename = basename(relativePath);\n const isBinary = isBinaryExtension(ext);\n\n try {\n const stats = statSync(absolutePath);\n\n // For unknown/binary files, minimal tracking (no hash for large binaries)\n const shouldComputeHash = category === 'allow' || (!isBinary && stats.size < 10 * 1024 * 1024); // 10MB limit\n const hash = shouldComputeHash ? computeFileHash(absolutePath) : null;\n\n // Parse frontmatter only for allow category markdown files\n let hasFrontmatter = false;\n let frontmatterRaw: string | null = null;\n let metadata: FrontmatterMetadata | null = null;\n\n if (category === 'allow' && (ext === 'md' || ext === 'markdown') && !isBinary) {\n const parsed = parseFrontmatterFromFile(absolutePath);\n if (parsed) {\n hasFrontmatter = true;\n frontmatterRaw = parsed.raw;\n metadata = parsed.metadata;\n }\n }\n\n // Check if document already exists\n const existing = queryOne<{ id: string }>(\n 'SELECT id FROM documents WHERE project_id = ? AND path = ?',\n [this.config.projectId, relativePath]\n );\n\n if (existing) {\n // Update existing\n this.updateDocument(existing.id, hash, stats.size, hasFrontmatter, frontmatterRaw, metadata, category);\n } else {\n // Insert new\n this.insertDocument(relativePath, filename, ext, hash, stats.size, hasFrontmatter, frontmatterRaw, metadata, category);\n }\n } catch (err) {\n // Re-throw database errors - they indicate a real problem\n // Only silently ignore file system errors (file deleted during processing)\n const errMsg = err instanceof Error ? err.message : String(err);\n if (errMsg.includes('Database') || errMsg.includes('database')) {\n throw err;\n }\n // Log unexpected errors for debugging\n console.error(`[${new Date().toISOString()}] syncFileAdd error for ${relativePath}: ${errMsg}`);\n }\n }\n\n /**\n * Sync a changed file to the database\n */\n private syncFileChange(absolutePath: string, relativePath: string, category: MonitoringCategory): void {\n // Same logic as add - upsert behavior\n this.syncFileAdd(absolutePath, relativePath, category);\n }\n\n /**\n * Mark a file as deleted in the database\n */\n private syncFileDelete(relativePath: string): void {\n const doc = queryOne<{ id: string }>(\n 'SELECT id FROM documents WHERE project_id = ? AND path = ?',\n [this.config.projectId, relativePath]\n );\n\n if (doc) {\n run(\n `UPDATE documents SET status = 'deleted', updated_at = datetime('now') WHERE id = ?`,\n [doc.id]\n );\n }\n }\n\n /**\n * Insert a new document into the database\n */\n private insertDocument(\n path: string,\n filename: string,\n extension: string,\n hash: string | null,\n size: number,\n hasFrontmatter: boolean,\n frontmatterRaw: string | null,\n metadata: FrontmatterMetadata | null,\n category: MonitoringCategory\n ): void {\n const now = new Date().toISOString();\n const needsReview = category === 'unknown' ? 1 : 0;\n\n run(\n `INSERT INTO documents (\n id, project_id, path, filename, extension, content_hash, size_bytes, status, last_scanned_at,\n has_frontmatter, frontmatter_raw, meta_status, meta_version, meta_tldr, meta_title,\n meta_modules, meta_dependencies, meta_code_refs, meta_authors,\n monitoring_category, needs_review\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'tracked', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n generateId(),\n this.config.projectId,\n path,\n filename,\n extension,\n hash,\n size,\n now,\n hasFrontmatter ? 1 : 0,\n frontmatterRaw,\n metadata?.status ?? null,\n metadata?.version ?? null,\n metadata?.tldr ?? null,\n metadata?.title ?? null,\n metadata?.modules ? JSON.stringify(metadata.modules) : null,\n metadata?.dependencies ? JSON.stringify(metadata.dependencies) : null,\n metadata?.code_refs ? JSON.stringify(metadata.code_refs) : null,\n metadata?.authors ? JSON.stringify(metadata.authors) : null,\n category,\n needsReview,\n ]\n );\n }\n\n /**\n * Update an existing document in the database\n */\n private updateDocument(\n id: string,\n hash: string | null,\n size: number,\n hasFrontmatter: boolean,\n frontmatterRaw: string | null,\n metadata: FrontmatterMetadata | null,\n category: MonitoringCategory\n ): void {\n const now = new Date().toISOString();\n\n run(\n `UPDATE documents SET\n content_hash = COALESCE(?, content_hash), size_bytes = ?, status = 'tracked', last_scanned_at = ?, updated_at = datetime('now'),\n has_frontmatter = ?, frontmatter_raw = ?, meta_status = ?, meta_version = ?, meta_tldr = ?, meta_title = ?,\n meta_modules = ?, meta_dependencies = ?, meta_code_refs = ?, meta_authors = ?,\n monitoring_category = ?\n WHERE id = ?`,\n [\n hash,\n size,\n now,\n hasFrontmatter ? 1 : 0,\n frontmatterRaw,\n metadata?.status ?? null,\n metadata?.version ?? null,\n metadata?.tldr ?? null,\n metadata?.title ?? null,\n metadata?.modules ? JSON.stringify(metadata.modules) : null,\n metadata?.dependencies ? JSON.stringify(metadata.dependencies) : null,\n metadata?.code_refs ? JSON.stringify(metadata.code_refs) : null,\n metadata?.authors ? JSON.stringify(metadata.authors) : null,\n category,\n id,\n ]\n );\n }\n\n /**\n * Get count of watched files (approximate)\n */\n private getWatchedFilesCount(): number {\n if (!this.watcher) {\n return 0;\n }\n const watched = this.watcher.getWatched();\n let count = 0;\n for (const dir of Object.keys(watched)) {\n count += watched[dir].length;\n }\n return count;\n }\n}\n\n/**\n * Parse a .gitignore file and convert patterns to chokidar-compatible format\n */\nexport function parseGitignore(gitignorePath: string): string[] {\n try {\n const content = readFileSync(gitignorePath, 'utf-8');\n const patterns: string[] = [];\n\n for (let line of content.split('\\n')) {\n line = line.trim();\n\n // Skip empty lines and comments\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n // Handle negation (not fully supported, skip for now)\n if (line.startsWith('!')) {\n continue;\n }\n\n // Convert gitignore patterns to glob patterns\n let pattern = line;\n\n // Remove leading slash (means relative to repo root)\n if (pattern.startsWith('/')) {\n pattern = pattern.slice(1);\n }\n\n // Add ** prefix for patterns that should match anywhere\n if (!pattern.startsWith('**/') && !pattern.includes('/')) {\n pattern = `**/${pattern}`;\n }\n\n // Add trailing /** for directory patterns\n if (pattern.endsWith('/')) {\n pattern = pattern.slice(0, -1) + '/**';\n }\n\n patterns.push(pattern);\n }\n\n return patterns;\n } catch {\n return [];\n }\n}\n\n/**\n * Create a watcher instance (factory function)\n */\nexport function createFileWatcher(config: WatcherConfig): FileWatcher {\n return new FileWatcher(config);\n}\n","/**\n * File Command\n *\n * Shadow mode file analysis and management.\n * For brownfield projects where files cannot be modified.\n *\n * @author Vladimir K.S.\n */\n\nimport { Command } from 'commander';\nimport { readFileSync, existsSync } from 'fs';\nimport { join, relative } from 'path';\nimport { queryOne } from '../db/connection.js';\nimport {\n success,\n error,\n info,\n data,\n details,\n getOutputOptions,\n type OutputOptions\n} from '../services/output-formatter.js';\nimport { findProjectRoot, loadProjectConfig } from '../utils/config.js';\nimport {\n getUnanalyzedDocuments,\n getUnanalyzedCount,\n getAnalyzedDocuments,\n getLowConfidenceDocuments,\n getDocumentsByInferredModule,\n getDocumentsByFileType,\n getDocumentWithAnalysis,\n updateDocumentAnalysis,\n getAnalysisProgress,\n getShadowDocuments,\n trackShadowFile,\n type DocumentWithAnalysis,\n type AnalysisMetadata\n} from '../services/file-scanner.js';\n\nexport const fileCommand = new Command('file')\n .description('Shadow mode file analysis and management for brownfield projects');\n\n/**\n * Helper to get project context\n */\nfunction getProjectContext(opts: OutputOptions): {\n projectId: string;\n projectRoot: string;\n projectKey: string;\n} | null {\n const projectRoot = findProjectRoot();\n if (!projectRoot) {\n error('Not in an AIGILE project. Run \"aigile init\" first.', opts);\n return null;\n }\n\n const config = loadProjectConfig(projectRoot);\n if (!config) {\n error('Could not load project config.', opts);\n return null;\n }\n\n const project = queryOne<{ id: string }>(\n 'SELECT id FROM projects WHERE key = ?',\n [config.project.key]\n );\n if (!project) {\n error(`Project \"${config.project.key}\" not found in database.`, opts);\n return null;\n }\n\n return { projectId: project.id, projectRoot, projectKey: config.project.key };\n}\n\n/**\n * Format document for table display\n */\nfunction formatDocForTable(doc: DocumentWithAnalysis): Record<string, unknown> {\n return {\n path: doc.path,\n module: doc.inferred_module ?? '-',\n type: doc.file_type ?? doc.extension ?? '-',\n analyzed: doc.analyzed_at ? 'Yes' : 'No',\n confidence: doc.analysis_confidence ?? '-',\n tldr: doc.meta_tldr ? (doc.meta_tldr.length > 40 ? doc.meta_tldr.slice(0, 37) + '...' : doc.meta_tldr) : '-'\n };\n}\n\n// ============================================\n// ANALYZE command - Add analysis metadata\n// ============================================\nfileCommand\n .command('analyze <path>')\n .option('--tldr <tldr>', 'One-line summary of file purpose')\n .option('--module <module>', 'Module this file belongs to')\n .option('--component <component>', 'Component within module')\n .option('--type <type>', 'File type: component|service|util|config|test|doc|style|data')\n .option('--deps <deps>', 'Dependencies (comma-separated)')\n .option('--exports <exports>', 'Exported functions/classes (comma-separated)')\n .option('--complexity <n>', 'Complexity score (1-10)', parseInt)\n .option('--confidence <n>', 'AI confidence in analysis (0-100)', parseInt)\n .option('--notes <notes>', 'Additional analysis notes')\n .description('Add analysis metadata to a tracked file (shadow mode)')\n .action((filePath: string, options) => {\n const opts = getOutputOptions(fileCommand);\n const ctx = getProjectContext(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n // Normalize path (ensure it's relative)\n const normalizedPath = filePath.startsWith('/')\n ? relative(ctx.projectRoot, filePath)\n : filePath;\n\n // Check if file exists in database\n const doc = getDocumentWithAnalysis(ctx.projectId, normalizedPath);\n if (!doc) {\n // Try to track it as shadow file first\n const tracked = trackShadowFile(ctx.projectId, ctx.projectRoot, normalizedPath);\n if (!tracked) {\n error(`File not tracked. Run \"aigile sync scan\" or track with \"aigile file track ${normalizedPath}\"`, opts);\n process.exit(1);\n }\n }\n\n // Build analysis metadata\n const analysis: AnalysisMetadata = {};\n\n if (options.tldr) analysis.tldr = options.tldr;\n if (options.module) analysis.module = options.module;\n if (options.component) analysis.component = options.component;\n if (options.type) analysis.fileType = options.type;\n if (options.deps) analysis.dependencies = options.deps.split(',').map((s: string) => s.trim());\n if (options.exports) analysis.exports = options.exports.split(',').map((s: string) => s.trim());\n if (options.complexity) analysis.complexity = options.complexity;\n if (options.confidence) analysis.confidence = options.confidence;\n if (options.notes) analysis.notes = options.notes;\n\n if (Object.keys(analysis).length === 0) {\n error('No analysis options provided. Use --tldr, --module, --type, etc.', opts);\n process.exit(1);\n }\n\n // Update analysis\n const updated = updateDocumentAnalysis(ctx.projectId, normalizedPath, analysis);\n if (!updated) {\n error(`Failed to update analysis for: ${normalizedPath}`, opts);\n process.exit(1);\n }\n\n // Get updated document\n const updatedDoc = getDocumentWithAnalysis(ctx.projectId, normalizedPath);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n path: normalizedPath,\n analyzed: true,\n analyzedAt: updatedDoc?.analyzed_at,\n metadata: {\n tldr: updatedDoc?.meta_tldr,\n module: updatedDoc?.inferred_module,\n component: updatedDoc?.inferred_component,\n type: updatedDoc?.file_type,\n dependencies: updatedDoc?.meta_dependencies ? JSON.parse(updatedDoc.meta_dependencies) : null,\n exports: updatedDoc?.exports ? JSON.parse(updatedDoc.exports) : null,\n complexity: updatedDoc?.complexity_score,\n confidence: updatedDoc?.analysis_confidence\n }\n }\n }));\n } else {\n success(`Analysis added for: ${normalizedPath}`, opts);\n if (updatedDoc?.meta_tldr) {\n info(`TLDR: ${updatedDoc.meta_tldr}`, opts);\n }\n }\n });\n\n// ============================================\n// LIST command - List files with filters\n// ============================================\nfileCommand\n .command('list')\n .alias('ls')\n .option('--unanalyzed', 'Only files without analysis')\n .option('--analyzed', 'Only files with analysis')\n .option('--low-confidence [threshold]', 'Files with low confidence (default: <70)', '70')\n .option('--module <module>', 'Filter by inferred module')\n .option('--type <type>', 'Filter by file type')\n .option('--shadow', 'Only shadow mode files')\n .option('--count', 'Return count only')\n .option('--limit <n>', 'Limit results', '100')\n .option('--offset <n>', 'Pagination offset', '0')\n .option('--format <format>', 'Output format: table|paths|json', 'table')\n .description('List tracked files with analysis filters')\n .action((options) => {\n const opts = getOutputOptions(fileCommand);\n const ctx = getProjectContext(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n const limit = parseInt(options.limit, 10);\n const offset = parseInt(options.offset, 10);\n\n // Count only mode\n if (options.count) {\n let count = 0;\n if (options.unanalyzed) {\n count = getUnanalyzedCount(ctx.projectId);\n } else {\n // Get all and filter\n const docs = options.unanalyzed\n ? getUnanalyzedDocuments(ctx.projectId)\n : getAnalyzedDocuments(ctx.projectId);\n count = docs.length;\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { count } }));\n } else {\n console.log(count);\n }\n return;\n }\n\n // Get files based on filter\n let documents: DocumentWithAnalysis[] = [];\n\n if (options.unanalyzed) {\n documents = getUnanalyzedDocuments(ctx.projectId, limit, offset);\n } else if (options.analyzed) {\n documents = getAnalyzedDocuments(ctx.projectId, limit);\n } else if (options.lowConfidence) {\n const threshold = parseInt(options.lowConfidence, 10) || 70;\n documents = getLowConfidenceDocuments(ctx.projectId, threshold);\n } else if (options.module) {\n documents = getDocumentsByInferredModule(ctx.projectId, options.module);\n } else if (options.type) {\n documents = getDocumentsByFileType(ctx.projectId, options.type);\n } else if (options.shadow) {\n documents = getShadowDocuments(ctx.projectId);\n } else {\n // Default: unanalyzed files\n documents = getUnanalyzedDocuments(ctx.projectId, limit, offset);\n }\n\n // Output based on format\n if (opts.json || options.format === 'json') {\n console.log(JSON.stringify({\n success: true,\n data: documents.map(d => ({\n path: d.path,\n filename: d.filename,\n extension: d.extension,\n module: d.inferred_module,\n component: d.inferred_component,\n fileType: d.file_type,\n analyzed: !!d.analyzed_at,\n analyzedAt: d.analyzed_at,\n confidence: d.analysis_confidence,\n tldr: d.meta_tldr,\n dependencies: d.meta_dependencies ? JSON.parse(d.meta_dependencies) : null,\n exports: d.exports ? JSON.parse(d.exports) : null,\n complexity: d.complexity_score\n }))\n }));\n } else if (options.format === 'paths') {\n documents.forEach(d => console.log(d.path));\n } else {\n // Table format\n const displayDocs = documents.map(formatDocForTable);\n data(\n displayDocs,\n [\n { header: 'Path', key: 'path', width: 50 },\n { header: 'Module', key: 'module', width: 15 },\n { header: 'Type', key: 'type', width: 10 },\n { header: 'Analyzed', key: 'analyzed', width: 8 },\n { header: 'Conf', key: 'confidence', width: 5 }\n ],\n opts\n );\n info(`Showing ${documents.length} files`, opts);\n }\n });\n\n// ============================================\n// PROGRESS command - Analysis progress stats\n// ============================================\nfileCommand\n .command('progress')\n .description('Show analysis progress statistics')\n .action(() => {\n const opts = getOutputOptions(fileCommand);\n const ctx = getProjectContext(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n const progress = getAnalysisProgress(ctx.projectId);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: progress }));\n } else {\n const analyzedPct = progress.total > 0\n ? Math.round((progress.analyzed / progress.total) * 100)\n : 0;\n\n console.log('\\n📊 Analysis Progress\\n');\n console.log(`Total files: ${progress.total}`);\n console.log(`Analyzed: ${progress.analyzed} (${analyzedPct}%)`);\n console.log(`Unanalyzed: ${progress.unanalyzed} (${100 - analyzedPct}%)`);\n console.log(`Low confidence: ${progress.lowConfidence}`);\n\n // By module\n const moduleEntries = Object.entries(progress.byModule);\n if (moduleEntries.length > 0) {\n console.log('\\nBy module:');\n for (const [module, stats] of moduleEntries) {\n const pct = stats.total > 0\n ? Math.round((stats.analyzed / stats.total) * 100)\n : 0;\n console.log(` ${module}: ${stats.analyzed}/${stats.total} (${pct}%)`);\n }\n }\n\n // By file type\n const typeEntries = Object.entries(progress.byFileType);\n if (typeEntries.length > 0) {\n console.log('\\nBy file type:');\n for (const [type, count] of typeEntries.slice(0, 10)) {\n console.log(` ${type}: ${count}`);\n }\n }\n\n console.log('');\n }\n });\n\n// ============================================\n// READ command - Read file content for agents\n// ============================================\nfileCommand\n .command('read <path>')\n .option('--with-metadata', 'Include existing DB metadata')\n .option('--line-numbers', 'Include line numbers')\n .option('--limit <n>', 'Limit number of lines', parseInt)\n .description('Read file content (for AI agent analysis)')\n .action((filePath: string, options) => {\n const opts = getOutputOptions(fileCommand);\n const ctx = getProjectContext(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n // Normalize path\n const normalizedPath = filePath.startsWith('/')\n ? relative(ctx.projectRoot, filePath)\n : filePath;\n\n const fullPath = join(ctx.projectRoot, normalizedPath);\n\n if (!existsSync(fullPath)) {\n error(`File not found: ${normalizedPath}`, opts);\n process.exit(1);\n }\n\n // Read file content\n let content: string;\n try {\n content = readFileSync(fullPath, 'utf-8');\n } catch {\n error(`Could not read file: ${normalizedPath}`, opts);\n process.exit(1);\n }\n\n // Get metadata if requested\n let metadata: DocumentWithAnalysis | undefined;\n if (options.withMetadata) {\n metadata = getDocumentWithAnalysis(ctx.projectId, normalizedPath);\n }\n\n // Apply line limit\n let lines = content.split('\\n');\n if (options.limit && options.limit > 0) {\n lines = lines.slice(0, options.limit);\n }\n\n // Format output\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n path: normalizedPath,\n content: lines.join('\\n'),\n lineCount: lines.length,\n metadata: metadata ? {\n tldr: metadata.meta_tldr,\n module: metadata.inferred_module,\n component: metadata.inferred_component,\n fileType: metadata.file_type,\n analyzed: !!metadata.analyzed_at,\n confidence: metadata.analysis_confidence\n } : null\n }\n }));\n } else {\n if (options.withMetadata && metadata) {\n console.log(`# File: ${normalizedPath}`);\n if (metadata.meta_tldr) console.log(`# TLDR: ${metadata.meta_tldr}`);\n if (metadata.inferred_module) console.log(`# Module: ${metadata.inferred_module}`);\n if (metadata.file_type) console.log(`# Type: ${metadata.file_type}`);\n console.log('');\n }\n\n if (options.lineNumbers) {\n lines.forEach((line, i) => {\n console.log(`${String(i + 1).padStart(4)} | ${line}`);\n });\n } else {\n console.log(lines.join('\\n'));\n }\n }\n });\n\n// ============================================\n// TRACK command - Track file in shadow mode\n// ============================================\nfileCommand\n .command('track <path>')\n .option('--type <type>', 'File type classification')\n .option('--module <module>', 'Module assignment')\n .option('--notes <notes>', 'Initial notes')\n .description('Track a file in shadow mode (brownfield)')\n .action((filePath: string, options) => {\n const opts = getOutputOptions(fileCommand);\n const ctx = getProjectContext(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n // Normalize path\n const normalizedPath = filePath.startsWith('/')\n ? relative(ctx.projectRoot, filePath)\n : filePath;\n\n // Track the file\n const tracked = trackShadowFile(ctx.projectId, ctx.projectRoot, normalizedPath);\n if (!tracked) {\n error(`Could not track file: ${normalizedPath}`, opts);\n process.exit(1);\n }\n\n // Add initial metadata if provided\n if (options.type || options.module || options.notes) {\n const analysis: AnalysisMetadata = {};\n if (options.type) analysis.fileType = options.type;\n if (options.module) analysis.module = options.module;\n if (options.notes) analysis.notes = options.notes;\n updateDocumentAnalysis(ctx.projectId, normalizedPath, analysis);\n }\n\n const doc = getDocumentWithAnalysis(ctx.projectId, normalizedPath);\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n path: normalizedPath,\n tracked: true,\n shadowMode: true,\n metadata: doc ? {\n fileType: doc.file_type,\n module: doc.inferred_module\n } : null\n }\n }));\n } else {\n success(`Tracked in shadow mode: ${normalizedPath}`, opts);\n }\n });\n\n// ============================================\n// SHOW command - Show file analysis details\n// ============================================\nfileCommand\n .command('show <path>')\n .description('Show detailed file analysis')\n .action((filePath: string) => {\n const opts = getOutputOptions(fileCommand);\n const ctx = getProjectContext(opts);\n if (!ctx) {\n process.exit(1);\n }\n\n // Normalize path\n const normalizedPath = filePath.startsWith('/')\n ? relative(ctx.projectRoot, filePath)\n : filePath;\n\n const doc = getDocumentWithAnalysis(ctx.projectId, normalizedPath);\n if (!doc) {\n error(`File not tracked: ${normalizedPath}`, opts);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({\n success: true,\n data: {\n path: doc.path,\n filename: doc.filename,\n extension: doc.extension,\n status: doc.status,\n sizeBytes: doc.size_bytes,\n lastScanned: doc.last_scanned_at,\n hasFrontmatter: !!doc.has_frontmatter,\n shadowMode: !!doc.shadow_mode,\n analysis: {\n analyzed: !!doc.analyzed_at,\n analyzedAt: doc.analyzed_at,\n confidence: doc.analysis_confidence,\n tldr: doc.meta_tldr,\n module: doc.inferred_module,\n component: doc.inferred_component,\n fileType: doc.file_type,\n complexity: doc.complexity_score,\n dependencies: doc.meta_dependencies ? JSON.parse(doc.meta_dependencies) : null,\n exports: doc.exports ? JSON.parse(doc.exports) : null,\n notes: doc.analysis_notes\n }\n }\n }));\n } else {\n const displayData: Record<string, unknown> = {\n path: doc.path,\n filename: doc.filename,\n extension: doc.extension,\n status: doc.status,\n size_bytes: doc.size_bytes,\n last_scanned: doc.last_scanned_at,\n shadow_mode: doc.shadow_mode ? 'Yes' : 'No',\n analyzed: doc.analyzed_at ? 'Yes' : 'No',\n analyzed_at: doc.analyzed_at ?? '-',\n confidence: doc.analysis_confidence ?? '-',\n tldr: doc.meta_tldr ?? '-',\n module: doc.inferred_module ?? '-',\n component: doc.inferred_component ?? '-',\n file_type: doc.file_type ?? '-',\n complexity: doc.complexity_score ?? '-',\n dependencies: doc.meta_dependencies ? JSON.parse(doc.meta_dependencies).join(', ') : '-',\n exports: doc.exports ? JSON.parse(doc.exports).join(', ') : '-',\n notes: doc.analysis_notes ?? '-'\n };\n\n details(\n displayData,\n [\n { label: 'Path', key: 'path' },\n { label: 'Filename', key: 'filename' },\n { label: 'Extension', key: 'extension' },\n { label: 'Status', key: 'status' },\n { label: 'Size (bytes)', key: 'size_bytes' },\n { label: 'Last Scanned', key: 'last_scanned' },\n { label: 'Shadow Mode', key: 'shadow_mode' },\n { label: 'Analyzed', key: 'analyzed' },\n { label: 'Analyzed At', key: 'analyzed_at' },\n { label: 'Confidence', key: 'confidence' },\n { label: 'TLDR', key: 'tldr' },\n { label: 'Module', key: 'module' },\n { label: 'Component', key: 'component' },\n { label: 'File Type', key: 'file_type' },\n { label: 'Complexity', key: 'complexity' },\n { label: 'Dependencies', key: 'dependencies' },\n { label: 'Exports', key: 'exports' },\n { label: 'Notes', key: 'notes' }\n ],\n opts\n );\n }\n });\n"],"mappings":"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","names":["dbPath","existsSync","readFileSync","writeFileSync","mkdirSync","data","Command","existsSync","mkdirSync","readFileSync","writeFileSync","join","basename","join","existsSync","mkdirSync","writeFileSync","join","dirname","join","existsSync","basename","mkdirSync","writeFileSync","readFileSync","Command","existsSync","join","existsSync","join","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","join","readFileSync","existsSync","join","relative","readFileSync","parseYaml","data","readFileSync","existsSync","join","relative","join","existsSync","readFileSync","Command","join","queryAll","Command","data","data","Command","calculateDuration","Command","calculateDuration","Command","Command","p","Command","Command","calculateDuration","calculateDuration","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","readFileSync","writeFileSync","join","Command","join","readFileSync","writeFileSync","Command","existsSync","writeFileSync","readFileSync","mkdirSync","statSync","readdirSync","join","dirname","homedir","execSync","existsSync","join","EventEmitter","relative","extname","basename","readFileSync","statSync","picomatch","error","relative","extname","basename","statSync","EventEmitter","data","error","existsSync","join","Command","join","homedir","existsSync","readFileSync","error","mkdirSync","writeFileSync","readdirSync","statSync","dirname","execSync","Command","readFileSync","existsSync","join","relative","Command","relative","join","existsSync","readFileSync","Command"]}