@obsfx/trekker 1.6.0 → 1.7.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/db/client-node.ts","../src/db/schema.ts","../src/types/index.ts","../src/utils/id-generator.ts","../src/services/project.ts","../src/utils/output.ts","../src/commands/wipe.ts","../src/commands/epic.ts","../src/services/epic.ts","../src/db/vectors.ts","../src/services/embedding.ts","../src/utils/text.ts","../src/services/semantic-search.ts","../src/utils/async.ts","../src/utils/validator.ts","../src/commands/task.ts","../src/services/task.ts","../src/commands/subtask.ts","../src/commands/comment.ts","../src/services/comment.ts","../src/commands/dep.ts","../src/services/dependency.ts","../src/commands/quickstart.ts","../src/commands/seed.ts","../src/commands/search.ts","../src/services/search.ts","../src/commands/history.ts","../src/services/history.ts","../src/commands/list.ts","../src/services/list.ts","../src/commands/chat.ts","../src/services/llm.ts","../src/services/chat.ts","../package.json"],"sourcesContent":["#!/usr/bin/env bun\nimport { Command } from \"commander\";\nimport { initCommand } from \"./commands/init\";\nimport { wipeCommand } from \"./commands/wipe\";\nimport { epicCommand } from \"./commands/epic\";\nimport { taskCommand } from \"./commands/task\";\nimport { subtaskCommand } from \"./commands/subtask\";\nimport { commentCommand } from \"./commands/comment\";\nimport { depCommand } from \"./commands/dep\";\nimport { quickstartCommand } from \"./commands/quickstart\";\nimport { seedCommand } from \"./commands/seed\";\nimport { searchCommand } from \"./commands/search\";\nimport { historyCommand } from \"./commands/history\";\nimport { listCommand } from \"./commands/list\";\nimport { chatCommand } from \"./commands/chat\";\nimport { setToonMode } from \"./utils/output\";\nimport pkg from \"../package.json\";\n\nconst program = new Command();\n\nprogram\n .name(\"trekker\")\n .description(\"CLI-based issue tracker for coding agents\")\n .version(pkg.version)\n .option(\"--toon\", \"Output in TOON format\")\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.opts();\n if (opts.toon) {\n setToonMode(true);\n }\n });\n\n// Add commands\nprogram.addCommand(initCommand);\nprogram.addCommand(wipeCommand);\nprogram.addCommand(epicCommand);\nprogram.addCommand(taskCommand);\nprogram.addCommand(subtaskCommand);\nprogram.addCommand(commentCommand);\nprogram.addCommand(depCommand);\nprogram.addCommand(quickstartCommand);\nprogram.addCommand(seedCommand);\nprogram.addCommand(searchCommand);\nprogram.addCommand(historyCommand);\nprogram.addCommand(listCommand);\nprogram.addCommand(chatCommand);\n\n// Parse and execute\nprogram.parse();\n","import { Command } from \"commander\";\nimport { initProject, isTrekkerInitialized } from \"../services/project\";\nimport { success, error } from \"../utils/output\";\n\nexport const initCommand = new Command(\"init\")\n .description(\"Initialize Trekker in the current directory\")\n .action(async () => {\n try {\n if (isTrekkerInitialized()) {\n error(\"Trekker is already initialized in this directory.\");\n process.exit(1);\n }\n\n await initProject();\n success(\"Trekker initialized successfully.\");\n } catch (err) {\n error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n","/**\n * Node.js SQLite client using sql.js (WebAssembly).\n *\n * Key differences from bun:sqlite:\n * - Async initialization (one-time WASM load)\n * - In-memory operation with explicit file persistence\n * - Save-after-write strategy for durability\n *\n * Uses drizzle-orm/sqlite-proxy to wrap sql.js.\n */\nimport initSqlJs, { type Database as SqlJsDatabase, type SqlValue } from \"sql.js\";\nimport { drizzle } from \"drizzle-orm/sqlite-proxy\";\nimport * as schema from \"./schema\";\nimport { existsSync, mkdirSync, rmSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\n\nconst TREKKER_DIR = \".trekker\";\nconst DB_NAME = \"trekker.db\";\n\nexport function getTrekkerDir(cwd: string = process.cwd()): string {\n return join(cwd, TREKKER_DIR);\n}\n\nexport function getDbPath(cwd: string = process.cwd()): string {\n return join(getTrekkerDir(cwd), DB_NAME);\n}\n\nexport function isTrekkerInitialized(cwd: string = process.cwd()): boolean {\n return existsSync(getDbPath(cwd));\n}\n\nexport function ensureTrekkerDir(cwd: string = process.cwd()): void {\n const trekkerDir = getTrekkerDir(cwd);\n if (!existsSync(trekkerDir)) {\n mkdirSync(trekkerDir, { recursive: true });\n }\n}\n\n// Module-level state\nlet sqlJsDb: SqlJsDatabase | null = null;\nlet dbInstance: ReturnType<typeof drizzle> | null = null;\nlet currentDbPath: string | null = null;\nlet SQL: Awaited<ReturnType<typeof initSqlJs>> | null = null;\n\n/**\n * Initialize sql.js WASM runtime (one-time, cached).\n */\nasync function initSqlJsRuntime(): Promise<typeof SQL> {\n if (SQL) return SQL;\n SQL = await initSqlJs();\n return SQL;\n}\n\n/**\n * Save the database to disk.\n * Called after every write operation.\n */\nfunction saveDb(): void {\n if (!sqlJsDb || !currentDbPath) return;\n const data = sqlJsDb.export();\n writeFileSync(currentDbPath, Buffer.from(data));\n}\n\n/**\n * Create a Drizzle instance wrapping sql.js via sqlite-proxy.\n */\nfunction createDrizzleInstance(sqlite: SqlJsDatabase): ReturnType<typeof drizzle> {\n return drizzle(\n // Query callback\n async (sql, params, method) => {\n try {\n // Handle different query methods\n if (method === \"run\") {\n sqlite.run(sql, params as SqlValue[]);\n saveDb();\n return { rows: [] };\n }\n\n if (method === \"get\") {\n const stmt = sqlite.prepare(sql);\n stmt.bind(params as SqlValue[]);\n if (stmt.step()) {\n // For 'get', return single row directly (not wrapped in array)\n const row = stmt.get();\n stmt.free();\n return { rows: row as unknown[] };\n }\n stmt.free();\n return { rows: [] };\n }\n\n // method === \"all\" or \"values\"\n const stmt = sqlite.prepare(sql);\n stmt.bind(params as SqlValue[]);\n const rows: unknown[][] = [];\n while (stmt.step()) {\n const row = stmt.get();\n if (row) rows.push(row as unknown[]);\n }\n stmt.free();\n return { rows };\n } catch (error) {\n console.error(\"SQL error:\", error);\n throw error;\n }\n },\n // Batch callback (optional but improves performance)\n async (queries) => {\n // drizzle-orm expects different row shapes for different methods:\n // - \"get\": single row as unknown[] (raw values)\n // - \"all\"/\"values\": array of rows as unknown[][]\n const results: { rows: unknown[] | unknown[][] }[] = [];\n for (const query of queries) {\n const { sql, params, method } = query;\n try {\n if (method === \"run\") {\n sqlite.run(sql, params as SqlValue[]);\n results.push({ rows: [] });\n continue;\n }\n\n if (method === \"get\") {\n const stmt = sqlite.prepare(sql);\n stmt.bind(params as SqlValue[]);\n if (stmt.step()) {\n const row = stmt.get();\n stmt.free();\n results.push({ rows: row as unknown[] });\n } else {\n stmt.free();\n results.push({ rows: [] });\n }\n continue;\n }\n\n // method === \"all\" or \"values\"\n const stmt = sqlite.prepare(sql);\n stmt.bind(params as SqlValue[]);\n const rows: unknown[][] = [];\n while (stmt.step()) {\n const row = stmt.get();\n if (row) rows.push(row as unknown[]);\n }\n stmt.free();\n results.push({ rows });\n } catch (error) {\n console.error(\"Batch SQL error:\", error);\n throw error;\n }\n }\n // Save once after all batch operations\n saveDb();\n return results;\n },\n { schema }\n );\n}\n\n/**\n * Get the Drizzle database instance (async).\n * Creates connection if not already connected.\n */\nexport async function getDb(cwd: string = process.cwd()): Promise<ReturnType<typeof drizzle>> {\n if (dbInstance && currentDbPath === getDbPath(cwd)) {\n return dbInstance;\n }\n\n // Close existing connection if switching directories\n if (dbInstance) {\n closeDb();\n }\n\n const dbPath = getDbPath(cwd);\n if (!existsSync(dbPath)) {\n throw new Error(\"Trekker not initialized. Run 'trekker init' first.\");\n }\n\n await initSqlJsRuntime();\n\n // Load existing database\n const buffer = readFileSync(dbPath);\n sqlJsDb = new SQL!.Database(buffer);\n currentDbPath = dbPath;\n\n // Migrate existing databases if needed\n migrateHistoryTable(sqlJsDb);\n migrateEmbeddingsTable(sqlJsDb);\n\n dbInstance = createDrizzleInstance(sqlJsDb);\n return dbInstance;\n}\n\n/**\n * Create a new database (async).\n */\nexport async function createDb(cwd: string = process.cwd()): Promise<ReturnType<typeof drizzle>> {\n ensureTrekkerDir(cwd);\n const dbPath = getDbPath(cwd);\n\n await initSqlJsRuntime();\n\n // Create new in-memory database\n sqlJsDb = new SQL!.Database();\n currentDbPath = dbPath;\n\n // Create all tables\n sqlJsDb.run(`\n CREATE TABLE IF NOT EXISTS projects (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `);\n\n sqlJsDb.run(`\n CREATE TABLE IF NOT EXISTS epics (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'todo',\n priority INTEGER NOT NULL DEFAULT 2,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `);\n\n sqlJsDb.run(`\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n epic_id TEXT REFERENCES epics(id) ON DELETE SET NULL,\n parent_task_id TEXT,\n title TEXT NOT NULL,\n description TEXT,\n priority INTEGER NOT NULL DEFAULT 2,\n status TEXT NOT NULL DEFAULT 'todo',\n tags TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `);\n\n sqlJsDb.run(`\n CREATE TABLE IF NOT EXISTS comments (\n id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n author TEXT NOT NULL,\n content TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `);\n\n sqlJsDb.run(`\n CREATE TABLE IF NOT EXISTS dependencies (\n id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n depends_on_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n created_at INTEGER NOT NULL\n )\n `);\n\n sqlJsDb.run(`\n CREATE TABLE IF NOT EXISTS id_counters (\n entity_type TEXT PRIMARY KEY,\n counter INTEGER NOT NULL DEFAULT 0\n )\n `);\n\n // Initialize counters\n sqlJsDb.run(\"INSERT OR IGNORE INTO id_counters (entity_type, counter) VALUES ('task', 0)\");\n sqlJsDb.run(\"INSERT OR IGNORE INTO id_counters (entity_type, counter) VALUES ('epic', 0)\");\n sqlJsDb.run(\"INSERT OR IGNORE INTO id_counters (entity_type, counter) VALUES ('comment', 0)\");\n\n // Events table for history/logbook\n sqlJsDb.run(`\n CREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action TEXT NOT NULL,\n entity_type TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n snapshot TEXT,\n changes TEXT,\n created_at INTEGER NOT NULL\n )\n `);\n\n sqlJsDb.run(\"CREATE INDEX IF NOT EXISTS idx_events_entity ON events(entity_id)\");\n sqlJsDb.run(\"CREATE INDEX IF NOT EXISTS idx_events_type_action ON events(entity_type, action)\");\n sqlJsDb.run(\"CREATE INDEX IF NOT EXISTS idx_events_created_at ON events(created_at)\");\n\n // Embeddings table for vector storage\n sqlJsDb.run(`\n CREATE TABLE IF NOT EXISTS embeddings (\n entity_id TEXT PRIMARY KEY,\n entity_type TEXT NOT NULL,\n vector BLOB NOT NULL\n )\n `);\n\n sqlJsDb.run(\"CREATE INDEX IF NOT EXISTS idx_embeddings_type ON embeddings(entity_type)\");\n\n // Create history event triggers\n createHistoryTriggers(sqlJsDb);\n\n // Save to disk\n saveDb();\n\n dbInstance = createDrizzleInstance(sqlJsDb);\n return dbInstance;\n}\n\n\nfunction createHistoryTriggers(sqlite: SqlJsDatabase): void {\n // Epic triggers\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS epics_history_insert AFTER INSERT ON epics BEGIN\n INSERT INTO events(action, entity_type, entity_id, snapshot, created_at)\n VALUES ('create', 'epic', NEW.id,\n json_object('id', NEW.id, 'title', NEW.title, 'description', NEW.description,\n 'status', NEW.status, 'priority', NEW.priority),\n unixepoch() * 1000);\n END\n `);\n\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS epics_history_delete AFTER DELETE ON epics BEGIN\n INSERT INTO events(action, entity_type, entity_id, snapshot, created_at)\n VALUES ('delete', 'epic', OLD.id,\n json_object('id', OLD.id, 'title', OLD.title, 'description', OLD.description,\n 'status', OLD.status, 'priority', OLD.priority),\n unixepoch() * 1000);\n END\n `);\n\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS epics_history_update AFTER UPDATE ON epics BEGIN\n INSERT INTO events(action, entity_type, entity_id, changes, created_at)\n SELECT 'update', 'epic', NEW.id,\n json_group_object(key, json_object('from', json_extract(old_json, '$.' || key), 'to', json_extract(new_json, '$.' || key))),\n unixepoch() * 1000\n FROM (\n SELECT\n json_object('title', OLD.title, 'description', OLD.description, 'status', OLD.status, 'priority', OLD.priority) as old_json,\n json_object('title', NEW.title, 'description', NEW.description, 'status', NEW.status, 'priority', NEW.priority) as new_json\n ), json_each(json_object('title', 1, 'description', 1, 'status', 1, 'priority', 1))\n WHERE json_extract(old_json, '$.' || key) IS NOT json_extract(new_json, '$.' || key);\n END\n `);\n\n // Task triggers (handles both tasks and subtasks)\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS tasks_history_insert AFTER INSERT ON tasks BEGIN\n INSERT INTO events(action, entity_type, entity_id, snapshot, created_at)\n VALUES ('create', IIF(NEW.parent_task_id IS NULL, 'task', 'subtask'), NEW.id,\n json_object('id', NEW.id, 'title', NEW.title, 'description', NEW.description,\n 'status', NEW.status, 'priority', NEW.priority, 'epic_id', NEW.epic_id,\n 'parent_task_id', NEW.parent_task_id, 'tags', NEW.tags),\n unixepoch() * 1000);\n END\n `);\n\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS tasks_history_delete AFTER DELETE ON tasks BEGIN\n INSERT INTO events(action, entity_type, entity_id, snapshot, created_at)\n VALUES ('delete', IIF(OLD.parent_task_id IS NULL, 'task', 'subtask'), OLD.id,\n json_object('id', OLD.id, 'title', OLD.title, 'description', OLD.description,\n 'status', OLD.status, 'priority', OLD.priority, 'epic_id', OLD.epic_id,\n 'parent_task_id', OLD.parent_task_id, 'tags', OLD.tags),\n unixepoch() * 1000);\n END\n `);\n\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS tasks_history_update AFTER UPDATE ON tasks BEGIN\n INSERT INTO events(action, entity_type, entity_id, changes, created_at)\n SELECT 'update', IIF(NEW.parent_task_id IS NULL, 'task', 'subtask'), NEW.id,\n json_group_object(key, json_object('from', json_extract(old_json, '$.' || key), 'to', json_extract(new_json, '$.' || key))),\n unixepoch() * 1000\n FROM (\n SELECT\n json_object('title', OLD.title, 'description', OLD.description, 'status', OLD.status,\n 'priority', OLD.priority, 'epic_id', OLD.epic_id, 'tags', OLD.tags) as old_json,\n json_object('title', NEW.title, 'description', NEW.description, 'status', NEW.status,\n 'priority', NEW.priority, 'epic_id', NEW.epic_id, 'tags', NEW.tags) as new_json\n ), json_each(json_object('title', 1, 'description', 1, 'status', 1, 'priority', 1, 'epic_id', 1, 'tags', 1))\n WHERE json_extract(old_json, '$.' || key) IS NOT json_extract(new_json, '$.' || key);\n END\n `);\n\n // Comment triggers\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS comments_history_insert AFTER INSERT ON comments BEGIN\n INSERT INTO events(action, entity_type, entity_id, snapshot, created_at)\n VALUES ('create', 'comment', NEW.id,\n json_object('id', NEW.id, 'task_id', NEW.task_id, 'author', NEW.author, 'content', NEW.content),\n unixepoch() * 1000);\n END\n `);\n\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS comments_history_delete AFTER DELETE ON comments BEGIN\n INSERT INTO events(action, entity_type, entity_id, snapshot, created_at)\n VALUES ('delete', 'comment', OLD.id,\n json_object('id', OLD.id, 'task_id', OLD.task_id, 'author', OLD.author, 'content', OLD.content),\n unixepoch() * 1000);\n END\n `);\n\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS comments_history_update AFTER UPDATE ON comments BEGIN\n INSERT INTO events(action, entity_type, entity_id, changes, created_at)\n SELECT 'update', 'comment', NEW.id,\n json_group_object(key, json_object('from', json_extract(old_json, '$.' || key), 'to', json_extract(new_json, '$.' || key))),\n unixepoch() * 1000\n FROM (\n SELECT\n json_object('content', OLD.content) as old_json,\n json_object('content', NEW.content) as new_json\n ), json_each(json_object('content', 1))\n WHERE json_extract(old_json, '$.' || key) IS NOT json_extract(new_json, '$.' || key);\n END\n `);\n\n // Dependency triggers (no updates, only create/delete)\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS deps_history_insert AFTER INSERT ON dependencies BEGIN\n INSERT INTO events(action, entity_type, entity_id, snapshot, created_at)\n VALUES ('create', 'dependency', NEW.id,\n json_object('id', NEW.id, 'task_id', NEW.task_id, 'depends_on_id', NEW.depends_on_id),\n unixepoch() * 1000);\n END\n `);\n\n sqlite.run(`\n CREATE TRIGGER IF NOT EXISTS deps_history_delete AFTER DELETE ON dependencies BEGIN\n INSERT INTO events(action, entity_type, entity_id, snapshot, created_at)\n VALUES ('delete', 'dependency', OLD.id,\n json_object('id', OLD.id, 'task_id', OLD.task_id, 'depends_on_id', OLD.depends_on_id),\n unixepoch() * 1000);\n END\n `);\n}\n\nfunction migrateHistoryTable(sqlite: SqlJsDatabase): void {\n const result = sqlite.exec(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='events'\"\n );\n\n if (result.length === 0 || result[0].values.length === 0) {\n sqlite.run(`\n CREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action TEXT NOT NULL,\n entity_type TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n snapshot TEXT,\n changes TEXT,\n created_at INTEGER NOT NULL\n )\n `);\n\n sqlite.run(\"CREATE INDEX IF NOT EXISTS idx_events_entity ON events(entity_id)\");\n sqlite.run(\"CREATE INDEX IF NOT EXISTS idx_events_type_action ON events(entity_type, action)\");\n sqlite.run(\"CREATE INDEX IF NOT EXISTS idx_events_created_at ON events(created_at)\");\n\n createHistoryTriggers(sqlite);\n saveDb();\n }\n}\n\nfunction migrateEmbeddingsTable(sqlite: SqlJsDatabase): void {\n const result = sqlite.exec(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='embeddings'\"\n );\n\n if (result.length === 0 || result[0].values.length === 0) {\n sqlite.run(`\n CREATE TABLE IF NOT EXISTS embeddings (\n entity_id TEXT PRIMARY KEY,\n entity_type TEXT NOT NULL,\n vector BLOB NOT NULL\n )\n `);\n\n sqlite.run(\"CREATE INDEX IF NOT EXISTS idx_embeddings_type ON embeddings(entity_type)\");\n saveDb();\n }\n}\n\n/**\n * Get the raw sql.js database instance for direct SQL operations.\n */\nexport function getSqliteInstance(): SqlJsDatabase | null {\n return sqlJsDb;\n}\n\nexport function requireSqliteInstance(): SqlJsDatabase {\n if (!sqlJsDb) {\n throw new Error(\"Database not initialized\");\n }\n return sqlJsDb;\n}\n\n/**\n * Run raw SQL and save (for vector operations).\n */\nexport function runSql(sql: string, params?: SqlValue[]): void {\n if (!sqlJsDb) {\n throw new Error(\"Database not initialized\");\n }\n sqlJsDb.run(sql, params);\n saveDb();\n}\n\n/**\n * Query raw SQL (for vector operations).\n */\nexport function querySql<T = unknown>(sql: string, params?: SqlValue[]): T[] {\n if (!sqlJsDb) {\n throw new Error(\"Database not initialized\");\n }\n const stmt = sqlJsDb.prepare(sql);\n if (params) {\n stmt.bind(params);\n }\n const results: T[] = [];\n while (stmt.step()) {\n results.push(stmt.getAsObject() as T);\n }\n stmt.free();\n return results;\n}\n\nexport function closeDb(): void {\n if (sqlJsDb) {\n sqlJsDb.close();\n sqlJsDb = null;\n dbInstance = null;\n currentDbPath = null;\n }\n}\n\nexport function deleteDb(cwd: string = process.cwd()): void {\n closeDb();\n const trekkerDir = getTrekkerDir(cwd);\n if (existsSync(trekkerDir)) {\n rmSync(trekkerDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Reset all DB state. Used for testing to allow switching between directories.\n */\nexport function resetDbState(): void {\n closeDb();\n}\n","import { relations } from \"drizzle-orm\";\nimport { sqliteTable, text, integer } from \"drizzle-orm/sqlite-core\";\n\n// Project table\nexport const projects = sqliteTable(\"projects\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull().unique(),\n createdAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// Epic table\nexport const epics = sqliteTable(\"epics\", {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\").notNull(),\n title: text(\"title\").notNull(),\n description: text(\"description\"),\n status: text(\"status\").notNull().default(\"todo\"),\n priority: integer(\"priority\").notNull().default(2),\n createdAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// Task table\nexport const tasks = sqliteTable(\"tasks\", {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\").notNull(),\n epicId: text(\"epic_id\"),\n parentTaskId: text(\"parent_task_id\"),\n title: text(\"title\").notNull(),\n description: text(\"description\"),\n priority: integer(\"priority\").notNull().default(2),\n status: text(\"status\").notNull().default(\"todo\"),\n tags: text(\"tags\"),\n createdAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// Comment table\nexport const comments = sqliteTable(\"comments\", {\n id: text(\"id\").primaryKey(),\n taskId: text(\"task_id\").notNull(),\n author: text(\"author\").notNull(),\n content: text(\"content\").notNull(),\n createdAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// Dependency table\nexport const dependencies = sqliteTable(\"dependencies\", {\n id: text(\"id\").primaryKey(),\n taskId: text(\"task_id\").notNull(),\n dependsOnId: text(\"depends_on_id\").notNull(),\n createdAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// ID counter table for TREK-n format\nexport const idCounters = sqliteTable(\"id_counters\", {\n entityType: text(\"entity_type\").primaryKey(),\n counter: integer(\"counter\").notNull().default(0),\n});\n\n// Events table for history/logbook\nexport const events = sqliteTable(\"events\", {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n action: text(\"action\").notNull(), // create, update, delete\n entityType: text(\"entity_type\").notNull(), // epic, task, subtask, comment, dependency\n entityId: text(\"entity_id\").notNull(),\n snapshot: text(\"snapshot\"), // Full JSON for create/delete\n changes: text(\"changes\"), // JSON diff for update\n createdAt: integer(\"created_at\", { mode: \"timestamp\" }).notNull(),\n});\n\n// Relations\nexport const projectsRelations = relations(projects, ({ many }) => ({\n epics: many(epics),\n tasks: many(tasks),\n}));\n\nexport const epicsRelations = relations(epics, ({ one, many }) => ({\n project: one(projects, {\n fields: [epics.projectId],\n references: [projects.id],\n }),\n tasks: many(tasks),\n}));\n\nexport const tasksRelations = relations(tasks, ({ one, many }) => ({\n project: one(projects, {\n fields: [tasks.projectId],\n references: [projects.id],\n }),\n epic: one(epics, {\n fields: [tasks.epicId],\n references: [epics.id],\n }),\n parentTask: one(tasks, {\n fields: [tasks.parentTaskId],\n references: [tasks.id],\n relationName: \"subtasks\",\n }),\n subtasks: many(tasks, { relationName: \"subtasks\" }),\n comments: many(comments),\n dependsOn: many(dependencies, { relationName: \"dependsOn\" }),\n blockedBy: many(dependencies, { relationName: \"blockedBy\" }),\n}));\n\nexport const commentsRelations = relations(comments, ({ one }) => ({\n task: one(tasks, {\n fields: [comments.taskId],\n references: [tasks.id],\n }),\n}));\n\nexport const dependenciesRelations = relations(dependencies, ({ one }) => ({\n task: one(tasks, {\n fields: [dependencies.taskId],\n references: [tasks.id],\n relationName: \"dependsOn\",\n }),\n dependsOn: one(tasks, {\n fields: [dependencies.dependsOnId],\n references: [tasks.id],\n relationName: \"blockedBy\",\n }),\n}));\n","// Status types\nexport const TASK_STATUSES = [\n \"todo\",\n \"in_progress\",\n \"completed\",\n \"wont_fix\",\n \"archived\",\n] as const;\n\nexport type TaskStatus = (typeof TASK_STATUSES)[number];\n\nexport const EPIC_STATUSES = [\n \"todo\",\n \"in_progress\",\n \"completed\",\n \"archived\",\n] as const;\n\nexport type EpicStatus = (typeof EPIC_STATUSES)[number];\n\n// Priority type (0-5, where 0 is highest priority)\nexport type Priority = 0 | 1 | 2 | 3 | 4 | 5;\n\n// Default values\nexport const DEFAULT_PRIORITY: Priority = 2;\nexport const DEFAULT_TASK_STATUS: TaskStatus = \"todo\";\nexport const DEFAULT_EPIC_STATUS: EpicStatus = \"todo\";\n\n// Pagination defaults\nexport const PAGINATION_DEFAULTS = {\n LIST_PAGE_SIZE: 50,\n SEARCH_PAGE_SIZE: 20,\n HISTORY_PAGE_SIZE: 50,\n DEFAULT_PAGE: 1,\n} as const;\n\n// Valid sort fields for list operations\nexport const VALID_SORT_FIELDS = [\n \"created\",\n \"updated\",\n \"title\",\n \"priority\",\n \"status\",\n] as const;\n\nexport type SortField = (typeof VALID_SORT_FIELDS)[number];\n\n// Valid entity types for list/search operations\nexport const LIST_ENTITY_TYPES = [\"epic\", \"task\", \"subtask\"] as const;\nexport const SEARCH_ENTITY_TYPES = [\"epic\", \"task\", \"subtask\", \"comment\"] as const;\n\nexport type ListEntityType = (typeof LIST_ENTITY_TYPES)[number];\nexport type SearchEntityType = (typeof SEARCH_ENTITY_TYPES)[number];\n\n// Entity types\nexport interface Project {\n id: string;\n name: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Epic {\n id: string;\n projectId: string;\n title: string;\n description: string | null;\n status: EpicStatus;\n priority: Priority;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Task {\n id: string;\n projectId: string;\n epicId: string | null;\n parentTaskId: string | null;\n title: string;\n description: string | null;\n priority: Priority;\n status: TaskStatus;\n tags: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Comment {\n id: string;\n taskId: string;\n author: string;\n content: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Dependency {\n id: string;\n taskId: string;\n dependsOnId: string;\n createdAt: Date;\n}\n\n// Input types for creating/updating entities\nexport interface CreateEpicInput {\n title: string;\n description?: string;\n status?: EpicStatus;\n priority?: Priority;\n}\n\nexport interface UpdateEpicInput {\n title?: string;\n description?: string;\n status?: EpicStatus;\n priority?: Priority;\n}\n\nexport interface CreateTaskInput {\n title: string;\n description?: string;\n priority?: Priority;\n status?: TaskStatus;\n tags?: string;\n epicId?: string;\n parentTaskId?: string;\n}\n\nexport interface UpdateTaskInput {\n title?: string;\n description?: string;\n priority?: Priority;\n status?: TaskStatus;\n tags?: string;\n epicId?: string | null;\n}\n\nexport interface CreateCommentInput {\n taskId: string;\n author: string;\n content: string;\n}\n\nexport interface UpdateCommentInput {\n content: string;\n}\n\n// Output options\nexport interface OutputOptions {\n json?: boolean;\n}\n\n// ID generation types\nexport type EntityType = \"task\" | \"epic\" | \"comment\";\n\nexport const PREFIX_MAP: Record<EntityType, string> = {\n task: \"TREK\",\n epic: \"EPIC\",\n comment: \"CMT\",\n};\n\n// Chat types\nexport interface ChatOptions {\n /** Maximum tokens for LLM response */\n maxTokens?: number;\n}\n\nexport interface ChatResult {\n query: string;\n response: string;\n contextCount: number;\n}\n","import { requireSqliteInstance, runSql, querySql } from \"../db/client-node\";\nimport { type EntityType, PREFIX_MAP } from \"../types\";\n\nexport type { EntityType };\n\nexport function generateId(entityType: EntityType): string {\n const prefix = PREFIX_MAP[entityType];\n\n // Atomically increment the counter using raw SQL\n runSql(\n \"UPDATE id_counters SET counter = counter + 1 WHERE entity_type = ?\",\n [entityType]\n );\n\n const result = querySql<{ counter: number }>(\n \"SELECT counter FROM id_counters WHERE entity_type = ?\",\n [entityType]\n );\n\n if (result.length === 0) {\n throw new Error(`Counter not found for entity type: ${entityType}`);\n }\n\n return `${prefix}-${result[0].counter}`;\n}\n\nexport function generateUuid(): string {\n return crypto.randomUUID();\n}\n","import { getDb, createDb, isTrekkerInitialized, deleteDb } from \"../db/client-node\";\nimport { projects } from \"../db/schema\";\nimport { generateUuid } from \"../utils/id-generator\";\nimport { basename } from \"path\";\n\nexport async function initProject(cwd: string = process.cwd()): Promise<void> {\n if (isTrekkerInitialized(cwd)) {\n throw new Error(\"Trekker is already initialized in this directory.\");\n }\n\n const db = await createDb(cwd);\n const projectName = basename(cwd);\n const now = new Date();\n\n await db.insert(projects).values({\n id: generateUuid(),\n name: projectName,\n createdAt: now,\n updatedAt: now,\n });\n}\n\nexport async function getProject(cwd: string = process.cwd()) {\n const db = await getDb(cwd);\n return db.select().from(projects).get();\n}\n\nexport function wipeProject(cwd: string = process.cwd()): void {\n if (!isTrekkerInitialized(cwd)) {\n throw new Error(\"Trekker is not initialized in this directory.\");\n }\n deleteDb(cwd);\n}\n\nexport { isTrekkerInitialized };\n","import { encode } from \"@toon-format/toon\";\nimport type { Epic, Task, Comment } from \"../types\";\n\nlet toonMode = false;\n\nexport function setToonMode(enabled: boolean): void {\n toonMode = enabled;\n}\n\nexport function isToonMode(): boolean {\n return toonMode;\n}\n\nexport function resetOutput(): void {\n toonMode = false;\n}\n\nexport function output(data: unknown): void {\n if (toonMode) {\n console.log(encode(data));\n } else if (typeof data === \"string\") {\n console.log(data);\n } else {\n console.log(JSON.stringify(data, null, 2));\n }\n}\n\nexport function success(message: string, data?: unknown): void {\n if (toonMode) {\n console.log(encode({ success: true, message, data }));\n } else {\n console.log(`✓ ${message}`);\n if (data) {\n output(data);\n }\n }\n}\n\nexport function error(message: string, details?: unknown): void {\n if (toonMode) {\n console.error(encode({ success: false, error: message, details }));\n } else {\n console.error(`✗ Error: ${message}`);\n if (details) {\n console.error(details);\n }\n }\n}\n\n/**\n * Handles command errors with consistent formatting and exits with code 1.\n * Use in catch blocks to replace duplicate error handling patterns.\n */\nexport function handleCommandError(err: unknown): never {\n error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n}\n\n/**\n * Handles entity not found with error message and exits with code 1.\n */\nexport function handleNotFound(entityType: string, id: string): never {\n error(`${entityType} not found: ${id}`);\n process.exit(1);\n}\n\n/**\n * Outputs result in appropriate format (toon or standard).\n * Reduces duplicate if/else branching in commands.\n */\nexport function outputResult<T>(\n data: T,\n formatter: (data: T) => string,\n successMessage?: string\n): void {\n if (isToonMode()) {\n output(data);\n } else {\n if (successMessage) {\n success(successMessage);\n }\n console.log(formatter(data));\n }\n}\n\nexport function info(message: string): void {\n if (!toonMode) {\n console.log(message);\n }\n}\n\nexport function warn(message: string): void {\n if (!toonMode) {\n console.log(`⚠ ${message}`);\n }\n}\n\nexport function formatTask(task: Task): string {\n const lines = [\n `ID: ${task.id}`,\n `Title: ${task.title}`,\n `Status: ${task.status}`,\n `Priority: ${task.priority}`,\n ];\n\n if (task.description) {\n lines.push(`Description: ${task.description}`);\n }\n if (task.epicId) {\n lines.push(`Epic: ${task.epicId}`);\n }\n if (task.parentTaskId) {\n lines.push(`Parent: ${task.parentTaskId}`);\n }\n if (task.tags) {\n lines.push(`Tags: ${task.tags}`);\n }\n lines.push(`Created: ${task.createdAt.toISOString()}`);\n lines.push(`Updated: ${task.updatedAt.toISOString()}`);\n\n return lines.join(\"\\n\");\n}\n\nexport function formatEpic(epic: Epic): string {\n const lines = [\n `ID: ${epic.id}`,\n `Title: ${epic.title}`,\n `Status: ${epic.status}`,\n `Priority: ${epic.priority}`,\n ];\n\n if (epic.description) {\n lines.push(`Description: ${epic.description}`);\n }\n lines.push(`Created: ${epic.createdAt.toISOString()}`);\n lines.push(`Updated: ${epic.updatedAt.toISOString()}`);\n\n return lines.join(\"\\n\");\n}\n\nexport function formatComment(comment: Comment): string {\n const lines = [\n `ID: ${comment.id}`,\n `Author: ${comment.author}`,\n `Content: ${comment.content}`,\n `Created: ${comment.createdAt.toISOString()}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\nexport function formatTaskList(tasks: Task[]): string {\n if (tasks.length === 0) {\n return \"No tasks found.\";\n }\n\n const lines = tasks.map((task) => {\n const tags = task.tags ? ` [${task.tags}]` : \"\";\n const parent = task.parentTaskId ? ` (subtask of ${task.parentTaskId})` : \"\";\n return `${task.id} | ${task.status.padEnd(11)} | P${task.priority} | ${task.title}${tags}${parent}`;\n });\n\n return lines.join(\"\\n\");\n}\n\nexport function formatEpicList(epics: Epic[]): string {\n if (epics.length === 0) {\n return \"No epics found.\";\n }\n\n const lines = epics.map((epic) => {\n return `${epic.id} | ${epic.status.padEnd(11)} | P${epic.priority} | ${epic.title}`;\n });\n\n return lines.join(\"\\n\");\n}\n\nexport function formatCommentList(comments: Comment[]): string {\n if (comments.length === 0) {\n return \"No comments found.\";\n }\n\n return comments\n .map((c) => `[${c.id}] ${c.author}: ${c.content}`)\n .join(\"\\n\");\n}\n\nexport function formatDependencyList(\n dependencies: Array<{ taskId: string; dependsOnId: string }>,\n direction: \"depends_on\" | \"blocks\"\n): string {\n if (dependencies.length === 0) {\n return direction === \"depends_on\"\n ? \"No dependencies.\"\n : \"Does not block any tasks.\";\n }\n\n if (direction === \"depends_on\") {\n return dependencies.map((d) => ` → depends on ${d.dependsOnId}`).join(\"\\n\");\n } else {\n return dependencies.map((d) => ` → blocks ${d.taskId}`).join(\"\\n\");\n }\n}\n","import { Command } from \"commander\";\nimport { wipeProject, isTrekkerInitialized } from \"../services/project\";\nimport { success, error } from \"../utils/output\";\nimport * as readline from \"readline\";\n\nexport const wipeCommand = new Command(\"wipe\")\n .description(\"Delete all Trekker data in the current directory\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (options) => {\n try {\n if (!isTrekkerInitialized()) {\n error(\"Trekker is not initialized in this directory.\");\n process.exit(1);\n }\n\n if (!options.yes) {\n const confirmed = await confirm(\n \"Are you sure you want to delete all Trekker data? This cannot be undone. (y/N): \"\n );\n if (!confirmed) {\n console.log(\"Aborted.\");\n return;\n }\n }\n\n await wipeProject();\n success(\"Trekker data deleted successfully.\");\n } catch (err) {\n error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nfunction confirm(prompt: string): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n });\n });\n}\n","import { Command } from \"commander\";\nimport {\n createEpic,\n getEpic,\n listEpics,\n updateEpic,\n deleteEpic,\n completeEpic,\n} from \"../services/epic\";\nimport { parseStatus, parsePriority, validateRequired } from \"../utils/validator\";\nimport {\n success,\n formatEpic,\n formatEpicList,\n handleCommandError,\n handleNotFound,\n outputResult,\n isToonMode,\n output,\n} from \"../utils/output\";\nimport type { EpicStatus } from \"../types\";\n\nexport const epicCommand = new Command(\"epic\").description(\"Manage epics\");\n\nepicCommand\n .command(\"create\")\n .description(\"Create a new epic\")\n .requiredOption(\"-t, --title <title>\", \"Epic title\")\n .option(\"-d, --description <description>\", \"Epic description\")\n .option(\"-p, --priority <priority>\", \"Priority (0-5, default: 2)\")\n .option(\"-s, --status <status>\", \"Status (todo, in_progress, completed, archived)\")\n .action(async (options) => {\n try {\n validateRequired(options.title, \"Title\");\n\n const epic = await createEpic({\n title: options.title,\n description: options.description,\n priority: parsePriority(options.priority),\n status: parseStatus(options.status, \"epic\") as EpicStatus | undefined,\n });\n\n outputResult(epic, formatEpic, `Epic created: ${epic.id}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\nepicCommand\n .command(\"list\")\n .description(\"List all epics\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .action(async (options) => {\n try {\n const status = parseStatus(options.status, \"epic\") as EpicStatus | undefined;\n const epics = await listEpics(status);\n\n outputResult(epics, formatEpicList);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\nepicCommand\n .command(\"show <epic-id>\")\n .description(\"Show epic details\")\n .action(async (epicId) => {\n try {\n const epic = await getEpic(epicId);\n if (!epic) return handleNotFound(\"Epic\", epicId);\n\n outputResult(epic, formatEpic);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\nepicCommand\n .command(\"update <epic-id>\")\n .description(\"Update an epic\")\n .option(\"-t, --title <title>\", \"New title\")\n .option(\"-d, --description <description>\", \"New description\")\n .option(\"-p, --priority <priority>\", \"New priority (0-5)\")\n .option(\"-s, --status <status>\", \"New status\")\n .action(async (epicId, options) => {\n try {\n const epic = await updateEpic(epicId, {\n title: options.title,\n description: options.description,\n priority: parsePriority(options.priority),\n status: parseStatus(options.status, \"epic\") as EpicStatus | undefined,\n });\n\n outputResult(epic, formatEpic, `Epic updated: ${epic.id}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\nepicCommand\n .command(\"delete <epic-id>\")\n .description(\"Delete an epic\")\n .action(async (epicId) => {\n try {\n await deleteEpic(epicId);\n success(`Epic deleted: ${epicId}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\nepicCommand\n .command(\"complete <epic-id>\")\n .description(\"Complete an epic and archive all its tasks and subtasks\")\n .action(async (epicId) => {\n try {\n const result = await completeEpic(epicId);\n\n if (isToonMode()) {\n output(result);\n } else {\n success(`Epic completed: ${result.epic}`);\n console.log(`Archived ${result.archived.tasks} task(s) and ${result.archived.subtasks} subtask(s)`);\n }\n } catch (err) {\n handleCommandError(err);\n }\n });\n","import { eq, and, isNull } from \"drizzle-orm\";\nimport { getDb } from \"../db/client-node\";\nimport { epics, projects, tasks } from \"../db/schema\";\nimport { generateId } from \"../utils/id-generator\";\nimport type {\n Epic,\n CreateEpicInput,\n UpdateEpicInput,\n EpicStatus,\n} from \"../types\";\nimport {\n DEFAULT_PRIORITY,\n DEFAULT_EPIC_STATUS,\n} from \"../types\";\nimport { indexEntity, removeEntityIndex } from \"./semantic-search\";\nimport { queueBackgroundTask } from \"../utils/async\";\n\nexport async function createEpic(input: CreateEpicInput): Promise<Epic> {\n const db = await getDb();\n\n const project = await db.select().from(projects).get();\n if (!project) {\n throw new Error(\"Project not found. Run 'trekker init' first.\");\n }\n\n const id = generateId(\"epic\");\n const now = new Date();\n\n const epic = {\n id,\n projectId: project.id,\n title: input.title,\n description: input.description ?? null,\n status: input.status ?? DEFAULT_EPIC_STATUS,\n priority: input.priority ?? DEFAULT_PRIORITY,\n createdAt: now,\n updatedAt: now,\n };\n\n await db.insert(epics).values(epic);\n\n // Queue embedding generation (non-blocking)\n queueBackgroundTask(\n indexEntity(id, \"epic\", `${epic.title} ${epic.description ?? \"\"}`),\n `index ${id}`\n );\n\n return epic as Epic;\n}\n\nexport async function getEpic(id: string): Promise<Epic | undefined> {\n const db = await getDb();\n const result = await db.select().from(epics).where(eq(epics.id, id)).get();\n // Workaround for drizzle-orm sqlite-proxy bug: empty result returns object with undefined values\n if (!result || result.id === undefined) {\n return undefined;\n }\n return result as Epic;\n}\n\nexport async function listEpics(status?: EpicStatus): Promise<Epic[]> {\n const db = await getDb();\n\n if (status) {\n return await db\n .select()\n .from(epics)\n .where(eq(epics.status, status))\n .all() as Epic[];\n }\n\n return await db.select().from(epics).all() as Epic[];\n}\n\nexport async function updateEpic(id: string, input: UpdateEpicInput): Promise<Epic> {\n const db = await getDb();\n\n const existing = await getEpic(id);\n if (!existing) {\n throw new Error(`Epic not found: ${id}`);\n }\n\n const updates: Record<string, unknown> = {\n updatedAt: new Date(),\n };\n\n if (input.title !== undefined) updates.title = input.title;\n if (input.description !== undefined) updates.description = input.description;\n if (input.status !== undefined) updates.status = input.status;\n if (input.priority !== undefined) updates.priority = input.priority;\n\n await db.update(epics).set(updates).where(eq(epics.id, id));\n\n // Re-embed if title or description changed (non-blocking)\n if (input.title !== undefined || input.description !== undefined) {\n const updated = (await getEpic(id))!;\n queueBackgroundTask(\n indexEntity(id, \"epic\", `${updated.title} ${updated.description ?? \"\"}`),\n `reindex ${id}`\n );\n }\n\n return (await getEpic(id))!;\n}\n\nexport async function deleteEpic(id: string): Promise<void> {\n const db = await getDb();\n\n const existing = await getEpic(id);\n if (!existing) {\n throw new Error(`Epic not found: ${id}`);\n }\n\n // Remove from semantic index (non-blocking)\n queueBackgroundTask(removeEntityIndex(id), `remove index ${id}`);\n\n await db.delete(epics).where(eq(epics.id, id));\n}\n\nexport interface CompleteEpicResult {\n epic: string;\n status: string;\n archived: {\n tasks: number;\n subtasks: number;\n };\n}\n\nexport async function completeEpic(id: string): Promise<CompleteEpicResult> {\n const db = await getDb();\n\n const existing = await getEpic(id);\n if (!existing) {\n throw new Error(`Epic not found: ${id}`);\n }\n\n if (existing.status === \"completed\") {\n throw new Error(`Epic is already completed: ${id}`);\n }\n\n // Get all tasks under this epic (not subtasks)\n const epicTasks = await db\n .select()\n .from(tasks)\n .where(and(eq(tasks.epicId, id), isNull(tasks.parentTaskId)))\n .all();\n\n const taskIds = epicTasks.map((t) => t.id);\n\n // Get all subtasks of those tasks\n let subtaskCount = 0;\n if (taskIds.length > 0) {\n for (const taskId of taskIds) {\n const subtasks = await db\n .select()\n .from(tasks)\n .where(eq(tasks.parentTaskId, taskId))\n .all();\n\n subtaskCount += subtasks.length;\n\n // Archive subtasks\n if (subtasks.length > 0) {\n await db.update(tasks)\n .set({ status: \"archived\", updatedAt: new Date() })\n .where(eq(tasks.parentTaskId, taskId));\n }\n }\n\n // Archive tasks\n await db.update(tasks)\n .set({ status: \"archived\", updatedAt: new Date() })\n .where(and(eq(tasks.epicId, id), isNull(tasks.parentTaskId)));\n }\n\n // Complete the epic\n await db.update(epics)\n .set({ status: \"completed\", updatedAt: new Date() })\n .where(eq(epics.id, id));\n\n return {\n epic: id,\n status: \"completed\",\n archived: {\n tasks: taskIds.length,\n subtasks: subtaskCount,\n },\n };\n}\n","/**\n * Vector operations using SQLite storage and pure JavaScript cosine similarity.\n *\n * Replaces LanceDB with zero native dependencies.\n * For Trekker's scale (hundreds of entities), brute-force cosine similarity\n * is fast enough (~1-10ms for 1000 vectors).\n */\nimport { querySql, runSql, getSqliteInstance } from \"./client-node\";\n\nconst EMBEDDING_DIMENSION = 256;\n\ninterface EmbeddingRecord {\n entity_id: string;\n entity_type: string;\n vector: Uint8Array;\n}\n\nexport interface EmbeddingSearchResult {\n entityId: string;\n entityType: string;\n similarity: number;\n}\n\n/**\n * Check if embeddings are disabled (for faster tests).\n */\nfunction isEmbeddingsSkipped(): boolean {\n return process.env.TREKKER_SKIP_EMBEDDINGS === \"1\";\n}\n\n/**\n * Serialize Float32Array to Uint8Array for SQLite BLOB storage.\n */\nfunction serializeVector(vector: Float32Array): Uint8Array {\n return new Uint8Array(vector.buffer);\n}\n\n/**\n * Deserialize Uint8Array from SQLite BLOB to Float32Array.\n */\nfunction deserializeVector(blob: Uint8Array): Float32Array {\n return new Float32Array(blob.buffer.slice(blob.byteOffset, blob.byteOffset + blob.byteLength));\n}\n\n/**\n * Compute cosine similarity between two vectors.\n * Both vectors should already be normalized, so this is just a dot product.\n */\nfunction cosineSimilarity(a: Float32Array, b: Float32Array): number {\n let dot = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n }\n return dot;\n}\n\n/**\n * Insert or update an embedding for an entity.\n */\nexport async function upsertEmbedding(\n entityId: string,\n entityType: string,\n embedding: Float32Array,\n _cwd: string = process.cwd()\n): Promise<void> {\n if (isEmbeddingsSkipped()) return;\n\n const vectorBlob = serializeVector(embedding);\n\n // Use INSERT OR REPLACE to handle upsert\n runSql(\n `INSERT OR REPLACE INTO embeddings (entity_id, entity_type, vector) VALUES (?, ?, ?)`,\n [entityId, entityType, vectorBlob]\n );\n}\n\n/**\n * Delete an embedding for an entity.\n */\nexport async function deleteEmbedding(\n entityId: string,\n _cwd: string = process.cwd()\n): Promise<void> {\n if (isEmbeddingsSkipped()) return;\n\n runSql(`DELETE FROM embeddings WHERE entity_id = ?`, [entityId]);\n}\n\n/**\n * Check if an embedding exists for an entity.\n */\nexport async function hasEmbedding(\n entityId: string,\n _cwd: string = process.cwd()\n): Promise<boolean> {\n if (isEmbeddingsSkipped()) return false;\n\n const results = querySql<{ entity_id: string }>(\n `SELECT entity_id FROM embeddings WHERE entity_id = ? LIMIT 1`,\n [entityId]\n );\n return results.length > 0;\n}\n\n/**\n * Search for similar embeddings using cosine similarity.\n * Returns results sorted by similarity (descending).\n */\nexport async function searchEmbeddings(\n queryVector: Float32Array,\n options: {\n limit?: number;\n types?: string[];\n similarityThreshold?: number;\n } = {},\n _cwd: string = process.cwd()\n): Promise<EmbeddingSearchResult[]> {\n if (isEmbeddingsSkipped()) return [];\n\n const limit = options.limit ?? 100;\n const similarityThreshold = options.similarityThreshold;\n\n // Build query with optional type filter\n let sql = `SELECT entity_id, entity_type, vector FROM embeddings`;\n const params: string[] = [];\n\n if (options.types && options.types.length > 0) {\n const placeholders = options.types.map(() => \"?\").join(\", \");\n sql += ` WHERE entity_type IN (${placeholders})`;\n params.push(...options.types);\n }\n\n const records = querySql<EmbeddingRecord>(sql, params);\n\n // Compute similarities\n const results: EmbeddingSearchResult[] = records.map((record) => {\n const vector = deserializeVector(record.vector);\n const similarity = cosineSimilarity(queryVector, vector);\n return {\n entityId: record.entity_id,\n entityType: record.entity_type,\n similarity,\n };\n });\n\n // Filter by threshold if specified\n const filtered = similarityThreshold !== undefined\n ? results.filter((r) => r.similarity >= similarityThreshold)\n : results;\n\n // Sort by similarity (descending) and limit\n return filtered\n .sort((a, b) => b.similarity - a.similarity)\n .slice(0, limit);\n}\n\n/**\n * Get all embeddings (for reindexing).\n */\nexport async function getAllEmbeddings(\n _cwd: string = process.cwd()\n): Promise<{ entity_id: string; entity_type: string }[]> {\n if (isEmbeddingsSkipped()) return [];\n\n return querySql<{ entity_id: string; entity_type: string }>(\n `SELECT entity_id, entity_type FROM embeddings`\n );\n}\n\n/**\n * Clear all embeddings (for reindexing).\n */\nexport async function clearAllEmbeddings(_cwd: string = process.cwd()): Promise<void> {\n if (isEmbeddingsSkipped()) return;\n\n runSql(`DELETE FROM embeddings`);\n}\n\n/**\n * Get the count of embeddings.\n */\nexport async function countEmbeddings(_cwd: string = process.cwd()): Promise<number> {\n if (isEmbeddingsSkipped()) return 0;\n\n const result = querySql<{ count: number }>(`SELECT COUNT(*) as count FROM embeddings`);\n return result[0]?.count ?? 0;\n}\n\n/**\n * Close vector database (no-op for SQLite-based storage).\n */\nexport function closeVectorDb(): void {\n // No-op - vectors are stored in SQLite, closed via closeDb()\n}\n\n/**\n * Check if vector storage is available (always true for SQLite).\n */\nexport function isVectorStorageAvailable(): boolean {\n return getSqliteInstance() !== null;\n}\n\n/**\n * Get the embedding dimension.\n */\nexport function getEmbeddingDimension(): number {\n return EMBEDDING_DIMENSION;\n}\n","import { pipeline } from \"@huggingface/transformers\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nconst MODEL_ID = \"onnx-community/embeddinggemma-300m-ONNX\";\n/** Full embedding dimension from the model before MRL (Matryoshka Representation Learning) truncation */\nconst FULL_DIMENSION = 768;\n/** Target dimension after MRL truncation - smaller vectors with preserved semantic quality */\nconst TARGET_DIMENSION = 256;\nconst CACHE_DIR = join(homedir(), \".trekker\", \"models\");\n\nexport interface EmbeddingOptions {\n /** If true, suppresses progress output to stderr */\n silent?: boolean;\n}\n\n// Feature extraction pipeline type - simplified to avoid complex union type issues\ninterface FeatureExtractor {\n (text: string, options?: { pooling?: string; normalize?: boolean }): Promise<{ data: ArrayLike<number> }>;\n}\n\nlet extractor: FeatureExtractor | null = null;\nlet modelLoadFailed = false;\nlet modelLoading: Promise<boolean> | null = null;\n\nfunction ensureCacheDir(): void {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n}\n\nfunction truncateAndNormalize(\n embedding: Float32Array,\n targetDim: number\n): Float32Array {\n // Truncate to target dimension (MRL technique)\n const truncated = embedding.slice(0, targetDim);\n\n // Re-normalize after truncation\n let norm = 0;\n for (let i = 0; i < truncated.length; i++) {\n norm += truncated[i] * truncated[i];\n }\n norm = Math.sqrt(norm);\n\n if (norm > 0) {\n for (let i = 0; i < truncated.length; i++) {\n truncated[i] = truncated[i] / norm;\n }\n }\n\n return truncated;\n}\n\n/**\n * Resets the model state to allow retrying after transient errors.\n * Call this before retrying ensureModelLoaded() if a previous attempt failed.\n */\nexport function resetModelState(): void {\n extractor = null;\n modelLoading = null;\n modelLoadFailed = false;\n}\n\ninterface DownloadProgress {\n status: string;\n file?: string;\n progress?: number;\n}\n\nfunction createProgressCallback(silent: boolean): ((progress: DownloadProgress) => void) | undefined {\n if (silent) return undefined;\n\n return (progress: DownloadProgress) => {\n if (progress.status === \"download\" && progress.file && progress.progress !== undefined) {\n const percent = Math.round(progress.progress);\n process.stderr.write(`\\rDownloading ${progress.file}: ${percent}%`);\n return;\n }\n if (progress.status === \"done\") {\n process.stderr.write(\"\\n\");\n }\n };\n}\n\nfunction formatErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport async function ensureModelLoaded(options?: EmbeddingOptions): Promise<boolean> {\n if (extractor) return true;\n if (modelLoadFailed) return false;\n if (modelLoading) return modelLoading;\n\n const silent = options?.silent ?? false;\n\n modelLoading = (async () => {\n try {\n ensureCacheDir();\n\n extractor = await (pipeline as Function)(\"feature-extraction\", MODEL_ID, {\n cache_dir: CACHE_DIR,\n quantized: true,\n dtype: \"fp32\",\n progress_callback: createProgressCallback(silent),\n }) as FeatureExtractor;\n\n return true;\n } catch (error) {\n modelLoadFailed = true;\n if (!silent) {\n process.stderr.write(`\\nFailed to load embedding model: ${formatErrorMessage(error)}\\n`);\n }\n return false;\n } finally {\n modelLoading = null;\n }\n })();\n\n return modelLoading;\n}\n\nexport function isModelAvailable(): boolean {\n return extractor !== null;\n}\n\nexport function getEmbeddingDimension(): number {\n return TARGET_DIMENSION;\n}\n\nexport async function embed(text: string): Promise<Float32Array> {\n const loaded = await ensureModelLoaded();\n if (!loaded || !extractor) {\n throw new Error(\"Embedding model is not available\");\n }\n\n const output = await extractor(text, {\n pooling: \"mean\",\n normalize: true,\n });\n\n // Extract the embedding from the tensor output\n const fullEmbedding = new Float32Array(output.data as ArrayLike<number>);\n\n if (fullEmbedding.length !== FULL_DIMENSION) {\n throw new Error(\n `Unexpected embedding dimension: expected ${FULL_DIMENSION}, got ${fullEmbedding.length}`\n );\n }\n\n return truncateAndNormalize(fullEmbedding, TARGET_DIMENSION);\n}\n\nexport async function embedBatch(texts: string[]): Promise<Float32Array[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const loaded = await ensureModelLoaded();\n if (!loaded || !extractor) {\n throw new Error(\"Embedding model is not available\");\n }\n\n const results: Float32Array[] = [];\n\n // Process each text individually to ensure proper output handling\n for (const text of texts) {\n const output = await extractor(text, {\n pooling: \"mean\",\n normalize: true,\n });\n\n const fullEmbedding = new Float32Array(output.data as ArrayLike<number>);\n\n if (fullEmbedding.length !== FULL_DIMENSION) {\n throw new Error(\n `Unexpected embedding dimension: expected ${FULL_DIMENSION}, got ${fullEmbedding.length}`\n );\n }\n\n results.push(truncateAndNormalize(fullEmbedding, TARGET_DIMENSION));\n }\n\n return results;\n}\n","/**\n * Truncate text to a maximum length, appending \"...\" if truncated.\n */\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength) + \"...\";\n}\n\n/**\n * Build searchable text from an entity with title and optional description.\n */\nexport function buildEntityText(entity: { title: string; description?: string | null }): string {\n if (!entity.description) return entity.title;\n return `${entity.title} ${entity.description}`;\n}\n","import { getDb, requireSqliteInstance } from \"../db/client-node\";\nimport {\n searchEmbeddings,\n upsertEmbedding,\n deleteEmbedding,\n isVectorStorageAvailable,\n} from \"../db/vectors\";\nimport { embed, ensureModelLoaded } from \"./embedding\";\nimport { PAGINATION_DEFAULTS, type SearchEntityType } from \"../types\";\nimport { truncateText } from \"../utils/text\";\nimport type { Database as SqlJsDatabase } from \"sql.js\";\n\nexport type { SearchEntityType };\n\nexport interface SemanticSearchOptions {\n types?: SearchEntityType[];\n status?: string;\n limit?: number;\n page?: number;\n threshold?: number;\n}\n\nexport interface SemanticSearchResult {\n type: SearchEntityType;\n id: string;\n title: string | null;\n description: string | null;\n similarity: number;\n status: string | null;\n parentId: string | null;\n}\n\nexport interface SemanticSearchResponse {\n query: string;\n total: number;\n page: number;\n limit: number;\n mode: \"semantic\";\n results: SemanticSearchResult[];\n}\n\ninterface EntityMetaRow {\n entity_id: string;\n entity_type: string;\n title: string | null;\n description: string | null;\n status: string | null;\n parent_id: string | null;\n}\n\n/**\n * Check if semantic search is available.\n */\nexport function isSemanticSearchAvailable(): boolean {\n return isVectorStorageAvailable();\n}\n\n/**\n * Perform semantic search using vector similarity.\n * Generates query embedding and finds similar entities using SQLite vectors.\n */\nexport async function semanticSearch(\n query: string,\n options?: SemanticSearchOptions\n): Promise<SemanticSearchResponse> {\n const limit = options?.limit ?? PAGINATION_DEFAULTS.SEARCH_PAGE_SIZE;\n const page = options?.page ?? PAGINATION_DEFAULTS.DEFAULT_PAGE;\n const threshold = options?.threshold ?? 0.5;\n const offset = (page - 1) * limit;\n\n // Initialize database first\n await getDb();\n const sqlite = requireSqliteInstance();\n\n // Ensure model is loaded and generate query embedding\n const loaded = await ensureModelLoaded({ silent: true });\n if (!loaded) {\n throw new Error(\"Failed to load embedding model for semantic search\");\n }\n\n const queryEmbedding = await embed(query);\n\n // Search embeddings using SQLite vectors\n const embeddingResults = await searchEmbeddings(queryEmbedding, {\n limit: limit * 10, // Fetch more to allow for filtering\n types: options?.types,\n similarityThreshold: threshold,\n });\n\n // Get metadata for each result and filter by status\n const results: SemanticSearchResult[] = [];\n\n for (const row of embeddingResults) {\n const meta = getEntityMeta(sqlite, row.entityId, row.entityType);\n if (!meta) continue;\n\n // Filter by status if specified\n if (options?.status && meta.status !== options.status) {\n continue;\n }\n\n results.push({\n type: row.entityType as SearchEntityType,\n id: row.entityId,\n title: meta.title,\n description: meta.description,\n similarity: row.similarity,\n status: meta.status,\n parentId: meta.parent_id,\n });\n }\n\n // Apply pagination\n const total = results.length;\n const paginatedResults = results.slice(offset, offset + limit);\n\n return {\n query,\n total,\n page,\n limit,\n mode: \"semantic\",\n results: paginatedResults,\n };\n}\n\n/**\n * Get entity metadata (title, status, parentId) from the appropriate table.\n */\nexport function getEntityMeta(\n sqlite: SqlJsDatabase,\n entityId: string,\n entityType: string\n): EntityMetaRow | null {\n if (entityType === \"epic\") {\n const stmt = sqlite.prepare(\"SELECT title, description, status FROM epics WHERE id = ?\");\n stmt.bind([entityId]);\n\n if (stmt.step()) {\n const row = stmt.getAsObject() as { title: string; description: string | null; status: string };\n stmt.free();\n return {\n entity_id: entityId,\n entity_type: entityType,\n title: row.title,\n description: row.description,\n status: row.status,\n parent_id: null,\n };\n }\n stmt.free();\n return null;\n }\n\n if (entityType === \"task\" || entityType === \"subtask\") {\n const stmt = sqlite.prepare(\n \"SELECT title, description, status, parent_task_id, epic_id FROM tasks WHERE id = ?\"\n );\n stmt.bind([entityId]);\n\n if (stmt.step()) {\n const row = stmt.getAsObject() as {\n title: string;\n description: string | null;\n status: string;\n parent_task_id: string | null;\n epic_id: string | null;\n };\n stmt.free();\n return {\n entity_id: entityId,\n entity_type: entityType,\n title: row.title,\n description: row.description,\n status: row.status,\n parent_id: row.parent_task_id ?? row.epic_id,\n };\n }\n stmt.free();\n return null;\n }\n\n if (entityType === \"comment\") {\n const stmt = sqlite.prepare(\"SELECT content, task_id FROM comments WHERE id = ?\");\n stmt.bind([entityId]);\n\n if (stmt.step()) {\n const row = stmt.getAsObject() as { content: string; task_id: string };\n stmt.free();\n return {\n entity_id: entityId,\n entity_type: entityType,\n title: truncateText(row.content, 50),\n description: row.content,\n status: null,\n parent_id: row.task_id,\n };\n }\n stmt.free();\n return null;\n }\n\n return null;\n}\n\n/**\n * Index an entity by generating and storing its embedding.\n * @param entityId The entity ID (e.g., TREK-1, EPIC-2)\n * @param entityType The type of entity (epic, task, subtask, comment)\n * @param text The text content to embed (title + description, or comment content)\n */\nexport async function indexEntity(\n entityId: string,\n entityType: SearchEntityType,\n text: string\n): Promise<void> {\n if (!text || text.trim().length === 0) {\n return;\n }\n\n const loaded = await ensureModelLoaded({ silent: true });\n if (!loaded) {\n throw new Error(\"Failed to load embedding model\");\n }\n\n const embedding = await embed(text);\n await upsertEmbedding(entityId, entityType, embedding);\n}\n\n/**\n * Remove an entity from the semantic search index.\n * @param entityId The entity ID to remove\n */\nexport async function removeEntityIndex(entityId: string): Promise<void> {\n await deleteEmbedding(entityId);\n}\n","/**\n * Queue a background task that runs without blocking.\n * Errors are logged to stderr in debug mode (TREKKER_DEBUG=1).\n * Skipped entirely when TREKKER_SKIP_EMBEDDINGS=1 (for faster tests).\n *\n * Use this for non-critical operations like embedding generation\n * where failure shouldn't block the main operation.\n */\nexport function queueBackgroundTask(\n promise: Promise<unknown>,\n context?: string\n): void {\n // Skip background tasks in test mode for faster execution\n if (process.env.TREKKER_SKIP_EMBEDDINGS === \"1\") {\n return;\n }\n\n promise.catch((error: Error) => {\n if (process.env.TREKKER_DEBUG === \"1\") {\n const prefix = context ? `[${context}] ` : \"\";\n console.error(`${prefix}Background task failed: ${error.message}`);\n }\n });\n}\n","import {\n TASK_STATUSES,\n EPIC_STATUSES,\n LIST_ENTITY_TYPES,\n SEARCH_ENTITY_TYPES,\n type TaskStatus,\n type EpicStatus,\n type Priority,\n type ListEntityType,\n type SearchEntityType,\n} from \"../types\";\n\nexport function isValidTaskStatus(status: string): status is TaskStatus {\n return TASK_STATUSES.includes(status as TaskStatus);\n}\n\nexport function isValidEpicStatus(status: string): status is EpicStatus {\n return EPIC_STATUSES.includes(status as EpicStatus);\n}\n\nexport function isValidPriority(priority: number): priority is Priority {\n return Number.isInteger(priority) && priority >= 0 && priority <= 5;\n}\n\nexport function parseStatus(\n status: string | undefined,\n type: \"task\" | \"epic\"\n): TaskStatus | EpicStatus | undefined {\n if (!status) return undefined;\n\n const normalizedStatus = status.toLowerCase().replace(/-/g, \"_\");\n\n if (type === \"task\") {\n if (!isValidTaskStatus(normalizedStatus)) {\n throw new Error(\n `Invalid task status: ${status}. Valid values: ${TASK_STATUSES.join(\", \")}`\n );\n }\n return normalizedStatus;\n } else {\n if (!isValidEpicStatus(normalizedStatus)) {\n throw new Error(\n `Invalid epic status: ${status}. Valid values: ${EPIC_STATUSES.join(\", \")}`\n );\n }\n return normalizedStatus;\n }\n}\n\nexport function parsePriority(priority: string | undefined): Priority | undefined {\n if (priority === undefined) return undefined;\n\n const num = parseInt(priority, 10);\n if (isNaN(num) || !isValidPriority(num)) {\n throw new Error(`Invalid priority: ${priority}. Must be a number between 0 and 5.`);\n }\n return num as Priority;\n}\n\nexport function validateRequired(\n value: unknown,\n fieldName: string\n): asserts value is string {\n if (value === undefined || value === null || value === \"\") {\n throw new Error(`${fieldName} is required`);\n }\n}\n\nexport function validatePagination(limit: number, page: number): void {\n if (isNaN(limit) || limit < 1) {\n throw new Error(\"Invalid limit value\");\n }\n if (isNaN(page) || page < 1) {\n throw new Error(\"Invalid page value\");\n }\n}\n\nexport function validateListEntityTypes(types: string[]): asserts types is ListEntityType[] {\n for (const t of types) {\n if (!LIST_ENTITY_TYPES.includes(t as ListEntityType)) {\n throw new Error(`Invalid type: ${t}. Valid types: ${LIST_ENTITY_TYPES.join(\", \")}`);\n }\n }\n}\n\nexport function validateSearchEntityTypes(types: string[]): asserts types is SearchEntityType[] {\n for (const t of types) {\n if (!SEARCH_ENTITY_TYPES.includes(t as SearchEntityType)) {\n throw new Error(`Invalid type: ${t}. Valid types: ${SEARCH_ENTITY_TYPES.join(\", \")}`);\n }\n }\n}\n\nexport function validatePriorities(priorities: number[]): void {\n for (const p of priorities) {\n if (isNaN(p) || p < 0 || p > 5) {\n throw new Error(`Invalid priority: ${p}. Valid priorities: 0-5`);\n }\n }\n}\n","import { Command } from \"commander\";\nimport {\n createTask,\n getTask,\n listTasks,\n updateTask,\n deleteTask,\n} from \"../services/task\";\nimport { parseStatus, parsePriority, validateRequired } from \"../utils/validator\";\nimport {\n success,\n formatTask,\n formatTaskList,\n handleCommandError,\n handleNotFound,\n outputResult,\n} from \"../utils/output\";\nimport type { TaskStatus } from \"../types\";\n\nexport const taskCommand = new Command(\"task\").description(\"Manage tasks\");\n\ntaskCommand\n .command(\"create\")\n .description(\"Create a new task\")\n .requiredOption(\"-t, --title <title>\", \"Task title\")\n .option(\"-d, --description <description>\", \"Task description\")\n .option(\"-p, --priority <priority>\", \"Priority (0-5, default: 2)\")\n .option(\"-s, --status <status>\", \"Status (todo, in_progress, completed, wont_fix, archived)\")\n .option(\"--tags <tags>\", \"Comma-separated tags\")\n .option(\"-e, --epic <epic-id>\", \"Epic ID to assign task to\")\n .action(async (options) => {\n try {\n validateRequired(options.title, \"Title\");\n\n const task = await createTask({\n title: options.title,\n description: options.description,\n priority: parsePriority(options.priority),\n status: parseStatus(options.status, \"task\") as TaskStatus | undefined,\n tags: options.tags,\n epicId: options.epic,\n });\n\n outputResult(task, formatTask, `Task created: ${task.id}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\ntaskCommand\n .command(\"list\")\n .description(\"List all tasks\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .option(\"-e, --epic <epic-id>\", \"Filter by epic\")\n .action(async (options) => {\n try {\n const status = parseStatus(options.status, \"task\") as TaskStatus | undefined;\n const tasks = await listTasks({\n status,\n epicId: options.epic,\n parentTaskId: null,\n });\n\n outputResult(tasks, formatTaskList);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\ntaskCommand\n .command(\"show <task-id>\")\n .description(\"Show task details\")\n .action(async (taskId) => {\n try {\n const task = await getTask(taskId);\n if (!task) return handleNotFound(\"Task\", taskId);\n\n outputResult(task, formatTask);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\ntaskCommand\n .command(\"update <task-id>\")\n .description(\"Update a task\")\n .option(\"-t, --title <title>\", \"New title\")\n .option(\"-d, --description <description>\", \"New description\")\n .option(\"-p, --priority <priority>\", \"New priority (0-5)\")\n .option(\"-s, --status <status>\", \"New status\")\n .option(\"--tags <tags>\", \"New tags (comma-separated)\")\n .option(\"-e, --epic <epic-id>\", \"New epic ID\")\n .option(\"--no-epic\", \"Remove from epic\")\n .action(async (taskId, options) => {\n try {\n const updateInput: Record<string, unknown> = {};\n\n if (options.title !== undefined) updateInput.title = options.title;\n if (options.description !== undefined) updateInput.description = options.description;\n if (options.priority !== undefined) updateInput.priority = parsePriority(options.priority);\n if (options.status !== undefined) updateInput.status = parseStatus(options.status, \"task\");\n if (options.tags !== undefined) updateInput.tags = options.tags;\n if (options.epic === false) {\n updateInput.epicId = null;\n } else if (options.epic !== undefined) {\n updateInput.epicId = options.epic;\n }\n\n const task = await updateTask(taskId, updateInput);\n outputResult(task, formatTask, `Task updated: ${task.id}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\ntaskCommand\n .command(\"delete <task-id>\")\n .description(\"Delete a task\")\n .action(async (taskId) => {\n try {\n await deleteTask(taskId);\n success(`Task deleted: ${taskId}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n","import { eq, and, isNull } from \"drizzle-orm\";\nimport { getDb } from \"../db/client-node\";\nimport { tasks, projects, epics } from \"../db/schema\";\nimport { generateId } from \"../utils/id-generator\";\nimport type {\n Task,\n CreateTaskInput,\n UpdateTaskInput,\n TaskStatus,\n} from \"../types\";\nimport {\n DEFAULT_PRIORITY,\n DEFAULT_TASK_STATUS,\n} from \"../types\";\nimport { indexEntity, removeEntityIndex } from \"./semantic-search\";\nimport { queueBackgroundTask } from \"../utils/async\";\n\nexport async function createTask(input: CreateTaskInput): Promise<Task> {\n const db = await getDb();\n\n const project = await db.select().from(projects).get();\n // Workaround for drizzle-orm sqlite-proxy bug: empty result returns object with undefined values\n if (!project || project.id === undefined) {\n throw new Error(\"Project not found. Run 'trekker init' first.\");\n }\n\n // Validate epic exists if provided\n if (input.epicId) {\n const epic = await db.select().from(epics).where(eq(epics.id, input.epicId)).get();\n // Workaround for drizzle-orm sqlite-proxy bug\n if (!epic || epic.id === undefined) {\n throw new Error(`Epic not found: ${input.epicId}`);\n }\n }\n\n // Validate parent task exists if provided\n if (input.parentTaskId) {\n const parent = await db\n .select()\n .from(tasks)\n .where(eq(tasks.id, input.parentTaskId))\n .get();\n // Workaround for drizzle-orm sqlite-proxy bug\n if (!parent || parent.id === undefined) {\n throw new Error(`Parent task not found: ${input.parentTaskId}`);\n }\n }\n\n const id = generateId(\"task\");\n const now = new Date();\n\n const task = {\n id,\n projectId: project.id,\n epicId: input.epicId ?? null,\n parentTaskId: input.parentTaskId ?? null,\n title: input.title,\n description: input.description ?? null,\n priority: input.priority ?? DEFAULT_PRIORITY,\n status: input.status ?? DEFAULT_TASK_STATUS,\n tags: input.tags ?? null,\n createdAt: now,\n updatedAt: now,\n };\n\n await db.insert(tasks).values(task);\n\n // Queue embedding generation (non-blocking)\n const entityType = input.parentTaskId ? \"subtask\" : \"task\";\n queueBackgroundTask(\n indexEntity(id, entityType, `${task.title} ${task.description ?? \"\"}`),\n `index ${id}`\n );\n\n return task as Task;\n}\n\nexport async function getTask(id: string): Promise<Task | undefined> {\n const db = await getDb();\n const result = await db.select().from(tasks).where(eq(tasks.id, id)).get();\n // Workaround for drizzle-orm sqlite-proxy bug: empty result returns object with undefined values\n if (!result || result.id === undefined) {\n return undefined;\n }\n return result as Task;\n}\n\nexport async function listTasks(options?: {\n status?: TaskStatus;\n epicId?: string;\n parentTaskId?: string | null;\n}): Promise<Task[]> {\n const db = await getDb();\n\n const conditions = [];\n\n if (options?.status) {\n conditions.push(eq(tasks.status, options.status));\n }\n\n if (options?.epicId) {\n conditions.push(eq(tasks.epicId, options.epicId));\n }\n\n // If parentTaskId is explicitly null, list only top-level tasks\n if (options?.parentTaskId === null) {\n conditions.push(isNull(tasks.parentTaskId));\n } else if (options?.parentTaskId) {\n conditions.push(eq(tasks.parentTaskId, options.parentTaskId));\n }\n\n if (conditions.length > 0) {\n return await db\n .select()\n .from(tasks)\n .where(and(...conditions))\n .all() as Task[];\n }\n\n return await db.select().from(tasks).all() as Task[];\n}\n\nexport async function listSubtasks(parentTaskId: string): Promise<Task[]> {\n const db = await getDb();\n return await db\n .select()\n .from(tasks)\n .where(eq(tasks.parentTaskId, parentTaskId))\n .all() as Task[];\n}\n\nexport async function updateTask(id: string, input: UpdateTaskInput): Promise<Task> {\n const db = await getDb();\n\n const existing = await getTask(id);\n if (!existing) {\n throw new Error(`Task not found: ${id}`);\n }\n\n // Validate epic exists if provided\n if (input.epicId) {\n const epic = await db.select().from(epics).where(eq(epics.id, input.epicId)).get();\n if (!epic) {\n throw new Error(`Epic not found: ${input.epicId}`);\n }\n }\n\n const updates: Record<string, unknown> = {\n updatedAt: new Date(),\n };\n\n if (input.title !== undefined) updates.title = input.title;\n if (input.description !== undefined) updates.description = input.description;\n if (input.priority !== undefined) updates.priority = input.priority;\n if (input.status !== undefined) updates.status = input.status;\n if (input.tags !== undefined) updates.tags = input.tags;\n if (input.epicId !== undefined) updates.epicId = input.epicId;\n\n await db.update(tasks).set(updates).where(eq(tasks.id, id));\n\n // Re-embed if title or description changed (non-blocking)\n if (input.title !== undefined || input.description !== undefined) {\n const updated = (await getTask(id))!;\n const entityType = updated.parentTaskId ? \"subtask\" : \"task\";\n queueBackgroundTask(\n indexEntity(id, entityType, `${updated.title} ${updated.description ?? \"\"}`),\n `reindex ${id}`\n );\n }\n\n return (await getTask(id))!;\n}\n\nexport async function deleteTask(id: string): Promise<void> {\n const db = await getDb();\n\n const existing = await getTask(id);\n if (!existing) {\n throw new Error(`Task not found: ${id}`);\n }\n\n // Remove from semantic index (non-blocking)\n queueBackgroundTask(removeEntityIndex(id), `remove index ${id}`);\n\n // Note: Subtasks and comments will be cascade deleted by SQLite\n await db.delete(tasks).where(eq(tasks.id, id));\n}\n","import { Command } from \"commander\";\nimport {\n createTask,\n getTask,\n listSubtasks,\n updateTask,\n deleteTask,\n} from \"../services/task\";\nimport { parseStatus, parsePriority, validateRequired } from \"../utils/validator\";\nimport {\n success,\n error,\n formatTask,\n formatTaskList,\n handleCommandError,\n handleNotFound,\n outputResult,\n isToonMode,\n output,\n} from \"../utils/output\";\nimport type { TaskStatus } from \"../types\";\n\nexport const subtaskCommand = new Command(\"subtask\").description(\"Manage subtasks\");\n\nsubtaskCommand\n .command(\"create <parent-task-id>\")\n .description(\"Create a new subtask\")\n .requiredOption(\"-t, --title <title>\", \"Subtask title\")\n .option(\"-d, --description <description>\", \"Subtask description\")\n .option(\"-p, --priority <priority>\", \"Priority (0-5, default: 2)\")\n .option(\"-s, --status <status>\", \"Status (todo, in_progress, completed, wont_fix, archived)\")\n .action(async (parentTaskId, options) => {\n try {\n validateRequired(options.title, \"Title\");\n\n const parent = await getTask(parentTaskId);\n if (!parent) return handleNotFound(\"Parent task\", parentTaskId);\n\n const subtask = await createTask({\n title: options.title,\n description: options.description,\n priority: parsePriority(options.priority),\n status: parseStatus(options.status, \"task\") as TaskStatus | undefined,\n parentTaskId,\n epicId: parent.epicId ?? undefined,\n });\n\n outputResult(subtask, formatTask, `Subtask created: ${subtask.id}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\nsubtaskCommand\n .command(\"list <parent-task-id>\")\n .description(\"List all subtasks of a task\")\n .action(async (parentTaskId) => {\n try {\n const parent = await getTask(parentTaskId);\n if (!parent) return handleNotFound(\"Parent task\", parentTaskId);\n\n const subtasks = await listSubtasks(parentTaskId);\n\n if (isToonMode()) {\n output(subtasks);\n } else {\n if (subtasks.length === 0) {\n console.log(`No subtasks for ${parentTaskId}`);\n } else {\n console.log(`Subtasks of ${parentTaskId}:`);\n console.log(formatTaskList(subtasks));\n }\n }\n } catch (err) {\n handleCommandError(err);\n }\n });\n\nsubtaskCommand\n .command(\"update <subtask-id>\")\n .description(\"Update a subtask\")\n .option(\"-t, --title <title>\", \"New title\")\n .option(\"-d, --description <description>\", \"New description\")\n .option(\"-p, --priority <priority>\", \"New priority (0-5)\")\n .option(\"-s, --status <status>\", \"New status\")\n .action(async (subtaskId, options) => {\n try {\n const subtask = await getTask(subtaskId);\n if (!subtask) return handleNotFound(\"Subtask\", subtaskId);\n\n if (!subtask.parentTaskId) {\n error(`${subtaskId} is not a subtask. Use 'trekker task update' instead.`);\n process.exit(1);\n }\n\n const updateInput: Record<string, unknown> = {};\n if (options.title !== undefined) updateInput.title = options.title;\n if (options.description !== undefined) updateInput.description = options.description;\n if (options.priority !== undefined) updateInput.priority = parsePriority(options.priority);\n if (options.status !== undefined) updateInput.status = parseStatus(options.status, \"task\");\n\n const updated = await updateTask(subtaskId, updateInput);\n outputResult(updated, formatTask, `Subtask updated: ${updated.id}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\nsubtaskCommand\n .command(\"delete <subtask-id>\")\n .description(\"Delete a subtask\")\n .action(async (subtaskId) => {\n try {\n const subtask = await getTask(subtaskId);\n if (!subtask) return handleNotFound(\"Subtask\", subtaskId);\n\n if (!subtask.parentTaskId) {\n error(`${subtaskId} is not a subtask. Use 'trekker task delete' instead.`);\n process.exit(1);\n }\n\n await deleteTask(subtaskId);\n success(`Subtask deleted: ${subtaskId}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n","import { Command } from \"commander\";\nimport {\n createComment,\n listComments,\n updateComment,\n deleteComment,\n} from \"../services/comment\";\nimport { validateRequired } from \"../utils/validator\";\nimport {\n success,\n formatComment,\n formatCommentList,\n handleCommandError,\n outputResult,\n isToonMode,\n output,\n} from \"../utils/output\";\n\nexport const commentCommand = new Command(\"comment\").description(\"Manage comments\");\n\ncommentCommand\n .command(\"add <task-id>\")\n .description(\"Add a comment to a task\")\n .requiredOption(\"-a, --author <author>\", \"Comment author\")\n .requiredOption(\"-c, --content <content>\", \"Comment content\")\n .action(async (taskId, options) => {\n try {\n validateRequired(options.author, \"Author\");\n validateRequired(options.content, \"Content\");\n\n const comment = await createComment({\n taskId,\n author: options.author,\n content: options.content,\n });\n\n outputResult(comment, formatComment, `Comment added: ${comment.id}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\ncommentCommand\n .command(\"list <task-id>\")\n .description(\"List all comments on a task\")\n .action(async (taskId) => {\n try {\n const comments = await listComments(taskId);\n\n if (isToonMode()) {\n output(comments);\n } else {\n if (comments.length === 0) {\n console.log(`No comments on ${taskId}`);\n } else {\n console.log(`Comments on ${taskId}:`);\n console.log(formatCommentList(comments));\n }\n }\n } catch (err) {\n handleCommandError(err);\n }\n });\n\ncommentCommand\n .command(\"update <comment-id>\")\n .description(\"Update a comment\")\n .requiredOption(\"-c, --content <content>\", \"New comment content\")\n .action(async (commentId, options) => {\n try {\n validateRequired(options.content, \"Content\");\n\n const comment = await updateComment(commentId, {\n content: options.content,\n });\n\n outputResult(comment, formatComment, `Comment updated: ${comment.id}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\ncommentCommand\n .command(\"delete <comment-id>\")\n .description(\"Delete a comment\")\n .action(async (commentId) => {\n try {\n await deleteComment(commentId);\n success(`Comment deleted: ${commentId}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n","import { eq } from \"drizzle-orm\";\nimport { getDb } from \"../db/client-node\";\nimport { comments, tasks } from \"../db/schema\";\nimport { generateId } from \"../utils/id-generator\";\nimport type { Comment, CreateCommentInput, UpdateCommentInput } from \"../types\";\nimport { indexEntity, removeEntityIndex } from \"./semantic-search\";\nimport { queueBackgroundTask } from \"../utils/async\";\n\nexport async function createComment(input: CreateCommentInput): Promise<Comment> {\n const db = await getDb();\n\n // Validate task exists\n const task = await db.select().from(tasks).where(eq(tasks.id, input.taskId)).get();\n // Workaround for drizzle-orm sqlite-proxy bug: empty result returns object with undefined values\n if (!task || task.id === undefined) {\n throw new Error(`Task not found: ${input.taskId}`);\n }\n\n const id = generateId(\"comment\");\n const now = new Date();\n\n const comment = {\n id,\n taskId: input.taskId,\n author: input.author,\n content: input.content,\n createdAt: now,\n updatedAt: now,\n };\n\n await db.insert(comments).values(comment);\n\n // Queue embedding generation (non-blocking)\n queueBackgroundTask(\n indexEntity(id, \"comment\", comment.content),\n `index ${id}`\n );\n\n return comment as Comment;\n}\n\nexport async function getComment(id: string): Promise<Comment | undefined> {\n const db = await getDb();\n const result = await db.select().from(comments).where(eq(comments.id, id)).get();\n // Workaround for drizzle-orm sqlite-proxy bug: empty result returns object with undefined values\n if (!result || result.id === undefined) {\n return undefined;\n }\n return result as Comment;\n}\n\nexport async function listComments(taskId: string): Promise<Comment[]> {\n const db = await getDb();\n\n // Validate task exists\n const task = await db.select().from(tasks).where(eq(tasks.id, taskId)).get();\n // Workaround for drizzle-orm sqlite-proxy bug: empty result returns object with undefined values\n if (!task || task.id === undefined) {\n throw new Error(`Task not found: ${taskId}`);\n }\n\n return await db\n .select()\n .from(comments)\n .where(eq(comments.taskId, taskId))\n .all() as Comment[];\n}\n\nexport async function updateComment(id: string, input: UpdateCommentInput): Promise<Comment> {\n const db = await getDb();\n\n const existing = await getComment(id);\n if (!existing) {\n throw new Error(`Comment not found: ${id}`);\n }\n\n await db.update(comments)\n .set({\n content: input.content,\n updatedAt: new Date(),\n })\n .where(eq(comments.id, id));\n\n // Re-embed comment content (non-blocking)\n const updated = (await getComment(id))!;\n queueBackgroundTask(\n indexEntity(id, \"comment\", updated.content),\n `reindex ${id}`\n );\n\n return (await getComment(id))!;\n}\n\nexport async function deleteComment(id: string): Promise<void> {\n const db = await getDb();\n\n const existing = await getComment(id);\n if (!existing) {\n throw new Error(`Comment not found: ${id}`);\n }\n\n // Remove from semantic index (non-blocking)\n queueBackgroundTask(removeEntityIndex(id), `remove index ${id}`);\n\n await db.delete(comments).where(eq(comments.id, id));\n}\n","import { Command } from \"commander\";\nimport {\n addDependency,\n removeDependency,\n getDependencies,\n} from \"../services/dependency\";\nimport {\n success,\n formatDependencyList,\n handleCommandError,\n isToonMode,\n output,\n} from \"../utils/output\";\n\nexport const depCommand = new Command(\"dep\").description(\"Manage task dependencies\");\n\ndepCommand\n .command(\"add <task-id> <depends-on-id>\")\n .description(\"Add a dependency (task-id depends on depends-on-id)\")\n .action(async (taskId, dependsOnId) => {\n try {\n const dependency = await addDependency(taskId, dependsOnId);\n\n if (isToonMode()) {\n output(dependency);\n } else {\n success(`Dependency added: ${taskId} → depends on ${dependsOnId}`);\n }\n } catch (err) {\n handleCommandError(err);\n }\n });\n\ndepCommand\n .command(\"remove <task-id> <depends-on-id>\")\n .description(\"Remove a dependency\")\n .action(async (taskId, dependsOnId) => {\n try {\n await removeDependency(taskId, dependsOnId);\n success(`Dependency removed: ${taskId} → ${dependsOnId}`);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\ndepCommand\n .command(\"list <task-id>\")\n .description(\"List dependencies for a task\")\n .action(async (taskId) => {\n try {\n const { dependsOn, blocks } = await getDependencies(taskId);\n\n if (isToonMode()) {\n output({ taskId, dependsOn, blocks });\n } else {\n console.log(`Dependencies for ${taskId}:`);\n console.log(\"\\nDepends on:\");\n console.log(formatDependencyList(dependsOn, \"depends_on\"));\n console.log(\"\\nBlocks:\");\n console.log(formatDependencyList(blocks, \"blocks\"));\n }\n } catch (err) {\n handleCommandError(err);\n }\n });\n","import { eq } from \"drizzle-orm\";\nimport { getDb } from \"../db/client-node\";\nimport { dependencies, tasks } from \"../db/schema\";\nimport { generateUuid } from \"../utils/id-generator\";\nimport type { Dependency } from \"../types\";\n\nexport async function addDependency(taskId: string, dependsOnId: string): Promise<Dependency> {\n const db = await getDb();\n\n // Validate both tasks exist\n const task = await db.select().from(tasks).where(eq(tasks.id, taskId)).get();\n // Workaround for drizzle-orm sqlite-proxy bug: empty result returns object with undefined values\n if (!task || task.id === undefined) {\n throw new Error(`Task not found: ${taskId}`);\n }\n\n const dependsOnTask = await db\n .select()\n .from(tasks)\n .where(eq(tasks.id, dependsOnId))\n .get();\n // Workaround for drizzle-orm sqlite-proxy bug\n if (!dependsOnTask || dependsOnTask.id === undefined) {\n throw new Error(`Task not found: ${dependsOnId}`);\n }\n\n // Can't depend on itself\n if (taskId === dependsOnId) {\n throw new Error(\"A task cannot depend on itself.\");\n }\n\n // Check if dependency already exists\n const existingDeps = await db\n .select()\n .from(dependencies)\n .where(eq(dependencies.taskId, taskId))\n .all();\n\n const existing = existingDeps.find((d) => d.dependsOnId === dependsOnId);\n\n if (existing) {\n throw new Error(`Dependency already exists: ${taskId} → ${dependsOnId}`);\n }\n\n // Check for cycles\n if (await wouldCreateCycle(taskId, dependsOnId)) {\n throw new Error(\n `Adding this dependency would create a cycle. ${dependsOnId} already depends on ${taskId} (directly or transitively).`\n );\n }\n\n const id = generateUuid();\n const now = new Date();\n\n const dependency = {\n id,\n taskId,\n dependsOnId,\n createdAt: now,\n };\n\n await db.insert(dependencies).values(dependency);\n\n return dependency as Dependency;\n}\n\nexport async function removeDependency(taskId: string, dependsOnId: string): Promise<void> {\n const db = await getDb();\n\n const existingDeps = await db\n .select()\n .from(dependencies)\n .where(eq(dependencies.taskId, taskId))\n .all();\n\n const existing = existingDeps.find((d) => d.dependsOnId === dependsOnId);\n\n if (!existing) {\n throw new Error(`Dependency not found: ${taskId} → ${dependsOnId}`);\n }\n\n await db.delete(dependencies).where(eq(dependencies.id, existing.id));\n}\n\nexport async function getDependencies(taskId: string): Promise<{\n dependsOn: Array<{ taskId: string; dependsOnId: string }>;\n blocks: Array<{ taskId: string; dependsOnId: string }>;\n}> {\n const db = await getDb();\n\n // Tasks that this task depends on\n const dependsOn = await db\n .select({\n taskId: dependencies.taskId,\n dependsOnId: dependencies.dependsOnId,\n })\n .from(dependencies)\n .where(eq(dependencies.taskId, taskId))\n .all();\n\n // Tasks that are blocked by this task\n const blocks = await db\n .select({\n taskId: dependencies.taskId,\n dependsOnId: dependencies.dependsOnId,\n })\n .from(dependencies)\n .where(eq(dependencies.dependsOnId, taskId))\n .all();\n\n return { dependsOn, blocks };\n}\n\nasync function wouldCreateCycle(taskId: string, dependsOnId: string): Promise<boolean> {\n const db = await getDb();\n\n // Use DFS to check if dependsOnId can reach taskId\n // If so, adding taskId → dependsOnId would create a cycle\n const visited = new Set<string>();\n const stack = [dependsOnId];\n\n while (stack.length > 0) {\n const current = stack.pop()!;\n\n if (current === taskId) {\n return true; // Found a path from dependsOnId to taskId\n }\n\n if (visited.has(current)) {\n continue;\n }\n visited.add(current);\n\n // Get all tasks that `current` depends on\n const deps = await db\n .select({ dependsOnId: dependencies.dependsOnId })\n .from(dependencies)\n .where(eq(dependencies.taskId, current))\n .all();\n\n for (const dep of deps) {\n if (!visited.has(dep.dependsOnId)) {\n stack.push(dep.dependsOnId);\n }\n }\n }\n\n return false;\n}\n\nexport async function getAllDependencies(): Promise<Array<{\n taskId: string;\n dependsOnId: string;\n}>> {\n const db = await getDb();\n return await db\n .select({\n taskId: dependencies.taskId,\n dependsOnId: dependencies.dependsOnId,\n })\n .from(dependencies)\n .all();\n}\n","import { Command } from \"commander\";\n\nconst QUICKSTART_TEXT = `# Trekker Quickstart\n\nIssue tracker for AI agents. Data stored in \\`.trekker/trekker.db\\`.\n\n## Setup\ntrekker init # Initialize\ntrekker wipe -y # Remove all data\n\n## Core Rules\n1. Set status to \\`in_progress\\` when starting, \\`completed\\` when done\n2. Add summary comment before marking task complete\n3. Use \\`--toon\\` flag for token-efficient output\n4. When epic is done, use \\`trekker epic complete EPIC-n\\` to archive all tasks\n5. Write detailed descriptions with implementation plans - future agents need this context\n6. Comments are your external memory - add summaries before context resets\n\n## Commands\n\n### Epics (features/milestones)\ntrekker epic create -t \"Title\" [-d \"desc\"] [-p 0-5]\ntrekker epic list [--status <status>]\ntrekker epic show EPIC-1\ntrekker epic update EPIC-1 [-t \"Title\"] [-d \"desc\"] [-p 0-5] [-s <status>]\ntrekker epic complete EPIC-1 # Complete and archive all tasks\ntrekker epic delete EPIC-1\n\n### Tasks\ntrekker task create -t \"Title\" [-d \"desc\"] [-p 0-5] [-e EPIC-1] [--tags \"a,b\"]\ntrekker task list [--status <status>] [--epic EPIC-1]\ntrekker task show TREK-1\ntrekker task update TREK-1 [-t \"Title\"] [-d \"desc\"] [-p 0-5] [-s <status>] [--tags \"a,b\"] [-e EPIC-1] [--no-epic]\ntrekker task delete TREK-1\n\n### Subtasks\ntrekker subtask create TREK-1 -t \"Title\" [-d \"desc\"] [-p 0-5]\ntrekker subtask list TREK-1\ntrekker subtask update TREK-2 [-t \"Title\"] [-d \"desc\"] [-p 0-5] [-s <status>]\ntrekker subtask delete TREK-2\n\n### Comments (external memory)\ntrekker comment add TREK-1 -a \"agent\" -c \"content\"\ntrekker comment list TREK-1\ntrekker comment update CMT-1 -c \"new content\"\ntrekker comment delete CMT-1\n\n### Dependencies\ntrekker dep add TREK-2 TREK-1 # TREK-2 depends on TREK-1\ntrekker dep remove TREK-2 TREK-1\ntrekker dep list TREK-1\n\n### Search (full-text across all entities)\ntrekker search \"query\" [--type epic,task,subtask,comment] [--status <status>]\ntrekker search \"auth bug\" --type task --limit 10\n\n### History (audit log of all changes)\ntrekker history [--entity TREK-1] [--type task] [--action create,update,delete]\ntrekker history --since 2025-01-01 --limit 20\n\n### List (unified view of all items)\ntrekker list [--type epic,task,subtask] [--status <status>] [--priority 0,1]\ntrekker list --sort priority:asc,created:desc --limit 20\n\n## Status Values\nTasks: todo, in_progress, completed, wont_fix, archived\nEpics: todo, in_progress, completed, archived\n\n## Priority Scale\n0=critical, 1=high, 2=medium (default), 3=low, 4=backlog, 5=someday\n\n## Agent Workflow\n\n\\`\\`\\`mermaid\nflowchart TD\n A[Start Session] --> B[Check in_progress tasks]\n B --> C{Found task?}\n C -->|Yes| D[Read task + comments]\n C -->|No| E[Pick next from backlog]\n D --> F[Work on task]\n E --> F\n F --> G{Switching context?}\n G -->|Yes| H[Add checkpoint comment]\n G -->|No| I{Task done?}\n H --> J[End or continue]\n I -->|Yes| K[Add summary comment]\n I -->|No| F\n K --> L[Mark completed]\n L --> M{All epic tasks done?}\n M -->|Yes| N[trekker epic complete]\n M -->|No| E\n N --> E\n\\`\\`\\`\n\n## Session Start\ntrekker --toon task list --status in_progress\ntrekker --toon comment list TREK-1\n\n## Working\ntrekker task update TREK-1 -s in_progress\ntrekker comment add TREK-1 -a \"agent\" -c \"Analysis: ...\"\n# ... do work ...\ntrekker comment add TREK-1 -a \"agent\" -c \"Summary: implemented X in files A, B\"\ntrekker task update TREK-1 -s completed\n\n## Before Context Reset\ntrekker comment add TREK-1 -a \"agent\" -c \"Checkpoint: done A,B. Next: C. Files: x.ts, y.ts\"\n\n## Writing Effective Descriptions\n\nGood descriptions help future agents continue your work:\n\n### Epic descriptions should include:\n- Goal and success criteria\n- High-level implementation approach\n- Key files/modules affected\n\n### Task descriptions should include:\n- What needs to be done (specific, actionable)\n- Implementation steps\n- Files to create/modify\n- Acceptance criteria\n\n### Example:\nBad: \"Add authentication\"\nGood: \"Implement JWT auth for API.\n- Add /auth/login, /auth/logout endpoints\n- Create middleware in src/middleware/auth.ts\n- Use bcrypt for password hashing\n- Protect: /api/users, /api/tasks\"\n`;\n\nexport const quickstartCommand = new Command(\"quickstart\")\n .description(\"Show quick reference for AI agents\")\n .action(() => {\n console.log(QUICKSTART_TEXT);\n });\n","import { Command } from \"commander\";\nimport { isTrekkerInitialized } from \"../services/project\";\nimport { createEpic } from \"../services/epic\";\nimport { createTask } from \"../services/task\";\nimport { addDependency } from \"../services/dependency\";\nimport { success, error, info } from \"../utils/output\";\nimport type { Priority } from \"../types\";\n\nconst SAMPLE_EPICS: Array<{ title: string; description: string; priority: Priority; status: string }> = [\n {\n title: \"User Authentication\",\n description: \"Implement user authentication and authorization system\",\n priority: 0,\n status: \"in_progress\",\n },\n {\n title: \"Dashboard\",\n description: \"Build the main dashboard with analytics and metrics\",\n priority: 1,\n status: \"todo\",\n },\n {\n title: \"API Development\",\n description: \"Design and implement RESTful API endpoints\",\n priority: 1,\n status: \"in_progress\",\n },\n {\n title: \"Testing & QA\",\n description: \"Set up testing infrastructure and write tests\",\n priority: 2,\n status: \"todo\",\n },\n];\n\nconst SAMPLE_TASKS: Array<{ epicIndex: number | null; title: string; description: string; priority: Priority; status: string; tags: string }> = [\n // Auth tasks\n {\n epicIndex: 0,\n title: \"Set up OAuth 2.0 provider\",\n description: \"Configure OAuth 2.0 with Google and GitHub providers\",\n priority: 0,\n status: \"completed\",\n tags: \"backend,security\",\n },\n {\n epicIndex: 0,\n title: \"Implement JWT token handling\",\n description: \"Create JWT generation, validation, and refresh logic\",\n priority: 1,\n status: \"in_progress\",\n tags: \"backend,security\",\n },\n {\n epicIndex: 0,\n title: \"Build login page\",\n description: \"Create responsive login page with social login buttons\",\n priority: 1,\n status: \"todo\",\n tags: \"frontend,ui\",\n },\n {\n epicIndex: 0,\n title: \"Add password reset flow\",\n description: \"Implement forgot password and reset password functionality\",\n priority: 2,\n status: \"todo\",\n tags: \"backend,frontend\",\n },\n // Dashboard tasks\n {\n epicIndex: 1,\n title: \"Design dashboard layout\",\n description: \"Create wireframes and mockups for the main dashboard\",\n priority: 1,\n status: \"completed\",\n tags: \"design,ui\",\n },\n {\n epicIndex: 1,\n title: \"Implement chart components\",\n description: \"Build reusable chart components using Chart.js\",\n priority: 2,\n status: \"in_progress\",\n tags: \"frontend,ui\",\n },\n {\n epicIndex: 1,\n title: \"Add real-time data updates\",\n description: \"Implement WebSocket connection for live dashboard updates\",\n priority: 2,\n status: \"todo\",\n tags: \"frontend,backend\",\n },\n // API tasks\n {\n epicIndex: 2,\n title: \"Define API schema\",\n description: \"Document API endpoints using OpenAPI specification\",\n priority: 1,\n status: \"completed\",\n tags: \"backend,docs\",\n },\n {\n epicIndex: 2,\n title: \"Implement user endpoints\",\n description: \"Create CRUD endpoints for user management\",\n priority: 1,\n status: \"completed\",\n tags: \"backend\",\n },\n {\n epicIndex: 2,\n title: \"Add rate limiting\",\n description: \"Implement rate limiting middleware for API protection\",\n priority: 2,\n status: \"in_progress\",\n tags: \"backend,security\",\n },\n {\n epicIndex: 2,\n title: \"Set up API versioning\",\n description: \"Implement v1/v2 API versioning strategy\",\n priority: 3,\n status: \"todo\",\n tags: \"backend\",\n },\n // Testing tasks\n {\n epicIndex: 3,\n title: \"Set up Jest testing framework\",\n description: \"Configure Jest with TypeScript support\",\n priority: 1,\n status: \"completed\",\n tags: \"testing,devops\",\n },\n {\n epicIndex: 3,\n title: \"Write unit tests for auth module\",\n description: \"Create comprehensive unit tests for authentication logic\",\n priority: 2,\n status: \"todo\",\n tags: \"testing\",\n },\n {\n epicIndex: 3,\n title: \"Set up E2E testing with Playwright\",\n description: \"Configure Playwright for end-to-end testing\",\n priority: 3,\n status: \"todo\",\n tags: \"testing,devops\",\n },\n // Tasks without epic\n {\n epicIndex: null,\n title: \"Update README documentation\",\n description: \"Add installation instructions and usage examples\",\n priority: 3,\n status: \"todo\",\n tags: \"docs\",\n },\n {\n epicIndex: null,\n title: \"Configure CI/CD pipeline\",\n description: \"Set up GitHub Actions for automated testing and deployment\",\n priority: 2,\n status: \"in_progress\",\n tags: \"devops\",\n },\n];\n\nconst SAMPLE_SUBTASKS: Array<{ parentIndex: number; title: string; status: string; priority: Priority }> = [\n {\n parentIndex: 1, // JWT token handling\n title: \"Implement access token generation\",\n status: \"completed\",\n priority: 1,\n },\n {\n parentIndex: 1,\n title: \"Implement refresh token logic\",\n status: \"in_progress\",\n priority: 1,\n },\n {\n parentIndex: 1,\n title: \"Add token blacklisting\",\n status: \"todo\",\n priority: 2,\n },\n {\n parentIndex: 5, // Chart components\n title: \"Create bar chart component\",\n status: \"completed\",\n priority: 2,\n },\n {\n parentIndex: 5,\n title: \"Create line chart component\",\n status: \"in_progress\",\n priority: 2,\n },\n {\n parentIndex: 5,\n title: \"Create pie chart component\",\n status: \"todo\",\n priority: 3,\n },\n];\n\n// Dependencies: [taskIndex, dependsOnTaskIndex]\nconst SAMPLE_DEPENDENCIES = [\n [2, 1], // Login page depends on JWT handling\n [3, 1], // Password reset depends on JWT handling\n [6, 5], // Real-time updates depends on chart components\n [6, 4], // Real-time updates depends on dashboard layout\n [9, 8], // Rate limiting depends on user endpoints\n [12, 11], // Unit tests for auth depends on Jest setup\n [13, 11], // E2E testing depends on Jest setup\n];\n\nexport const seedCommand = new Command(\"seed\")\n .description(\"Seed the database with sample data (development only)\")\n .option(\"--force\", \"Skip confirmation prompt\")\n .action(async (options) => {\n try {\n if (!isTrekkerInitialized()) {\n error(\"Trekker is not initialized. Run 'trekker init' first.\");\n process.exit(1);\n }\n\n if (!options.force) {\n info(\"This will create sample epics, tasks, and dependencies.\");\n info(\"Use --force to skip this confirmation.\\n\");\n }\n\n const epicIds: string[] = [];\n const taskIds: string[] = [];\n\n // Create epics\n info(\"Creating epics...\");\n for (const epicData of SAMPLE_EPICS) {\n const epic = await createEpic({\n title: epicData.title,\n description: epicData.description,\n priority: epicData.priority,\n status: epicData.status as \"todo\" | \"in_progress\" | \"completed\",\n });\n epicIds.push(epic.id);\n info(` Created ${epic.id}: ${epic.title}`);\n }\n\n // Create tasks\n info(\"\\nCreating tasks...\");\n for (const taskData of SAMPLE_TASKS) {\n const task = await createTask({\n title: taskData.title,\n description: taskData.description,\n priority: taskData.priority,\n status: taskData.status as \"todo\" | \"in_progress\" | \"completed\",\n tags: taskData.tags,\n epicId: taskData.epicIndex !== null ? epicIds[taskData.epicIndex] : undefined,\n });\n taskIds.push(task.id);\n info(` Created ${task.id}: ${task.title}`);\n }\n\n // Create subtasks\n info(\"\\nCreating subtasks...\");\n for (const subtaskData of SAMPLE_SUBTASKS) {\n const subtask = await createTask({\n title: subtaskData.title,\n priority: subtaskData.priority,\n status: subtaskData.status as \"todo\" | \"in_progress\" | \"completed\",\n parentTaskId: taskIds[subtaskData.parentIndex],\n });\n info(` Created ${subtask.id}: ${subtask.title} (subtask of ${taskIds[subtaskData.parentIndex]})`);\n }\n\n // Create dependencies\n info(\"\\nCreating dependencies...\");\n for (const [taskIndex, dependsOnIndex] of SAMPLE_DEPENDENCIES) {\n const taskId = taskIds[taskIndex];\n const dependsOnId = taskIds[dependsOnIndex];\n await addDependency(taskId, dependsOnId);\n info(` ${taskId} depends on ${dependsOnId}`);\n }\n\n success(`\\nSeed complete! Created ${epicIds.length} epics, ${taskIds.length} tasks, ${SAMPLE_SUBTASKS.length} subtasks, and ${SAMPLE_DEPENDENCIES.length} dependencies.`);\n } catch (err) {\n error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport {\n search,\n rebuildSearchIndex,\n hybridSearch,\n SEARCH_MODES,\n type SearchMode,\n} from \"../services/search\";\nimport type {\n SearchEntityType,\n SearchResponse,\n HybridSearchResponse,\n} from \"../services/search\";\nimport {\n semanticSearch,\n type SemanticSearchResponse,\n} from \"../services/semantic-search\";\nimport { countEmbeddings } from \"../db/vectors\";\nimport { handleCommandError, outputResult, warn } from \"../utils/output\";\nimport { validatePagination, validateSearchEntityTypes } from \"../utils/validator\";\n\nexport const searchCommand = new Command(\"search\")\n .description(\"Search across epics, tasks, subtasks, and comments\")\n .argument(\"<query>\", \"Search query (supports FTS5 syntax for keyword mode)\")\n .option(\"--type <types>\", \"Filter by type: epic,task,subtask,comment (comma-separated)\")\n .option(\"--status <status>\", \"Filter by status\")\n .option(\"--limit <n>\", \"Results per page (default: 20)\", \"20\")\n .option(\"--page <n>\", \"Page number (default: 1)\", \"1\")\n .option(\"--mode <mode>\", \"Search mode: semantic, keyword, or hybrid (default: semantic)\", \"semantic\")\n .option(\"--rebuild-index\", \"Rebuild the search index before searching\")\n .action(async (query, options) => {\n try {\n if (options.rebuildIndex) {\n await rebuildSearchIndex();\n }\n\n const limit = parseInt(options.limit, 10);\n const page = parseInt(options.page, 10);\n validatePagination(limit, page);\n\n const mode = options.mode as SearchMode;\n if (!SEARCH_MODES.includes(mode)) {\n throw new Error(\n `Invalid search mode: ${mode}. Valid modes: ${SEARCH_MODES.join(\", \")}`\n );\n }\n\n const types = options.type\n ? options.type.split(\",\").map((t: string) => t.trim())\n : undefined;\n\n if (types) validateSearchEntityTypes(types);\n\n const searchOptions = {\n types: types as SearchEntityType[] | undefined,\n status: options.status,\n limit,\n page,\n };\n\n if (mode === \"keyword\") {\n const result = await search(query, searchOptions);\n outputResult(result, formatSearchResults);\n return;\n }\n\n if (mode === \"semantic\") {\n const result = await semanticSearch(query, { ...searchOptions, threshold: 0.5 });\n\n // Warn if embeddings are empty (migrated DB without auto-indexed data)\n if (result.results.length === 0) {\n const embeddingCount = await countEmbeddings();\n if (embeddingCount === 0) {\n warn(\"No embeddings found. Create some tasks/epics to enable semantic search.\");\n }\n }\n\n outputResult(result, formatSemanticSearchResults);\n return;\n }\n\n // hybrid mode\n const result = await hybridSearch(query, searchOptions);\n outputResult(result, formatHybridSearchResults);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\nfunction formatSearchResults(result: SearchResponse): string {\n const lines: string[] = [];\n\n lines.push(`Search: \"${result.query}\"`);\n lines.push(`Found ${result.total} results (page ${result.page}, ${result.limit} per page)`);\n lines.push(\"\");\n\n if (result.results.length === 0) {\n lines.push(\"No results found.\");\n return lines.join(\"\\n\");\n }\n\n for (const r of result.results) {\n const typeLabel = r.type.toUpperCase().padEnd(7);\n const statusLabel = r.status ? ` [${r.status}]` : \"\";\n const parentLabel = r.parentId ? ` (parent: ${r.parentId})` : \"\";\n\n lines.push(`${typeLabel} ${r.id}${statusLabel}${parentLabel}`);\n if (r.title) {\n lines.push(` Title: ${r.title}`);\n }\n lines.push(` ${r.snippet}`);\n lines.push(\"\");\n }\n\n const totalPages = Math.ceil(result.total / result.limit);\n if (totalPages > 1) {\n lines.push(`Page ${result.page} of ${totalPages}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction getScoreLabel(score: number): string {\n const percent = Math.round(score * 100);\n if (percent >= 95) return `${percent}% relevance (exact)`;\n if (percent >= 85) return `${percent}% relevance (very high)`;\n if (percent >= 75) return `${percent}% relevance (high)`;\n if (percent >= 60) return `${percent}% relevance (moderate)`;\n return `${percent}% relevance (low)`;\n}\n\nfunction formatHybridSearchResults(result: HybridSearchResponse): string {\n const lines: string[] = [];\n\n lines.push(`Hybrid Search: \"${result.query}\"`);\n lines.push(`Found ${result.total} results (page ${result.page}, ${result.limit} per page)`);\n lines.push(\"\");\n\n if (result.results.length === 0) {\n lines.push(\"No results found.\");\n return lines.join(\"\\n\");\n }\n\n for (const r of result.results) {\n const typeLabel = r.type.toUpperCase().padEnd(7);\n const scoreLabel = getScoreLabel(r.score);\n const statusLabel = r.status ? ` [${r.status}]` : \"\";\n const parentLabel = r.parentId ? ` (parent: ${r.parentId})` : \"\";\n\n lines.push(`${typeLabel} ${r.id} | ${scoreLabel}${statusLabel}${parentLabel}`);\n if (r.title) {\n lines.push(` Title: ${r.title}`);\n }\n lines.push(` ${r.snippet}`);\n lines.push(\"\");\n }\n\n const totalPages = Math.ceil(result.total / result.limit);\n if (totalPages > 1) {\n lines.push(`Page ${result.page} of ${totalPages}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction getSimilarityLabel(similarity: number): string {\n const percent = Math.round(similarity * 100);\n if (percent >= 95) return `${percent}% match (exact)`;\n if (percent >= 85) return `${percent}% match (very high)`;\n if (percent >= 75) return `${percent}% match (high)`;\n if (percent >= 60) return `${percent}% match (moderate)`;\n return `${percent}% match (low)`;\n}\n\nfunction formatSemanticSearchResults(result: SemanticSearchResponse): string {\n const lines: string[] = [];\n\n lines.push(`Search: \"${result.query}\"`);\n lines.push(`Found ${result.total} results (page ${result.page}, ${result.limit} per page)`);\n lines.push(\"\");\n\n if (result.results.length === 0) {\n lines.push(\"No results found.\");\n return lines.join(\"\\n\");\n }\n\n for (const r of result.results) {\n const typeLabel = r.type.toUpperCase().padEnd(7);\n const similarityLabel = getSimilarityLabel(r.similarity);\n const statusLabel = r.status ? ` [${r.status}]` : \"\";\n const parentLabel = r.parentId ? ` (parent: ${r.parentId})` : \"\";\n\n lines.push(`${typeLabel} ${r.id} | ${similarityLabel}${statusLabel}${parentLabel}`);\n if (r.title) {\n lines.push(` Title: ${r.title}`);\n }\n if (r.description) {\n const desc = r.description.length > 100 ? r.description.substring(0, 100) + \"...\" : r.description;\n lines.push(` Desc: ${desc}`);\n }\n lines.push(\"\");\n }\n\n const totalPages = Math.ceil(result.total / result.limit);\n if (totalPages > 1) {\n lines.push(`Page ${result.page} of ${totalPages}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { getDb, requireSqliteInstance } from \"../db/client-node\";\nimport { PAGINATION_DEFAULTS, type SearchEntityType } from \"../types\";\nimport { semanticSearch } from \"./semantic-search\";\n\nexport type { SearchEntityType };\n\n/**\n * Normalize a score to 0-1 range.\n * Returns 1 if range is 0 (all scores equal).\n */\nfunction normalizeScore(score: number, min: number, range: number): number {\n if (range === 0) return 1;\n return (score - min) / range;\n}\n\nexport const SEARCH_MODES = [\"keyword\", \"semantic\", \"hybrid\"] as const;\nexport type SearchMode = (typeof SEARCH_MODES)[number];\n\nexport interface SearchOptions {\n types?: SearchEntityType[];\n status?: string;\n limit?: number;\n page?: number;\n mode?: SearchMode;\n}\n\nexport interface SearchResult {\n type: SearchEntityType;\n id: string;\n title: string | null;\n snippet: string;\n score: number;\n status: string | null;\n parentId: string | null;\n}\n\nexport interface SearchResponse {\n query: string;\n total: number;\n page: number;\n limit: number;\n results: SearchResult[];\n}\n\n/**\n * Create a snippet from text highlighting the matched query.\n * Returns text around the first match with ** markers.\n */\nfunction createSnippet(text: string | null, query: string, maxLength = 100): string {\n if (!text) return \"\";\n\n const lowerText = text.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const matchIndex = lowerText.indexOf(lowerQuery);\n\n if (matchIndex === -1) {\n return text.length > maxLength ? text.substring(0, maxLength) + \"...\" : text;\n }\n\n // Get context around the match\n const start = Math.max(0, matchIndex - 30);\n const end = Math.min(text.length, matchIndex + query.length + 30);\n\n let snippet = \"\";\n if (start > 0) snippet += \"...\";\n snippet += text.substring(start, matchIndex);\n snippet += \"**\" + text.substring(matchIndex, matchIndex + query.length) + \"**\";\n snippet += text.substring(matchIndex + query.length, end);\n if (end < text.length) snippet += \"...\";\n\n return snippet;\n}\n\n/**\n * Calculate a simple relevance score based on matches.\n * Higher score = more relevant (title match > description match).\n */\nfunction calculateScore(\n title: string | null,\n content: string | null,\n query: string\n): number {\n const lowerQuery = query.toLowerCase();\n let score = 0;\n\n if (title) {\n const lowerTitle = title.toLowerCase();\n if (lowerTitle === lowerQuery) {\n score += 100; // Exact title match\n } else if (lowerTitle.includes(lowerQuery)) {\n score += 50; // Partial title match\n }\n }\n\n if (content) {\n const lowerContent = content.toLowerCase();\n if (lowerContent.includes(lowerQuery)) {\n // Count occurrences\n const matches = lowerContent.split(lowerQuery).length - 1;\n score += Math.min(matches * 5, 25); // Up to 25 points for content matches\n }\n }\n\n return score;\n}\n\nexport async function search(query: string, options?: SearchOptions): Promise<SearchResponse> {\n // Initialize database first (async with sql.js)\n await getDb();\n const sqlite = requireSqliteInstance();\n\n const limit = options?.limit ?? PAGINATION_DEFAULTS.SEARCH_PAGE_SIZE;\n const page = options?.page ?? PAGINATION_DEFAULTS.DEFAULT_PAGE;\n const offset = (page - 1) * limit;\n const likePattern = `%${query}%`;\n\n // Determine which types to search\n const types = options?.types ?? [\"epic\", \"task\", \"subtask\", \"comment\"];\n\n interface RawResult {\n entity_id: string;\n entity_type: SearchEntityType;\n title: string | null;\n content: string | null;\n status: string | null;\n parent_id: string | null;\n }\n\n const allResults: RawResult[] = [];\n\n // Search epics\n if (types.includes(\"epic\")) {\n const epicConditions = [\"(title LIKE ? OR description LIKE ?)\"];\n const epicParams: (string | number)[] = [likePattern, likePattern];\n\n if (options?.status) {\n epicConditions.push(\"status = ?\");\n epicParams.push(options.status);\n }\n\n const epicSql = `\n SELECT id as entity_id, 'epic' as entity_type, title, description as content, status, NULL as parent_id\n FROM epics\n WHERE ${epicConditions.join(\" AND \")}\n `;\n const stmt = sqlite.prepare(epicSql);\n stmt.bind(epicParams);\n while (stmt.step()) {\n allResults.push(stmt.getAsObject() as unknown as RawResult);\n }\n stmt.free();\n }\n\n // Search tasks (non-subtasks)\n if (types.includes(\"task\")) {\n const taskConditions = [\"parent_task_id IS NULL\", \"(title LIKE ? OR description LIKE ?)\"];\n const taskParams: (string | number)[] = [likePattern, likePattern];\n\n if (options?.status) {\n taskConditions.push(\"status = ?\");\n taskParams.push(options.status);\n }\n\n const taskSql = `\n SELECT id as entity_id, 'task' as entity_type, title, description as content, status, epic_id as parent_id\n FROM tasks\n WHERE ${taskConditions.join(\" AND \")}\n `;\n const stmt = sqlite.prepare(taskSql);\n stmt.bind(taskParams);\n while (stmt.step()) {\n allResults.push(stmt.getAsObject() as unknown as RawResult);\n }\n stmt.free();\n }\n\n // Search subtasks\n if (types.includes(\"subtask\")) {\n const subtaskConditions = [\"parent_task_id IS NOT NULL\", \"(title LIKE ? OR description LIKE ?)\"];\n const subtaskParams: (string | number)[] = [likePattern, likePattern];\n\n if (options?.status) {\n subtaskConditions.push(\"status = ?\");\n subtaskParams.push(options.status);\n }\n\n const subtaskSql = `\n SELECT id as entity_id, 'subtask' as entity_type, title, description as content, status, parent_task_id as parent_id\n FROM tasks\n WHERE ${subtaskConditions.join(\" AND \")}\n `;\n const stmt = sqlite.prepare(subtaskSql);\n stmt.bind(subtaskParams);\n while (stmt.step()) {\n allResults.push(stmt.getAsObject() as unknown as RawResult);\n }\n stmt.free();\n }\n\n // Search comments\n if (types.includes(\"comment\")) {\n const commentConditions = [\"content LIKE ?\"];\n const commentParams: (string | number)[] = [likePattern];\n\n // Comments don't have status, so we skip status filter for comments\n\n const commentSql = `\n SELECT id as entity_id, 'comment' as entity_type, NULL as title, content, NULL as status, task_id as parent_id\n FROM comments\n WHERE ${commentConditions.join(\" AND \")}\n `;\n const stmt = sqlite.prepare(commentSql);\n stmt.bind(commentParams);\n while (stmt.step()) {\n allResults.push(stmt.getAsObject() as unknown as RawResult);\n }\n stmt.free();\n }\n\n // Calculate scores and sort\n const scoredResults = allResults.map((r) => ({\n ...r,\n score: calculateScore(r.title, r.content, query),\n snippet: createSnippet(r.title || r.content, query),\n }));\n\n // Sort by score descending\n scoredResults.sort((a, b) => b.score - a.score);\n\n // Apply pagination\n const total = scoredResults.length;\n const paginatedResults = scoredResults.slice(offset, offset + limit);\n\n return {\n query,\n total,\n page,\n limit,\n results: paginatedResults.map((row) => ({\n type: row.entity_type,\n id: row.entity_id,\n title: row.title,\n snippet: row.snippet,\n score: row.score,\n status: row.status || null,\n parentId: row.parent_id || null,\n })),\n };\n}\n\n/**\n * Rebuild search index - no-op for LIKE-based search.\n * Kept for API compatibility.\n */\nexport function rebuildSearchIndex(): void {\n // No-op: LIKE-based search doesn't need a separate index\n}\n\n/**\n * Hybrid search result with combined score\n */\nexport interface HybridSearchResult {\n type: SearchEntityType;\n id: string;\n title: string | null;\n snippet: string;\n score: number;\n status: string | null;\n parentId: string | null;\n keywordScore?: number;\n semanticScore?: number;\n}\n\nexport interface HybridSearchResponse {\n query: string;\n total: number;\n page: number;\n limit: number;\n mode: \"hybrid\";\n results: HybridSearchResult[];\n}\n\n/**\n * Hybrid search combining FTS5 keyword search with semantic similarity.\n *\n * Algorithm:\n * 1. Get keyword results (FTS5) with limit * 2\n * 2. Get semantic results with limit * 2, threshold 0.4\n * 3. Combine and dedupe by entity ID\n * 4. Calculate hybrid score: alpha * normalized_fts5 + (1 - alpha) * semantic\n * 5. Sort by hybrid score descending\n * 6. Apply pagination\n */\nexport async function hybridSearch(\n query: string,\n options?: SearchOptions\n): Promise<HybridSearchResponse> {\n const limit = options?.limit ?? PAGINATION_DEFAULTS.SEARCH_PAGE_SIZE;\n const page = options?.page ?? PAGINATION_DEFAULTS.DEFAULT_PAGE;\n const offset = (page - 1) * limit;\n const expandedLimit = limit * 2;\n const alpha = 0.3; // Favor semantic (1 - 0.3 = 0.7 weight)\n\n // Get keyword results\n const keywordResults = await search(query, {\n types: options?.types,\n status: options?.status,\n limit: expandedLimit,\n page: 1,\n });\n\n // Get semantic results\n const semanticResults = await semanticSearch(query, {\n types: options?.types,\n status: options?.status,\n limit: expandedLimit,\n page: 1,\n threshold: 0.4,\n });\n\n // Build a map of all unique entities with their scores\n const entityMap = new Map<\n string,\n {\n type: SearchEntityType;\n id: string;\n title: string | null;\n snippet: string;\n status: string | null;\n parentId: string | null;\n keywordScore?: number;\n semanticScore?: number;\n }\n >();\n\n // Normalize FTS5 scores to 0-1 range where 1 is best\n const scores = keywordResults.results.map((r) => r.score);\n const minFtsScore = scores.length > 0 ? Math.min(...scores) : 0;\n const maxFtsScore = scores.length > 0 ? Math.max(...scores) : 0;\n const ftsRange = maxFtsScore - minFtsScore;\n\n // Add keyword results\n for (const r of keywordResults.results) {\n const normalizedFts = normalizeScore(r.score, minFtsScore, ftsRange);\n\n entityMap.set(r.id, {\n type: r.type,\n id: r.id,\n title: r.title,\n snippet: r.snippet,\n status: r.status,\n parentId: r.parentId,\n keywordScore: normalizedFts,\n });\n }\n\n // Add semantic results, merging with existing keyword results\n for (const r of semanticResults.results) {\n const existing = entityMap.get(r.id);\n if (existing) {\n existing.semanticScore = r.similarity;\n } else {\n // Need to get snippet for semantic-only results\n const snippet = r.title || \"\";\n entityMap.set(r.id, {\n type: r.type,\n id: r.id,\n title: r.title,\n snippet,\n status: r.status,\n parentId: r.parentId,\n semanticScore: r.similarity,\n });\n }\n }\n\n // Calculate hybrid scores and sort\n const results: HybridSearchResult[] = [];\n for (const entity of entityMap.values()) {\n // For entities with only one type of score, the missing score defaults to 0.\n // This naturally penalizes entities that only appear in one search type.\n const keywordScore = entity.keywordScore ?? 0;\n const semanticScore = entity.semanticScore ?? 0;\n\n // Calculate hybrid score\n const hybridScore = alpha * keywordScore + (1 - alpha) * semanticScore;\n\n results.push({\n type: entity.type,\n id: entity.id,\n title: entity.title,\n snippet: entity.snippet,\n score: hybridScore,\n status: entity.status,\n parentId: entity.parentId,\n keywordScore,\n semanticScore,\n });\n }\n\n // Sort by hybrid score descending\n results.sort((a, b) => b.score - a.score);\n\n // Apply pagination\n const total = results.length;\n const paginatedResults = results.slice(offset, offset + limit);\n\n return {\n query,\n total,\n page,\n limit,\n mode: \"hybrid\",\n results: paginatedResults,\n };\n}\n","import { Command } from \"commander\";\nimport dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat.js\";\nimport { getHistory } from \"../services/history\";\n\ndayjs.extend(customParseFormat);\nimport type { HistoryEntityType, HistoryAction, HistoryResponse, HistoryEvent } from \"../services/history\";\nimport { error, output, isToonMode } from \"../utils/output\";\n\nexport const historyCommand = new Command(\"history\")\n .description(\"View history of all changes (creates, updates, deletes)\")\n .option(\"--entity <id>\", \"Filter by entity ID (e.g., TREK-1, EPIC-1)\")\n .option(\"--type <types>\", \"Filter by type: epic,task,subtask,comment,dependency (comma-separated)\")\n .option(\"--action <actions>\", \"Filter by action: create,update,delete (comma-separated)\")\n .option(\"--since <date>\", \"Events after date (YYYY-MM-DD)\")\n .option(\"--until <date>\", \"Events before date (YYYY-MM-DD)\")\n .option(\"--limit <n>\", \"Results per page (default: 50)\", \"50\")\n .option(\"--page <n>\", \"Page number (default: 1)\", \"1\")\n .action(async (options) => {\n try {\n const types = options.type\n ? (options.type.split(\",\").map((t: string) => t.trim()) as HistoryEntityType[])\n : undefined;\n\n const actions = options.action\n ? (options.action.split(\",\").map((a: string) => a.trim()) as HistoryAction[])\n : undefined;\n\n const limit = parseInt(options.limit, 10);\n const page = parseInt(options.page, 10);\n\n if (isNaN(limit) || limit < 1) {\n throw new Error(\"Invalid limit value\");\n }\n if (isNaN(page) || page < 1) {\n throw new Error(\"Invalid page value\");\n }\n\n // Validate types\n const validTypes = [\"epic\", \"task\", \"subtask\", \"comment\", \"dependency\"];\n if (types) {\n for (const t of types) {\n if (!validTypes.includes(t)) {\n throw new Error(`Invalid type: ${t}. Valid types: ${validTypes.join(\", \")}`);\n }\n }\n }\n\n // Validate actions\n const validActions = [\"create\", \"update\", \"delete\"];\n if (actions) {\n for (const a of actions) {\n if (!validActions.includes(a)) {\n throw new Error(`Invalid action: ${a}. Valid actions: ${validActions.join(\", \")}`);\n }\n }\n }\n\n // Parse dates\n let since: Date | undefined;\n let until: Date | undefined;\n\n if (options.since) {\n since = parseDate(options.since);\n if (!since) {\n throw new Error(\"Invalid since date. Use YYYY-MM-DD format.\");\n }\n }\n\n if (options.until) {\n const parsedUntil = dayjs(options.until, \"YYYY-MM-DD\", true);\n if (!parsedUntil.isValid()) {\n throw new Error(\"Invalid until date. Use YYYY-MM-DD format.\");\n }\n // Set to end of day\n until = parsedUntil.endOf(\"day\").toDate();\n }\n\n const result = await getHistory({\n entityId: options.entity,\n types,\n actions,\n since,\n until,\n limit,\n page,\n });\n\n if (isToonMode()) {\n output(result);\n } else {\n console.log(formatHistoryResults(result));\n }\n } catch (err) {\n error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nfunction parseDate(dateStr: string): Date | undefined {\n const parsed = dayjs(dateStr, \"YYYY-MM-DD\", true);\n if (!parsed.isValid()) {\n return undefined;\n }\n return parsed.toDate();\n}\n\nfunction formatHistoryResults(result: HistoryResponse): string {\n const lines: string[] = [];\n\n lines.push(`History: ${result.total} events (page ${result.page}, ${result.limit} per page)`);\n lines.push(\"\");\n\n if (result.events.length === 0) {\n lines.push(\"No events found.\");\n return lines.join(\"\\n\");\n }\n\n for (const event of result.events) {\n lines.push(formatEvent(event));\n lines.push(\"\");\n }\n\n // Pagination info\n const totalPages = Math.ceil(result.total / result.limit);\n if (totalPages > 1) {\n lines.push(`Page ${result.page} of ${totalPages}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatEvent(event: HistoryEvent): string {\n const lines: string[] = [];\n const timestamp = event.timestamp.toISOString().replace(\"T\", \" \").substring(0, 19);\n const actionLabel = event.action.toUpperCase().padEnd(6);\n const typeLabel = event.entityType.toUpperCase();\n\n lines.push(`[${timestamp}] ${actionLabel} ${typeLabel} ${event.entityId}`);\n\n if (event.action === \"update\" && event.changes) {\n for (const [field, change] of Object.entries(event.changes)) {\n const from = formatValue(change.from);\n const to = formatValue(change.to);\n lines.push(` ${field}: ${from} -> ${to}`);\n }\n } else if (event.snapshot) {\n // For create/delete, show key fields\n const snap = event.snapshot;\n if (snap.title) {\n lines.push(` title: ${snap.title}`);\n }\n if (snap.content) {\n lines.push(` content: ${truncate(String(snap.content), 60)}`);\n }\n if (snap.status) {\n lines.push(` status: ${snap.status}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return \"(none)\";\n }\n if (typeof value === \"string\") {\n return truncate(value, 40);\n }\n return String(value);\n}\n\nfunction truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) {\n return str;\n }\n return str.substring(0, maxLen - 3) + \"...\";\n}\n","import { getDb, requireSqliteInstance } from \"../db/client-node\";\nimport { PAGINATION_DEFAULTS } from \"../types\";\n\nexport type HistoryEntityType = \"epic\" | \"task\" | \"subtask\" | \"comment\" | \"dependency\";\nexport type HistoryAction = \"create\" | \"update\" | \"delete\";\n\nexport interface HistoryOptions {\n entityId?: string;\n types?: HistoryEntityType[];\n actions?: HistoryAction[];\n since?: Date;\n until?: Date;\n limit?: number;\n page?: number;\n}\n\nexport interface HistoryEvent {\n id: number;\n action: HistoryAction;\n entityType: HistoryEntityType;\n entityId: string;\n snapshot: Record<string, unknown> | null;\n changes: Record<string, { from: unknown; to: unknown }> | null;\n timestamp: Date;\n}\n\nexport interface HistoryResponse {\n total: number;\n page: number;\n limit: number;\n events: HistoryEvent[];\n}\n\nexport async function getHistory(options?: HistoryOptions): Promise<HistoryResponse> {\n // Initialize database first (async with sql.js)\n await getDb();\n const sqlite = requireSqliteInstance();\n\n const limit = options?.limit ?? PAGINATION_DEFAULTS.HISTORY_PAGE_SIZE;\n const page = options?.page ?? PAGINATION_DEFAULTS.DEFAULT_PAGE;\n const offset = (page - 1) * limit;\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const params: (string | number)[] = [];\n\n if (options?.entityId) {\n conditions.push(\"entity_id = ?\");\n params.push(options.entityId);\n }\n\n if (options?.types && options.types.length > 0) {\n const placeholders = options.types.map(() => \"?\").join(\", \");\n conditions.push(`entity_type IN (${placeholders})`);\n params.push(...options.types);\n }\n\n if (options?.actions && options.actions.length > 0) {\n const placeholders = options.actions.map(() => \"?\").join(\", \");\n conditions.push(`action IN (${placeholders})`);\n params.push(...options.actions);\n }\n\n if (options?.since) {\n conditions.push(\"created_at >= ?\");\n params.push(options.since.getTime());\n }\n\n if (options?.until) {\n conditions.push(\"created_at <= ?\");\n params.push(options.until.getTime());\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\n // Count total results\n const countSql = `SELECT COUNT(*) as total FROM events ${whereClause}`;\n const stmt1 = sqlite.prepare(countSql);\n stmt1.bind(params);\n let total = 0;\n if (stmt1.step()) {\n const row = stmt1.getAsObject();\n total = (row.total as number) ?? 0;\n }\n stmt1.free();\n\n // Get paginated results (newest first)\n const selectSql = `\n SELECT id, action, entity_type, entity_id, snapshot, changes, created_at\n FROM events\n ${whereClause}\n ORDER BY created_at DESC, id DESC\n LIMIT ? OFFSET ?\n `;\n\n const stmt2 = sqlite.prepare(selectSql);\n stmt2.bind([...params, limit, offset]);\n\n const results: Array<{\n id: number;\n action: string;\n entity_type: string;\n entity_id: string;\n snapshot: string | null;\n changes: string | null;\n created_at: number;\n }> = [];\n\n while (stmt2.step()) {\n results.push(stmt2.getAsObject() as typeof results[0]);\n }\n stmt2.free();\n\n return {\n total,\n page,\n limit,\n events: results.map((row) => ({\n id: row.id,\n action: row.action as HistoryAction,\n entityType: row.entity_type as HistoryEntityType,\n entityId: row.entity_id,\n snapshot: row.snapshot ? JSON.parse(row.snapshot) : null,\n changes: row.changes ? JSON.parse(row.changes) : null,\n timestamp: new Date(row.created_at),\n })),\n };\n}\n","import { Command } from \"commander\";\nimport dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat.js\";\nimport { listAll, parseSort } from \"../services/list\";\nimport type { ListEntityType, ListResponse, ListItem } from \"../services/list\";\nimport { handleCommandError, outputResult } from \"../utils/output\";\nimport {\n validatePagination,\n validateListEntityTypes,\n validatePriorities,\n} from \"../utils/validator\";\n\ndayjs.extend(customParseFormat);\n\nexport const listCommand = new Command(\"list\")\n .description(\"List all epics, tasks, and subtasks\")\n .option(\"--type <types>\", \"Filter by type: epic,task,subtask (comma-separated)\")\n .option(\"--status <statuses>\", \"Filter by status (comma-separated)\")\n .option(\"--priority <levels>\", \"Filter by priority: 0-5 (comma-separated)\")\n .option(\"--since <date>\", \"Created after date (YYYY-MM-DD)\")\n .option(\"--until <date>\", \"Created before date (YYYY-MM-DD)\")\n .option(\"--sort <fields>\", \"Sort by fields (field:direction, comma-separated)\", \"created:desc\")\n .option(\"--limit <n>\", \"Results per page (default: 50)\", \"50\")\n .option(\"--page <n>\", \"Page number (default: 1)\", \"1\")\n .action(async (options) => {\n try {\n const limit = parseInt(options.limit, 10);\n const page = parseInt(options.page, 10);\n validatePagination(limit, page);\n\n const types = options.type\n ? options.type.split(\",\").map((t: string) => t.trim())\n : undefined;\n\n if (types) validateListEntityTypes(types);\n\n const statuses = options.status\n ? options.status.split(\",\").map((s: string) => s.trim())\n : undefined;\n\n const priorities = options.priority\n ? options.priority.split(\",\").map((p: string) => parseInt(p.trim(), 10))\n : undefined;\n\n if (priorities) validatePriorities(priorities);\n\n let sort;\n try {\n sort = parseSort(options.sort);\n } catch (err) {\n throw new Error(`Invalid sort: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const since = parseDate(options.since);\n if (options.since && !since) {\n throw new Error(\"Invalid since date. Use YYYY-MM-DD format.\");\n }\n\n const until = parseUntilDate(options.until);\n if (options.until && !until) {\n throw new Error(\"Invalid until date. Use YYYY-MM-DD format.\");\n }\n\n const result = await listAll({\n types: types as ListEntityType[] | undefined,\n statuses,\n priorities,\n since,\n until,\n sort,\n limit,\n page,\n });\n\n outputResult(result, formatListResults);\n } catch (err) {\n handleCommandError(err);\n }\n });\n\nfunction parseDate(dateStr: string | undefined): Date | undefined {\n if (!dateStr) return undefined;\n const parsed = dayjs(dateStr, \"YYYY-MM-DD\", true);\n return parsed.isValid() ? parsed.toDate() : undefined;\n}\n\nfunction parseUntilDate(dateStr: string | undefined): Date | undefined {\n if (!dateStr) return undefined;\n const parsed = dayjs(dateStr, \"YYYY-MM-DD\", true);\n return parsed.isValid() ? parsed.endOf(\"day\").toDate() : undefined;\n}\n\nfunction formatListResults(result: ListResponse): string {\n const lines: string[] = [];\n\n lines.push(`Found ${result.total} items (page ${result.page}, ${result.limit} per page)`);\n lines.push(\"\");\n\n if (result.items.length === 0) {\n lines.push(\"No items found.\");\n return lines.join(\"\\n\");\n }\n\n for (const item of result.items) {\n lines.push(formatItem(item));\n }\n\n const totalPages = Math.ceil(result.total / result.limit);\n if (totalPages > 1) {\n lines.push(\"\");\n lines.push(`Page ${result.page} of ${totalPages}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatItem(item: ListItem): string {\n const typeLabel = item.type.toUpperCase().padEnd(7);\n const statusLabel = item.status.padEnd(11);\n const priorityLabel = `P${item.priority}`;\n const parentLabel = item.parentId ? ` (${item.parentId})` : \"\";\n\n return `${typeLabel} ${item.id} | ${statusLabel} | ${priorityLabel} | ${item.title}${parentLabel}`;\n}\n","import { getDb, requireSqliteInstance } from \"../db/client-node\";\nimport {\n VALID_SORT_FIELDS,\n PAGINATION_DEFAULTS,\n type ListEntityType,\n} from \"../types\";\n\nexport type { ListEntityType };\n\nfunction mapSortFieldToColumn(field: string): string {\n if (field === \"created\") return \"created_at\";\n if (field === \"updated\") return \"updated_at\";\n return field;\n}\n\nexport interface ListOptions {\n types?: ListEntityType[];\n statuses?: string[];\n priorities?: number[];\n since?: Date;\n until?: Date;\n sort?: { field: string; direction: \"asc\" | \"desc\" }[];\n limit?: number;\n page?: number;\n}\n\nexport interface ListItem {\n type: ListEntityType;\n id: string;\n title: string;\n status: string;\n priority: number;\n parentId: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface ListResponse {\n total: number;\n page: number;\n limit: number;\n items: ListItem[];\n}\n\nexport async function listAll(options?: ListOptions): Promise<ListResponse> {\n // Initialize database first (async with sql.js)\n await getDb();\n const sqlite = requireSqliteInstance();\n\n const limit = options?.limit ?? PAGINATION_DEFAULTS.LIST_PAGE_SIZE;\n const page = options?.page ?? PAGINATION_DEFAULTS.DEFAULT_PAGE;\n const offset = (page - 1) * limit;\n\n // Build filter conditions\n const conditions: string[] = [];\n const params: (string | number)[] = [];\n\n if (options?.types && options.types.length > 0) {\n const placeholders = options.types.map(() => \"?\").join(\", \");\n conditions.push(`type IN (${placeholders})`);\n params.push(...options.types);\n }\n\n if (options?.statuses && options.statuses.length > 0) {\n const placeholders = options.statuses.map(() => \"?\").join(\", \");\n conditions.push(`status IN (${placeholders})`);\n params.push(...options.statuses);\n }\n\n if (options?.priorities && options.priorities.length > 0) {\n const placeholders = options.priorities.map(() => \"?\").join(\", \");\n conditions.push(`priority IN (${placeholders})`);\n params.push(...options.priorities);\n }\n\n if (options?.since) {\n conditions.push(\"created_at >= ?\");\n params.push(Math.floor(options.since.getTime() / 1000));\n }\n\n if (options?.until) {\n conditions.push(\"created_at <= ?\");\n params.push(Math.floor(options.until.getTime() / 1000));\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\n // Build sort clause\n let orderClause = \"ORDER BY created_at DESC\";\n if (options?.sort && options.sort.length > 0) {\n const sortParts = options.sort.map((s) => {\n const column = mapSortFieldToColumn(s.field);\n return `${column} ${s.direction.toUpperCase()}`;\n });\n orderClause = `ORDER BY ${sortParts.join(\", \")}`;\n }\n\n // Base query using UNION ALL\n const baseQuery = `\n SELECT 'epic' as type, id, title, status, priority, NULL as parent_id, created_at, updated_at FROM epics\n UNION ALL\n SELECT 'task' as type, id, title, status, priority, epic_id as parent_id, created_at, updated_at FROM tasks WHERE parent_task_id IS NULL\n UNION ALL\n SELECT 'subtask' as type, id, title, status, priority, parent_task_id as parent_id, created_at, updated_at FROM tasks WHERE parent_task_id IS NOT NULL\n `;\n\n // Count total results\n const countSql = `SELECT COUNT(*) as total FROM (${baseQuery}) ${whereClause}`;\n const stmt1 = sqlite.prepare(countSql);\n stmt1.bind(params);\n let total = 0;\n if (stmt1.step()) {\n const row = stmt1.getAsObject();\n total = (row.total as number) ?? 0;\n }\n stmt1.free();\n\n // Get paginated results\n const selectSql = `\n SELECT * FROM (${baseQuery})\n ${whereClause}\n ${orderClause}\n LIMIT ? OFFSET ?\n `;\n\n const stmt2 = sqlite.prepare(selectSql);\n stmt2.bind([...params, limit, offset]);\n\n const results: Array<{\n type: string;\n id: string;\n title: string;\n status: string;\n priority: number;\n parent_id: string | null;\n created_at: number;\n updated_at: number;\n }> = [];\n\n while (stmt2.step()) {\n results.push(stmt2.getAsObject() as typeof results[0]);\n }\n stmt2.free();\n\n return {\n total,\n page,\n limit,\n items: results.map((row) => ({\n type: row.type as ListEntityType,\n id: row.id,\n title: row.title,\n status: row.status,\n priority: row.priority,\n parentId: row.parent_id,\n createdAt: new Date(row.created_at * 1000),\n updatedAt: new Date(row.updated_at * 1000),\n })),\n };\n}\n\nexport function parseSort(sortStr: string): { field: string; direction: \"asc\" | \"desc\" }[] {\n const parts = sortStr.split(\",\").map((s) => s.trim());\n const result: { field: string; direction: \"asc\" | \"desc\" }[] = [];\n\n for (const part of parts) {\n const [field, dir] = part.split(\":\").map((s) => s.trim().toLowerCase());\n\n if (!(VALID_SORT_FIELDS as readonly string[]).includes(field)) {\n throw new Error(`Invalid sort field: ${field}. Valid fields: ${VALID_SORT_FIELDS.join(\", \")}`);\n }\n\n const direction = dir === \"asc\" ? \"asc\" : \"desc\";\n result.push({ field, direction });\n }\n\n return result;\n}\n","import { Command } from \"commander\";\nimport { chat } from \"../services/chat\";\nimport { handleCommandError, isToonMode, output } from \"../utils/output\";\n\nexport const chatCommand = new Command(\"chat\")\n .description(\"Ask questions about your tasks using natural language\")\n .argument(\"<query>\", \"Your question about tasks, epics, or project status\")\n .option(\"--max-tokens <n>\", \"Maximum response tokens\", \"1024\")\n .action(async (query, options) => {\n try {\n const maxTokens = parseInt(options.maxTokens, 10);\n\n if (isNaN(maxTokens) || maxTokens < 1) {\n throw new Error(\"--max-tokens must be a positive number\");\n }\n\n const result = await chat(query, { maxTokens });\n\n if (isToonMode()) {\n output(result);\n } else {\n console.log(result.response);\n }\n } catch (err) {\n handleCommandError(err);\n }\n });\n","import { existsSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nconst MODEL_REPO = \"Qwen/Qwen2.5-1.5B-Instruct-GGUF\";\nconst MODEL_FILE = \"qwen2.5-1.5b-instruct-q4_k_m.gguf\";\nconst CACHE_DIR = join(homedir(), \".trekker\", \"chat-models\");\n\nexport interface LlmOptions {\n /** If true, suppresses progress output to stderr */\n silent?: boolean;\n}\n\nexport interface GenerateOptions {\n /** Maximum tokens to generate */\n maxTokens?: number;\n}\n\n// Lazy-loaded types from node-llama-cpp\ntype LlamaModule = typeof import(\"node-llama-cpp\");\ntype LlamaModel = Awaited<ReturnType<Awaited<ReturnType<LlamaModule[\"getLlama\"]>>[\"loadModel\"]>>;\ntype LlamaContext = Awaited<ReturnType<LlamaModel[\"createContext\"]>>;\n\nlet llama: Awaited<ReturnType<LlamaModule[\"getLlama\"]>> | null = null;\nlet model: LlamaModel | null = null;\nlet context: LlamaContext | null = null;\nlet modelLoadFailed = false;\nlet modelLoading: Promise<boolean> | null = null;\n\nfunction ensureCacheDir(): void {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n}\n\nfunction formatErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Resets the LLM state to allow retrying after transient errors.\n */\nexport function resetLlmState(): void {\n llama = null;\n model = null;\n context = null;\n modelLoading = null;\n modelLoadFailed = false;\n}\n\n/**\n * Check if the LLM model is loaded and ready.\n */\nexport function isLlmAvailable(): boolean {\n return model !== null && context !== null;\n}\n\n/**\n * Load the LLM model if not already loaded.\n * Downloads the model from HuggingFace if not cached locally.\n */\nexport async function ensureLlmLoaded(options?: LlmOptions): Promise<boolean> {\n if (model && context) return true;\n if (modelLoadFailed) return false;\n if (modelLoading) return modelLoading;\n\n const silent = options?.silent ?? false;\n\n modelLoading = (async () => {\n try {\n ensureCacheDir();\n\n // Dynamic import to avoid loading node-llama-cpp when not needed\n const { getLlama, LlamaChatSession } = await import(\"node-llama-cpp\");\n\n if (!silent) {\n process.stderr.write(\"Loading LLM...\\n\");\n }\n\n llama = await getLlama();\n\n // Check if model exists locally\n const localModelPath = join(CACHE_DIR, MODEL_FILE);\n let modelPath: string;\n\n if (existsSync(localModelPath)) {\n modelPath = localModelPath;\n } else {\n if (!silent) {\n process.stderr.write(`Downloading model from ${MODEL_REPO}...\\n`);\n }\n\n // Download model using node-llama-cpp's built-in downloader\n const { createModelDownloader } = await import(\"node-llama-cpp\");\n const downloader = await createModelDownloader({\n modelUri: `hf:${MODEL_REPO}/${MODEL_FILE}`,\n dirPath: CACHE_DIR,\n onProgress: silent ? undefined : (progress) => {\n const percent = Math.round(progress.downloadedSize / progress.totalSize * 100);\n process.stderr.write(`\\rDownloading: ${percent}%`);\n },\n });\n\n modelPath = await downloader.download();\n if (!silent) {\n process.stderr.write(\"\\n\");\n }\n }\n\n model = await llama.loadModel({\n modelPath,\n });\n\n context = await model.createContext();\n\n if (!silent) {\n process.stderr.write(\"LLM ready.\\n\");\n }\n\n return true;\n } catch (error) {\n modelLoadFailed = true;\n if (!silent) {\n process.stderr.write(`\\nFailed to load LLM: ${formatErrorMessage(error)}\\n`);\n }\n return false;\n } finally {\n modelLoading = null;\n }\n })();\n\n return modelLoading;\n}\n\n/**\n * Generate a response from the LLM given a system prompt and user message.\n */\nexport async function generateResponse(\n systemPrompt: string,\n userMessage: string,\n options?: GenerateOptions\n): Promise<string> {\n const loaded = await ensureLlmLoaded();\n if (!loaded || !model || !context) {\n throw new Error(\"LLM is not available\");\n }\n\n const { LlamaChatSession } = await import(\"node-llama-cpp\");\n\n const session = new LlamaChatSession({\n contextSequence: context.getSequence(),\n systemPrompt,\n });\n\n const maxTokens = options?.maxTokens ?? 1024;\n\n const response = await session.prompt(userMessage, { maxTokens });\n\n return response;\n}\n","import { listAll, type ListItem } from \"./list\";\nimport { generateResponse, ensureLlmLoaded } from \"./llm\";\nimport type { ChatOptions, ChatResult } from \"../types\";\n\nconst DEFAULT_MAX_TOKENS = 1024;\n\n// Qwen2.5-1.5B has ~32K context\nconst MAX_CONTEXT_CHARS = Infinity;\n\ninterface ProjectData {\n items: ListItem[];\n total: number;\n}\n\n/**\n * Fetch all project data from the database.\n */\nasync function fetchProjectData(): Promise<ProjectData> {\n // Fetch all items (no pagination limit for context building)\n const response = await listAll({ limit: 1000 });\n return {\n items: response.items,\n total: response.total,\n };\n}\n\n/**\n * Format a single item for context.\n */\nfunction formatItem(item: ListItem, includeTimestamps: boolean): string {\n const typeLabel = item.type.toUpperCase().padEnd(7);\n const statusLabel = `[${item.status}]`.padEnd(13);\n const priorityLabel = `P${item.priority}`;\n const parentLabel = item.parentId ? ` (${item.parentId})` : \"\";\n\n let line = `${typeLabel} ${item.id} ${statusLabel} ${priorityLabel} | ${item.title}${parentLabel}`;\n\n if (includeTimestamps) {\n line += ` | updated: ${item.updatedAt.toISOString().split(\"T\")[0]}`;\n }\n\n return line;\n}\n\n/**\n * Group items by status for summary.\n */\nfunction groupByStatus(items: ListItem[]): Record<string, ListItem[]> {\n const groups: Record<string, ListItem[]> = {};\n for (const item of items) {\n if (!groups[item.status]) {\n groups[item.status] = [];\n }\n groups[item.status].push(item);\n }\n return groups;\n}\n\n/**\n * Build context with progressive compaction.\n *\n * Compaction levels:\n * 1. Full: All items with timestamps\n * 2. Compact: All items without timestamps\n * 3. Prioritized: Active items (in_progress, todo) full + completed count only\n * 4. Minimal: Status counts + most recent active items\n */\nfunction buildContext(data: ProjectData): string {\n const { items, total } = data;\n\n if (items.length === 0) {\n return \"No tasks or epics in the project yet.\";\n }\n\n // Level 1: Try full format with timestamps\n let context = buildFullContext(items, true);\n if (context.length <= MAX_CONTEXT_CHARS) {\n return context;\n }\n\n // Level 2: Remove timestamps\n context = buildFullContext(items, false);\n if (context.length <= MAX_CONTEXT_CHARS) {\n return context;\n }\n\n // Level 3: Prioritize active items\n context = buildPrioritizedContext(items);\n if (context.length <= MAX_CONTEXT_CHARS) {\n return context;\n }\n\n // Level 4: Minimal summary\n return buildMinimalContext(items, total);\n}\n\n/**\n * Full context with all items.\n */\nfunction buildFullContext(items: ListItem[], includeTimestamps: boolean): string {\n const lines: string[] = [];\n\n // Group by type\n const epics = items.filter(i => i.type === \"epic\");\n const tasks = items.filter(i => i.type === \"task\");\n const subtasks = items.filter(i => i.type === \"subtask\");\n\n if (epics.length > 0) {\n lines.push(\"## Epics\");\n for (const item of epics) {\n lines.push(formatItem(item, includeTimestamps));\n }\n lines.push(\"\");\n }\n\n if (tasks.length > 0) {\n lines.push(\"## Tasks\");\n for (const item of tasks) {\n lines.push(formatItem(item, includeTimestamps));\n }\n lines.push(\"\");\n }\n\n if (subtasks.length > 0) {\n lines.push(\"## Subtasks\");\n for (const item of subtasks) {\n lines.push(formatItem(item, includeTimestamps));\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Prioritized context: active items in full, completed as counts.\n */\nfunction buildPrioritizedContext(items: ListItem[]): string {\n const lines: string[] = [];\n\n const activeStatuses = [\"in_progress\", \"todo\"];\n const active = items.filter(i => activeStatuses.includes(i.status));\n const completed = items.filter(i => i.status === \"completed\");\n const other = items.filter(i => !activeStatuses.includes(i.status) && i.status !== \"completed\");\n\n\n // Show active items in full\n if (active.length > 0) {\n lines.push(\"## Active Work\");\n for (const item of active) {\n lines.push(formatItem(item, false));\n }\n lines.push(\"\");\n }\n\n // Completed as summary\n if (completed.length > 0) {\n const byType = {\n epic: completed.filter(i => i.type === \"epic\").length,\n task: completed.filter(i => i.type === \"task\").length,\n subtask: completed.filter(i => i.type === \"subtask\").length,\n };\n lines.push(`## Completed: ${completed.length} total (${byType.epic} epics, ${byType.task} tasks, ${byType.subtask} subtasks)`);\n\n // Show most recent 5 completed\n const recentCompleted = completed\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\n .slice(0, 5);\n if (recentCompleted.length > 0) {\n lines.push(\"Recent:\");\n for (const item of recentCompleted) {\n lines.push(` ${item.id}: ${item.title}`);\n }\n }\n lines.push(\"\");\n }\n\n // Other statuses\n if (other.length > 0) {\n lines.push(`## Other: ${other.length} items (archived, wont_fix, etc.)`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Minimal context: just counts and recent active items.\n */\nfunction buildMinimalContext(items: ListItem[], total: number): string {\n const lines: string[] = [];\n\n\n // Status breakdown\n const byStatus = groupByStatus(items);\n lines.push(\"## Project Summary\");\n lines.push(`Total items: ${total}`);\n for (const [status, statusItems] of Object.entries(byStatus)) {\n lines.push(` ${status}: ${statusItems.length}`);\n }\n lines.push(\"\");\n\n // Most recent in_progress items\n const inProgress = items\n .filter(i => i.status === \"in_progress\")\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\n .slice(0, 10);\n\n if (inProgress.length > 0) {\n lines.push(\"## Currently In Progress\");\n for (const item of inProgress) {\n lines.push(`${item.id} [${item.type}] ${item.title}`);\n }\n lines.push(\"\");\n }\n\n // Most recent todo items\n const todo = items\n .filter(i => i.status === \"todo\")\n .sort((a, b) => a.priority - b.priority) // Higher priority first\n .slice(0, 10);\n\n if (todo.length > 0) {\n lines.push(\"## High Priority Todo\");\n for (const item of todo) {\n lines.push(`${item.id} [${item.type}] P${item.priority} | ${item.title}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Build the system prompt for the LLM.\n */\nfunction buildSystemPrompt(context: string): string {\n return `You are a helpful assistant for Trekker, a CLI-based issue tracker.\n\nPROJECT DATA:\n${context}\n\nRULES:\n- Always be brief.\n- Respond in markdown format.\n- Limit lists to 10 most relevant items max.\n- Reference IDs (TREK-1, EPIC-2) when relevant.\n- Never repeat items.\n- Status: todo, in_progress, completed, wont_fix, archived\n- Priority: P0 (critical) to P5 (someday)`;\n}\n\n/**\n * Remove duplicate list items from response (small models tend to repeat items).\n * Keeps only the first occurrence of each item.\n */\nfunction removeDuplicateItems(response: string): string {\n const lines = response.split(\"\\n\");\n const seen = new Set<string>();\n const result: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Check if this is a list item (starts with - or *)\n if (/^[-*]\\s/.test(trimmed)) {\n // Normalize the item for comparison (remove formatting)\n const normalized = trimmed\n .replace(/^\\*\\*/, \"\")\n .replace(/\\*\\*$/, \"\")\n .replace(/^[-*]\\s+/, \"\")\n .trim()\n .toLowerCase();\n\n if (seen.has(normalized)) {\n continue; // Skip duplicate\n }\n seen.add(normalized);\n }\n\n result.push(line);\n }\n\n return result.join(\"\\n\");\n}\n\n/**\n * Detect if a response was likely truncated mid-generation.\n */\nfunction isTruncated(response: string): boolean {\n const trimmed = response.trim();\n if (trimmed.length === 0) return false;\n\n // Check if ends mid-word (no space/punctuation before end)\n const lastChar = trimmed[trimmed.length - 1];\n const endsWithPunctuation = /[.!?)\\]}\"']$/.test(trimmed);\n\n // If ends with a letter/number and no punctuation, likely truncated\n if (/[a-zA-Z0-9]$/.test(lastChar) && !endsWithPunctuation) {\n return true;\n }\n\n // Check for incomplete markdown (unclosed bold, list item without content)\n if (/\\*\\*[^*]*$/.test(trimmed) || /^- $/.test(trimmed.split(\"\\n\").pop() || \"\")) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Clean up response by removing duplicates and/or incomplete ending.\n */\nfunction cleanResponse(response: string): { text: string; wasModified: boolean } {\n const original = response;\n\n // First, remove duplicate list items\n let text = removeDuplicateItems(response);\n let wasModified = text !== original;\n\n // Then check for truncation\n if (isTruncated(text)) {\n const lines = text.split(\"\\n\");\n\n // Remove last line if it appears incomplete\n if (lines.length > 1) {\n const lastLine = lines[lines.length - 1].trim();\n if (\n lastLine === \"\" ||\n lastLine === \"-\" ||\n /^-\\s*\\*?\\*?[A-Z]*$/.test(lastLine) ||\n (/TREK-?\\d*$/.test(lastLine) && !lastLine.includes(\"|\")) ||\n /^-\\s*EPIC\\s*\\d*$/.test(lastLine)\n ) {\n lines.pop();\n wasModified = true;\n }\n }\n text = lines.join(\"\\n\");\n }\n\n return { text: text.trim(), wasModified };\n}\n\n/**\n * Chat with the LLM about project tasks and epics.\n * Fetches all project data and uses smart compaction if needed.\n */\nexport async function chat(\n query: string,\n options?: ChatOptions\n): Promise<ChatResult> {\n const maxTokens = options?.maxTokens ?? DEFAULT_MAX_TOKENS;\n\n // Ensure LLM is loaded\n const loaded = await ensureLlmLoaded({ silent: false });\n if (!loaded) {\n throw new Error(\"Failed to load LLM. Please try again.\");\n }\n\n // Fetch all project data\n let projectData: ProjectData = { items: [], total: 0 };\n try {\n projectData = await fetchProjectData();\n } catch {\n // If fetch fails, continue with empty context\n }\n\n // Build context with smart compaction\n const context = buildContext(projectData);\n const systemPrompt = buildSystemPrompt(context);\n\n // Generate response\n let response = await generateResponse(systemPrompt, query, { maxTokens });\n\n // Clean up repetition and truncation\n const { text } = cleanResponse(response);\n response = text;\n\n return {\n query,\n response,\n contextCount: projectData.items.length,\n };\n}\n\n/**\n * Check if the chat feature is available (LLM loaded).\n */\nexport async function isChatAvailable(): Promise<boolean> {\n try {\n return await ensureLlmLoaded({ silent: true });\n } catch {\n return false;\n }\n}\n","{\n \"name\": \"@obsfx/trekker\",\n \"version\": \"1.7.0\",\n \"description\": \"A CLI-based issue tracker built for AI coding agents. Stores tasks, epics, and dependencies in a local SQLite database.\",\n \"type\": \"module\",\n \"main\": \"dist/index.js\",\n \"bin\": {\n \"trekker\": \"./bin/trekker.js\"\n },\n \"files\": [\n \"dist\",\n \"bin\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm --dts\",\n \"dev\": \"tsx src/index.ts\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"db:generate\": \"drizzle-kit generate\",\n \"db:migrate\": \"drizzle-kit migrate\",\n \"release:patch\": \"npm version patch && npm run build && npm publish --access public\",\n \"release:minor\": \"npm version minor && npm run build && npm publish --access public\",\n \"release:major\": \"npm version major && npm run build && npm publish --access public\"\n },\n \"keywords\": [\n \"cli\",\n \"issue-tracker\",\n \"task-management\",\n \"sqlite\",\n \"ai-agents\",\n \"coding-agents\",\n \"project-management\",\n \"todo\",\n \"epic\",\n \"node\"\n ],\n \"author\": \"Omercan Balandi <balandiomer@gmail.com>\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/obsfx/trekker\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/obsfx/trekker.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/obsfx/trekker/issues\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"dependencies\": {\n \"@huggingface/transformers\": \"^3.8.1\",\n \"@toon-format/toon\": \"^2.1.0\",\n \"commander\": \"^13.1.0\",\n \"dayjs\": \"^1.11.19\",\n \"drizzle-orm\": \"^0.38.4\",\n \"node-llama-cpp\": \"^3.15.1\",\n \"sql.js\": \"^1.11.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.11.0\",\n \"@types/sql.js\": \"^1.4.9\",\n \"drizzle-kit\": \"^0.30.4\",\n \"tsup\": \"^8.0.0\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.7.3\",\n \"vitest\": \"^2.0.0\"\n }\n}\n"],"mappings":"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","names":["Command","stmt","error","tasks","epics","comments","dependencies","Command","Command","Command","existsSync","mkdirSync","join","error","text","output","text","text","context","error","Command","epics","Command","eq","and","isNull","eq","isNull","and","Command","tasks","Command","Command","Command","eq","eq","Command","comments","Command","eq","eq","Command","Command","Command","Command","Command","text","Command","result","Command","Command","Command","dayjs","customParseFormat","dayjs","customParseFormat","Command","parseDate","Command","existsSync","mkdirSync","join","homedir","CACHE_DIR","modelLoadFailed","modelLoading","ensureCacheDir","formatErrorMessage","error","modelLoadFailed","modelLoading","ensureCacheDir","join","CACHE_DIR","existsSync","error","formatErrorMessage","formatItem","context","epics","tasks","text","Command","Command"]}