@tomkapa/tayto 0.8.2 → 0.9.0

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/index.ts","../src/db/connection.ts","../src/db/migrator.ts","../src/logging/telemetry.ts","../src/cli/container.ts","../src/errors/app-error.ts","../src/repository/project.repository.ts","../src/repository/shared.ts","../src/utils/search-parser.ts","../src/repository/task.repository.ts","../src/repository/dependency.repository.ts","../src/types/project.ts","../src/service/project.service.ts","../src/types/task.ts","../src/service/task.service.ts","../src/types/dependency.ts","../src/service/dependency.service.ts","../src/types/portability.ts","../src/service/portability.service.ts","../src/service/update.service.ts","../src/cli/index.ts","../src/cli/output.ts","../src/cli/commands/project/create.ts","../src/cli/commands/project/list.ts","../src/cli/commands/project/update.ts","../src/cli/commands/project/delete.ts","../src/cli/commands/project/set-default.ts","../src/cli/commands/project/link.ts","../src/cli/commands/project/unlink.ts","../src/cli/helpers/project.ts","../src/cli/commands/task/create.ts","../src/cli/commands/task/list.ts","../src/cli/commands/task/show.ts","../src/cli/commands/task/update.ts","../src/cli/commands/task/delete.ts","../src/cli/commands/task/breakdown.ts","../src/cli/commands/task/rank.ts","../src/cli/commands/task/search.ts","../src/cli/commands/task/export.ts","../src/cli/commands/task/import.ts","../src/cli/commands/dep/add.ts","../src/cli/commands/dep/remove.ts","../src/cli/commands/dep/list.ts","../src/cli/commands/dep/graph.ts","../src/cli/commands/upgrade.ts","../src/telemetry/heartbeat.ts","../src/types/install-id.ts","../src/utils/ci.ts","../src/index.ts"],"sourcesContent":["import { mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface Config {\n dbPath: string;\n logDir: string;\n logLevel: string;\n otelEndpoint: string | undefined;\n updateCachePath: string;\n dismissedGitRemotesPath: string;\n telemetryStatePath: string;\n noUpdateCheck: boolean;\n}\n\nfunction ensureDir(dir: string): void {\n mkdirSync(dir, { recursive: true });\n}\n\nexport function loadConfig(): Config {\n const dataDir = process.env['TASK_DATA_DIR'] ?? join(homedir(), '.task');\n ensureDir(dataDir);\n\n const logDir = process.env['TASK_LOG_DIR'] ?? join(dataDir, 'logs');\n ensureDir(logDir);\n\n return {\n dbPath: process.env['TASK_DB_PATH'] ?? join(dataDir, 'data.db'),\n logDir,\n logLevel: process.env['TASK_LOG_LEVEL'] ?? 'info',\n otelEndpoint: process.env['OTEL_EXPORTER_OTLP_ENDPOINT'],\n updateCachePath: join(dataDir, 'update-check.json'),\n dismissedGitRemotesPath: join(dataDir, 'dismissed-git-remotes.json'),\n telemetryStatePath: join(dataDir, 'telemetry.json'),\n noUpdateCheck: process.env['TAYTO_NO_UPDATE_CHECK'] === '1',\n };\n}\n","import { DatabaseSync } from 'node:sqlite';\n\nexport function createDatabase(dbPath: string): DatabaseSync {\n const db = new DatabaseSync(dbPath);\n db.exec('PRAGMA journal_mode = WAL');\n db.exec('PRAGMA foreign_keys = ON');\n return db;\n}\n","import { readdirSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { logger } from '../logging/logger.js';\n\nconst migrationsDir = join(dirname(fileURLToPath(import.meta.url)), 'migrations');\n\nfunction loadMigrations(): Array<{ name: string; sql: string }> {\n const files = readdirSync(migrationsDir)\n .filter((f) => f.endsWith('.sql'))\n .sort();\n\n return files.map((name) => ({\n name,\n sql: readFileSync(join(migrationsDir, name), 'utf-8'),\n }));\n}\n\nexport function runMigrations(db: DatabaseSync): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS _migrations (\n name TEXT PRIMARY KEY,\n applied_at TEXT NOT NULL\n );\n `);\n\n const applied = new Set(\n (db.prepare('SELECT name FROM _migrations').all() as Array<{ name: string }>).map(\n (r) => r.name,\n ),\n );\n\n const migrations = loadMigrations();\n\n for (const migration of migrations) {\n if (applied.has(migration.name)) continue;\n\n logger.info(`Applying migration: ${migration.name}`);\n\n db.exec('BEGIN');\n try {\n db.exec(migration.sql);\n db.prepare('INSERT INTO _migrations (name, applied_at) VALUES (?, ?)').run(\n migration.name,\n new Date().toISOString(),\n );\n db.exec('COMMIT');\n } catch (e) {\n db.exec('ROLLBACK');\n throw e;\n }\n logger.info(`Migration applied: ${migration.name}`);\n }\n}\n","import { NodeSDK } from '@opentelemetry/sdk-node';\nimport { BatchSpanProcessor, ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport type { Config } from '../config/index.js';\n\nlet sdk: NodeSDK | undefined;\n\nexport function initTelemetry(config: Config): void {\n const spanProcessor = config.otelEndpoint\n ? new BatchSpanProcessor(new OTLPTraceExporter({ url: config.otelEndpoint }))\n : config.logLevel === 'debug'\n ? new BatchSpanProcessor(new ConsoleSpanExporter())\n : undefined;\n\n sdk = new NodeSDK({\n serviceName: 'task',\n spanProcessors: spanProcessor ? [spanProcessor] : [],\n });\n\n sdk.start();\n}\n\nexport async function shutdownTelemetry(): Promise<void> {\n if (sdk) {\n await sdk.shutdown();\n }\n}\n","import type { DatabaseSync } from 'node:sqlite';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { SqliteProjectRepository } from '../repository/project.repository.js';\nimport { SqliteTaskRepository } from '../repository/task.repository.js';\nimport { SqliteDependencyRepository } from '../repository/dependency.repository.js';\nimport { ProjectServiceImpl } from '../service/project.service.js';\nimport type { DetectGitRemoteFn } from '../service/project.service.js';\nimport { TaskServiceImpl } from '../service/task.service.js';\nimport { DependencyServiceImpl } from '../service/dependency.service.js';\nimport { PortabilityServiceImpl } from '../service/portability.service.js';\nimport { UpdateServiceImpl } from '../service/update.service.js';\nimport type { ProjectService } from '../service/project.service.js';\nimport type { TaskService } from '../service/task.service.js';\nimport type { DependencyService } from '../service/dependency.service.js';\nimport type { PortabilityService } from '../service/portability.service.js';\nimport type { UpdateService } from '../service/update.service.js';\n\nexport interface Container {\n dbPath: string;\n updateCachePath: string;\n dismissedGitRemotesPath: string;\n projectService: ProjectService;\n taskService: TaskService;\n dependencyService: DependencyService;\n portabilityService: PortabilityService;\n updateService: UpdateService;\n}\n\nexport function createContainer(\n db: DatabaseSync,\n dbPath: string,\n detectGitRemote?: DetectGitRemoteFn,\n updateCachePath?: string,\n dismissedGitRemotesPath?: string,\n): Container {\n const projectRepo = new SqliteProjectRepository(db);\n const taskRepo = new SqliteTaskRepository(db);\n const depRepo = new SqliteDependencyRepository(db);\n const projectService = new ProjectServiceImpl(projectRepo, detectGitRemote);\n const dependencyService = new DependencyServiceImpl(depRepo, taskRepo);\n const taskService = new TaskServiceImpl(taskRepo, projectService, () => dependencyService);\n const portabilityService = new PortabilityServiceImpl(taskService, dependencyService);\n const resolvedUpdateCachePath = updateCachePath ?? join(tmpdir(), 'tayto-update-check.json');\n const updateService = new UpdateServiceImpl(resolvedUpdateCachePath);\n\n return {\n dbPath,\n updateCachePath: resolvedUpdateCachePath,\n dismissedGitRemotesPath:\n dismissedGitRemotesPath ?? join(tmpdir(), 'tayto-dismissed-git-remotes.json'),\n projectService,\n taskService,\n dependencyService,\n portabilityService,\n updateService,\n };\n}\n","export type AppErrorCode =\n | 'NOT_FOUND'\n | 'DUPLICATE'\n | 'VALIDATION'\n | 'DB_ERROR'\n | 'UPGRADE_CHECK'\n | 'UNKNOWN';\n\nexport class AppError extends Error {\n constructor(\n public readonly code: AppErrorCode,\n message: string,\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = 'AppError';\n }\n}\n\nexport function toMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","import type { DatabaseSync } from 'node:sqlite';\nimport type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type { Project, CreateProjectInput, UpdateProjectInput } from '../types/project.js';\nimport { GitRemote } from '../types/git-remote.js';\nimport { AppError } from '../errors/app-error.js';\nimport { ulid } from 'ulid';\nimport { logger } from '../logging/logger.js';\nimport { NOT_DELETED } from './shared.js';\n\ninterface ProjectRow {\n id: string;\n key: string;\n name: string;\n description: string;\n is_default: number;\n task_counter: number;\n git_remote: string | null;\n created_at: string;\n updated_at: string;\n}\n\nfunction rowToProject(row: ProjectRow): Project {\n return {\n id: row.id,\n key: row.key,\n name: row.name,\n description: row.description,\n isDefault: row.is_default === 1,\n gitRemote: row.git_remote ? GitRemote.parse(row.git_remote) : null,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nexport interface ProjectRepository {\n insert(input: CreateProjectInput & { key: string }): Result<Project>;\n findById(id: string): Result<Project | null>;\n findByKey(key: string): Result<Project | null>;\n findByName(name: string): Result<Project | null>;\n findByGitRemote(remote: GitRemote): Result<Project | null>;\n findDefault(): Result<Project | null>;\n findAll(): Result<Project[]>;\n update(id: string, input: UpdateProjectInput): Result<Project>;\n delete(id: string): Result<void>;\n incrementTaskCounter(id: string): Result<number>;\n}\n\nexport class SqliteProjectRepository implements ProjectRepository {\n constructor(private readonly db: DatabaseSync) {}\n\n insert(input: CreateProjectInput & { key: string }): Result<Project> {\n return logger.startSpan('ProjectRepository.insert', () => {\n try {\n const now = new Date().toISOString();\n const id = ulid();\n\n if (input.isDefault) {\n this.db.prepare('UPDATE projects SET is_default = 0 WHERE is_default = 1').run();\n }\n\n this.db\n .prepare(\n `INSERT INTO projects (id, key, name, description, is_default, git_remote, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n input.key,\n input.name,\n input.description ?? '',\n input.isDefault ? 1 : 0,\n input.gitRemote?.value ?? null,\n now,\n now,\n );\n\n const row = this.db.prepare('SELECT * FROM projects WHERE id = ?').get(id) as\n | ProjectRow\n | undefined;\n if (!row) {\n return err(new AppError('DB_ERROR', 'Failed to retrieve inserted project'));\n }\n return ok(rowToProject(row));\n } catch (e) {\n if (e instanceof Error && e.message.includes('UNIQUE constraint')) {\n if (e.message.includes('git_remote')) {\n return err(\n new AppError(\n 'DUPLICATE',\n `Git remote already linked to another project: ${input.gitRemote?.value}`,\n e,\n ),\n );\n }\n return err(new AppError('DUPLICATE', `Project name already exists: ${input.name}`, e));\n }\n return err(new AppError('DB_ERROR', 'Failed to insert project', e));\n }\n });\n }\n\n findById(id: string): Result<Project | null> {\n try {\n const row = this.db\n .prepare(`SELECT * FROM projects WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as ProjectRow | undefined;\n return ok(row ? rowToProject(row) : null);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to find project by id', e));\n }\n }\n\n findByKey(key: string): Result<Project | null> {\n try {\n const row = this.db\n .prepare(`SELECT * FROM projects WHERE key = ? AND ${NOT_DELETED}`)\n .get(key) as ProjectRow | undefined;\n return ok(row ? rowToProject(row) : null);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to find project by key', e));\n }\n }\n\n findByName(name: string): Result<Project | null> {\n try {\n const row = this.db\n .prepare(`SELECT * FROM projects WHERE name = ? AND ${NOT_DELETED}`)\n .get(name) as ProjectRow | undefined;\n return ok(row ? rowToProject(row) : null);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to find project by name', e));\n }\n }\n\n findByGitRemote(remote: GitRemote): Result<Project | null> {\n try {\n const row = this.db\n .prepare(`SELECT * FROM projects WHERE git_remote = ? AND ${NOT_DELETED}`)\n .get(remote.value) as ProjectRow | undefined;\n return ok(row ? rowToProject(row) : null);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to find project by git remote', e));\n }\n }\n\n findDefault(): Result<Project | null> {\n try {\n const row = this.db\n .prepare(`SELECT * FROM projects WHERE is_default = 1 AND ${NOT_DELETED}`)\n .get() as ProjectRow | undefined;\n return ok(row ? rowToProject(row) : null);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to find default project', e));\n }\n }\n\n findAll(): Result<Project[]> {\n try {\n const rows = this.db\n .prepare(`SELECT * FROM projects WHERE ${NOT_DELETED} ORDER BY created_at DESC`)\n .all() as ProjectRow[];\n return ok(rows.map(rowToProject));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to list projects', e));\n }\n }\n\n update(id: string, input: UpdateProjectInput): Result<Project> {\n return logger.startSpan('ProjectRepository.update', () => {\n try {\n const existing = this.db\n .prepare(`SELECT * FROM projects WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as ProjectRow | undefined;\n if (!existing) {\n return err(new AppError('NOT_FOUND', `Project not found: ${id}`));\n }\n\n const now = new Date().toISOString();\n\n if (input.isDefault) {\n this.db.prepare('UPDATE projects SET is_default = 0 WHERE is_default = 1').run();\n }\n\n this.db\n .prepare(\n `UPDATE projects SET\n name = ?, description = ?, is_default = ?, git_remote = ?, updated_at = ?\n WHERE id = ?`,\n )\n .run(\n input.name ?? existing.name,\n input.description ?? existing.description,\n input.isDefault !== undefined ? (input.isDefault ? 1 : 0) : existing.is_default,\n input.gitRemote !== undefined ? (input.gitRemote?.value ?? null) : existing.git_remote,\n now,\n id,\n );\n\n const row = this.db.prepare('SELECT * FROM projects WHERE id = ?').get(id) as\n | ProjectRow\n | undefined;\n if (!row) {\n return err(new AppError('DB_ERROR', 'Failed to retrieve updated project'));\n }\n return ok(rowToProject(row));\n } catch (e) {\n if (e instanceof Error && e.message.includes('UNIQUE constraint')) {\n if (e.message.includes('git_remote')) {\n return err(\n new AppError('DUPLICATE', `Git remote already linked to another project`, e),\n );\n }\n return err(new AppError('DUPLICATE', `Project name already exists`, e));\n }\n return err(new AppError('DB_ERROR', 'Failed to update project', e));\n }\n });\n }\n\n delete(id: string): Result<void> {\n return logger.startSpan('ProjectRepository.delete', () => {\n try {\n const existing = this.db\n .prepare(`SELECT * FROM projects WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as ProjectRow | undefined;\n if (!existing) {\n return err(new AppError('NOT_FOUND', `Project not found: ${id}`));\n }\n const now = new Date().toISOString();\n this.db\n .prepare('UPDATE projects SET deleted_at = ?, updated_at = ? WHERE id = ?')\n .run(now, now, id);\n // Soft-delete all tasks in this project\n this.db\n .prepare(\n 'UPDATE tasks SET deleted_at = ?, updated_at = ? WHERE project_id = ? AND deleted_at IS NULL',\n )\n .run(now, now, id);\n return ok(undefined);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to delete project', e));\n }\n });\n }\n\n incrementTaskCounter(id: string): Result<number> {\n return logger.startSpan('ProjectRepository.incrementTaskCounter', () => {\n try {\n this.db\n .prepare(\n `UPDATE projects SET task_counter = task_counter + 1 WHERE id = ? AND ${NOT_DELETED}`,\n )\n .run(id);\n const row = this.db\n .prepare(`SELECT task_counter FROM projects WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as { task_counter: number } | undefined;\n if (!row) {\n return err(new AppError('NOT_FOUND', `Project not found: ${id}`));\n }\n return ok(row.task_counter);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to increment task counter', e));\n }\n });\n }\n}\n","import type { Task } from '../types/task.js';\nimport type { TaskStatus, TaskType } from '../types/enums.js';\n\nexport const NOT_DELETED = 'deleted_at IS NULL';\n\nexport interface TaskRow {\n id: string;\n project_id: string;\n parent_id: string | null;\n name: string;\n description: string;\n type: string;\n status: string;\n rank: number;\n technical_notes: string;\n additional_requirements: string;\n created_at: string;\n updated_at: string;\n}\n\nexport function rowToTask(row: TaskRow): Task {\n return {\n id: row.id,\n projectId: row.project_id,\n parentId: row.parent_id,\n name: row.name,\n description: row.description,\n type: row.type as TaskType,\n status: row.status as TaskStatus,\n rank: row.rank,\n technicalNotes: row.technical_notes,\n additionalRequirements: row.additional_requirements,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n","export type ParsedSearch = { kind: 'fts'; query: string } | { kind: 'id'; value: string };\n\nconst ID_PREFIX_RE = /^id:(.+)$/;\n\nexport function parseSearchQuery(raw: string): ParsedSearch {\n const trimmed = raw.trim();\n const match = ID_PREFIX_RE.exec(trimmed);\n if (match?.[1]) {\n return { kind: 'id', value: match[1] };\n }\n return { kind: 'fts', query: trimmed };\n}\n","import type { DatabaseSync } from 'node:sqlite';\nimport type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type { Task, CreateTaskInput, UpdateTaskInput, TaskFilter } from '../types/task.js';\nimport type { TaskLevel } from '../types/enums.js';\nimport { RANK_GAP, TERMINAL_STATUSES, getTaskLevel, midpoint, WORK_TYPES } from '../types/enums.js';\nimport { AppError } from '../errors/app-error.js';\nimport { logger } from '../logging/logger.js';\nimport { NOT_DELETED, type TaskRow, rowToTask } from './shared.js';\nimport { parseSearchQuery } from '../utils/search-parser.js';\n\nconst TERMINAL_STATUS_ARRAY = [...TERMINAL_STATUSES];\nconst TERMINAL_PLACEHOLDERS = TERMINAL_STATUS_ARRAY.map(() => '?').join(', ');\n\nexport interface SearchResult {\n task: Task;\n rank: number;\n}\n\nexport interface TaskRepository {\n insert(id: string, input: CreateTaskInput & { projectId: string }): Result<Task>;\n findById(id: string): Result<Task | null>;\n findMany(filter: TaskFilter): Result<Task[]>;\n update(id: string, input: UpdateTaskInput): Result<Task>;\n delete(id: string): Result<void>;\n rerank(taskId: string, newRank: number): Result<Task>;\n getMaxRank(projectId: string): Result<number>;\n /** Max rank among non-terminal (not done/cancelled) tasks. Returns 0 if none. */\n getMaxActiveRank(projectId: string): Result<number>;\n /** Min rank among terminal (done/cancelled) tasks. Returns null if none. */\n getMinTerminalRank(projectId: string): Result<number | null>;\n getRankedTasks(projectId: string, status?: string): Result<Task[]>;\n /** Level-aware max rank (scoped to types matching the given level). */\n getMaxRankByLevel(projectId: string, level: TaskLevel): Result<number>;\n /** Level-aware max active rank. */\n getMaxActiveRankByLevel(projectId: string, level: TaskLevel): Result<number>;\n /** Level-aware min terminal rank. */\n getMinTerminalRankByLevel(projectId: string, level: TaskLevel): Result<number | null>;\n /** Ranked tasks filtered to the same level. */\n getRankedTasksByLevel(projectId: string, level: TaskLevel, status?: string): Result<Task[]>;\n /** Ranked non-terminal tasks filtered to the same level. */\n getRankedNonTerminalTasksByLevel(projectId: string, level: TaskLevel): Result<Task[]>;\n /**\n * Redistribute ranks at the given level so that every active task sits\n * strictly below every terminal task, separated by clean `RANK_GAP`\n * intervals. Recovers from floating-point precision collapse after many\n * midpoint insertions and repairs any pre-existing interleaved state.\n */\n rebalanceByLevel(projectId: string, level: TaskLevel): Result<void>;\n /** FTS5 ranked search across all text fields */\n search(query: string, projectId?: string): Result<SearchResult[]>;\n}\n\nexport class SqliteTaskRepository implements TaskRepository {\n constructor(private readonly db: DatabaseSync) {}\n\n insert(id: string, input: CreateTaskInput & { projectId: string }): Result<Task> {\n return logger.startSpan('TaskRepository.insert', () => {\n try {\n const now = new Date().toISOString();\n const level = getTaskLevel(input.type);\n\n // New tasks go after the last active task but before terminal (done/cancelled) tasks\n // within the same level (epics rank among epics, work items among work items).\n const rankResult = this.computeInsertRank(input.projectId, level);\n if (!rankResult.ok) return rankResult;\n const rank = rankResult.value;\n\n this.db\n .prepare(\n `INSERT INTO tasks (id, project_id, parent_id, name, description, type, status, rank, technical_notes, additional_requirements, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n input.projectId,\n input.parentId ?? null,\n input.name,\n input.description ?? '',\n input.type,\n input.status,\n rank,\n input.technicalNotes ?? '',\n input.additionalRequirements ?? '',\n now,\n now,\n );\n\n const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(id) as\n | TaskRow\n | undefined;\n if (!row) {\n return err(new AppError('DB_ERROR', 'Failed to retrieve inserted task'));\n }\n return ok(rowToTask(row));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to insert task', e));\n }\n });\n }\n\n findById(id: string): Result<Task | null> {\n try {\n const row = this.db.prepare(`SELECT * FROM tasks WHERE id = ? AND ${NOT_DELETED}`).get(id) as\n | TaskRow\n | undefined;\n return ok(row ? rowToTask(row) : null);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to find task by id', e));\n }\n }\n\n findMany(filter: TaskFilter): Result<Task[]> {\n try {\n const conditions: string[] = [NOT_DELETED];\n const params: string[] = [];\n\n if (filter.projectId) {\n conditions.push('project_id = ?');\n params.push(filter.projectId);\n }\n if (filter.status) {\n conditions.push('status = ?');\n params.push(filter.status);\n }\n if (filter.type) {\n conditions.push('type = ?');\n params.push(filter.type);\n }\n if (filter.level !== undefined) {\n const typesForLevel = this.getTypesForLevel(filter.level as TaskLevel);\n const placeholders = typesForLevel.map(() => '?').join(', ');\n conditions.push(`type IN (${placeholders})`);\n params.push(...typesForLevel);\n }\n if (filter.parentId) {\n conditions.push('parent_id = ?');\n params.push(filter.parentId);\n }\n if (filter.parentIds && filter.parentIds.length > 0) {\n const placeholders = filter.parentIds.map(() => '?').join(', ');\n conditions.push(`parent_id IN (${placeholders})`);\n params.push(...filter.parentIds);\n }\n if (filter.search) {\n const parsed = parseSearchQuery(filter.search);\n if (parsed.kind === 'id') {\n conditions.push(`id LIKE ?`);\n params.push(`%${parsed.value}%`);\n } else {\n // Use FTS5 for tokenized, ranked search with prefix matching\n const ftsQuery = parsed.query\n .split(/\\s+/)\n .map((term) => `\"${term.replace(/\"/g, '\"\"')}\"*`)\n .join(' ');\n conditions.push(`id IN (SELECT id FROM tasks_fts WHERE tasks_fts MATCH ?)`);\n params.push(ftsQuery);\n }\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const sql = `SELECT * FROM tasks ${where} ORDER BY rank ASC`;\n\n const rows = this.db.prepare(sql).all(...params) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to list tasks', e));\n }\n }\n\n update(id: string, input: UpdateTaskInput): Result<Task> {\n return logger.startSpan('TaskRepository.update', () => {\n try {\n const existing = this.db\n .prepare(`SELECT * FROM tasks WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as TaskRow | undefined;\n if (!existing) {\n return err(new AppError('NOT_FOUND', `Task not found: ${id}`));\n }\n\n const now = new Date().toISOString();\n\n let technicalNotes = input.technicalNotes ?? existing.technical_notes;\n if (input.appendNotes) {\n technicalNotes =\n existing.technical_notes +\n (existing.technical_notes ? `\\n\\n---\\n_${now}_\\n\\n` : '') +\n input.appendNotes;\n }\n\n let additionalRequirements =\n input.additionalRequirements ?? existing.additional_requirements;\n if (input.appendRequirements) {\n additionalRequirements =\n existing.additional_requirements +\n (existing.additional_requirements ? `\\n\\n---\\n_${now}_\\n\\n` : '') +\n input.appendRequirements;\n }\n\n this.db\n .prepare(\n `UPDATE tasks SET\n name = ?, description = ?, type = ?, status = ?,\n parent_id = ?, technical_notes = ?, additional_requirements = ?, updated_at = ?\n WHERE id = ?`,\n )\n .run(\n input.name ?? existing.name,\n input.description ?? existing.description,\n input.type ?? existing.type,\n input.status ?? existing.status,\n input.parentId !== undefined ? input.parentId : existing.parent_id,\n technicalNotes,\n additionalRequirements,\n now,\n id,\n );\n\n const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(id) as\n | TaskRow\n | undefined;\n if (!row) {\n return err(new AppError('DB_ERROR', 'Failed to retrieve updated task'));\n }\n return ok(rowToTask(row));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to update task', e));\n }\n });\n }\n\n delete(id: string): Result<void> {\n return logger.startSpan('TaskRepository.delete', () => {\n try {\n const existing = this.db\n .prepare(`SELECT * FROM tasks WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as TaskRow | undefined;\n if (!existing) {\n return err(new AppError('NOT_FOUND', `Task not found: ${id}`));\n }\n const now = new Date().toISOString();\n this.db\n .prepare('UPDATE tasks SET deleted_at = ?, updated_at = ? WHERE id = ?')\n .run(now, now, id);\n return ok(undefined);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to delete task', e));\n }\n });\n }\n\n rerank(taskId: string, newRank: number): Result<Task> {\n return logger.startSpan('TaskRepository.rerank', () => {\n try {\n const now = new Date().toISOString();\n const existing = this.db\n .prepare(`SELECT * FROM tasks WHERE id = ? AND ${NOT_DELETED}`)\n .get(taskId) as TaskRow | undefined;\n if (!existing) {\n return err(new AppError('NOT_FOUND', `Task not found: ${taskId}`));\n }\n this.db\n .prepare('UPDATE tasks SET rank = ?, updated_at = ? WHERE id = ?')\n .run(newRank, now, taskId);\n\n const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(taskId) as\n | TaskRow\n | undefined;\n if (!row) {\n return err(new AppError('DB_ERROR', 'Failed to retrieve reranked task'));\n }\n return ok(rowToTask(row));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to rerank task', e));\n }\n });\n }\n\n getMaxRank(projectId: string): Result<number> {\n try {\n const row = this.db\n .prepare(`SELECT MAX(rank) as max_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED}`)\n .get(projectId) as { max_rank: number | null } | undefined;\n return ok(row?.max_rank ?? 0);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get max rank', e));\n }\n }\n\n getMaxActiveRank(projectId: string): Result<number> {\n try {\n const row = this.db\n .prepare(\n `SELECT MAX(rank) as max_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND status NOT IN (${TERMINAL_PLACEHOLDERS})`,\n )\n .get(projectId, ...TERMINAL_STATUS_ARRAY) as { max_rank: number | null } | undefined;\n return ok(row?.max_rank ?? 0);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get max active rank', e));\n }\n }\n\n getMinTerminalRank(projectId: string): Result<number | null> {\n try {\n const row = this.db\n .prepare(\n `SELECT MIN(rank) as min_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND status IN (${TERMINAL_PLACEHOLDERS})`,\n )\n .get(projectId, ...TERMINAL_STATUS_ARRAY) as { min_rank: number | null } | undefined;\n return ok(row?.min_rank ?? null);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get min terminal rank', e));\n }\n }\n\n getRankedTasks(projectId: string, status?: string): Result<Task[]> {\n try {\n let sql: string;\n let params: string[];\n if (status) {\n sql = `SELECT * FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND status = ? ORDER BY rank ASC`;\n params = [projectId, status];\n } else {\n sql = `SELECT * FROM tasks WHERE project_id = ? AND ${NOT_DELETED} ORDER BY rank ASC`;\n params = [projectId];\n }\n const rows = this.db.prepare(sql).all(...params) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get ranked tasks', e));\n }\n }\n\n private getTypesForLevel(level: TaskLevel): string[] {\n if (level === 1) return ['epic'];\n return [...WORK_TYPES];\n }\n\n getMaxRankByLevel(projectId: string, level: TaskLevel): Result<number> {\n try {\n const types = this.getTypesForLevel(level);\n const placeholders = types.map(() => '?').join(', ');\n const row = this.db\n .prepare(\n `SELECT MAX(rank) as max_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${placeholders})`,\n )\n .get(projectId, ...types) as { max_rank: number | null } | undefined;\n return ok(row?.max_rank ?? 0);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get max rank by level', e));\n }\n }\n\n getMaxActiveRankByLevel(projectId: string, level: TaskLevel): Result<number> {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n const row = this.db\n .prepare(\n `SELECT MAX(rank) as max_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders}) AND status NOT IN (${TERMINAL_PLACEHOLDERS})`,\n )\n .get(projectId, ...types, ...TERMINAL_STATUS_ARRAY) as\n | { max_rank: number | null }\n | undefined;\n return ok(row?.max_rank ?? 0);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get max active rank by level', e));\n }\n }\n\n getMinTerminalRankByLevel(projectId: string, level: TaskLevel): Result<number | null> {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n const row = this.db\n .prepare(\n `SELECT MIN(rank) as min_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders}) AND status IN (${TERMINAL_PLACEHOLDERS})`,\n )\n .get(projectId, ...types, ...TERMINAL_STATUS_ARRAY) as\n | { min_rank: number | null }\n | undefined;\n return ok(row?.min_rank ?? null);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get min terminal rank by level', e));\n }\n }\n\n getRankedTasksByLevel(projectId: string, level: TaskLevel, status?: string): Result<Task[]> {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n let sql: string;\n let params: string[];\n if (status) {\n sql = `SELECT * FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders}) AND status = ? ORDER BY rank ASC`;\n params = [projectId, ...types, status];\n } else {\n sql = `SELECT * FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders}) ORDER BY rank ASC`;\n params = [projectId, ...types];\n }\n const rows = this.db.prepare(sql).all(...params) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get ranked tasks by level', e));\n }\n }\n\n getRankedNonTerminalTasksByLevel(projectId: string, level: TaskLevel): Result<Task[]> {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n const sql = `SELECT * FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders}) AND status NOT IN (${TERMINAL_PLACEHOLDERS}) ORDER BY rank ASC`;\n const rows = this.db\n .prepare(sql)\n .all(projectId, ...types, ...TERMINAL_STATUS_ARRAY) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get ranked non-terminal tasks by level', e));\n }\n }\n\n rebalanceByLevel(projectId: string, level: TaskLevel): Result<void> {\n return logger.startSpan('TaskRepository.rebalanceByLevel', () => {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n // Active tasks first (current rank order), then terminal tasks —\n // this both recovers from precision collapse and repairs any\n // pre-existing interleaved state. Precondition: caller is not\n // already inside a transaction.\n const rows = this.db\n .prepare(\n `SELECT * FROM tasks\n WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders})\n ORDER BY\n CASE WHEN status IN (${TERMINAL_PLACEHOLDERS}) THEN 1 ELSE 0 END ASC,\n rank ASC,\n id ASC`,\n )\n .all(projectId, ...types, ...TERMINAL_STATUS_ARRAY) as TaskRow[];\n\n if (rows.length === 0) return ok(undefined);\n\n const now = new Date().toISOString();\n const updateStmt = this.db.prepare(\n 'UPDATE tasks SET rank = ?, updated_at = ? WHERE id = ?',\n );\n\n this.db.exec('BEGIN');\n try {\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (!row) continue;\n const newRank = (i + 1) * RANK_GAP;\n if (row.rank === newRank) continue;\n updateStmt.run(newRank, now, row.id);\n }\n this.db.exec('COMMIT');\n } catch (inner) {\n this.db.exec('ROLLBACK');\n throw inner;\n }\n\n return ok(undefined);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to rebalance ranks by level', e));\n }\n });\n }\n\n /**\n * Fetch `(maxActive, minTerminal)` for a level in a single SQL round-trip.\n * Used by the insert hot path — faster than calling the two separate\n * level accessors in sequence.\n */\n private getRankBoundsByLevel(\n projectId: string,\n level: TaskLevel,\n ): Result<{ maxActive: number; minTerminal: number | null }> {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n const row = this.db\n .prepare(\n `SELECT\n MAX(CASE WHEN status NOT IN (${TERMINAL_PLACEHOLDERS}) THEN rank END) AS max_active,\n MIN(CASE WHEN status IN (${TERMINAL_PLACEHOLDERS}) THEN rank END) AS min_terminal\n FROM tasks\n WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders})`,\n )\n .get(...TERMINAL_STATUS_ARRAY, ...TERMINAL_STATUS_ARRAY, projectId, ...types) as\n | { max_active: number | null; min_terminal: number | null }\n | undefined;\n return ok({\n maxActive: row?.max_active ?? 0,\n minTerminal: row?.min_terminal ?? null,\n });\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get rank bounds by level', e));\n }\n }\n\n /**\n * Compute a fresh rank for a new active task at the given level.\n *\n * Wedges the new task between the last active task and the first terminal\n * task. If the midpoint collapses against either endpoint, or if the\n * level is already in a corrupt interleaved state (terminal rank ≤\n * active rank), rebalance the level once and recompute.\n */\n private computeInsertRank(projectId: string, level: TaskLevel): Result<number> {\n const attempt = (): Result<number | null> => {\n const boundsResult = this.getRankBoundsByLevel(projectId, level);\n if (!boundsResult.ok) return boundsResult;\n const { maxActive, minTerminal } = boundsResult.value;\n\n if (minTerminal === null) {\n return ok(maxActive + RANK_GAP);\n }\n if (minTerminal <= maxActive) {\n return ok(null);\n }\n // Anchor against the terminal when there are no prior active tasks\n // (or the first active task happens to sit at rank 0).\n if (maxActive <= 0) {\n return ok(minTerminal - RANK_GAP);\n }\n return ok(midpoint(maxActive, minTerminal));\n };\n\n const first = attempt();\n if (!first.ok) return first;\n if (first.value !== null) return ok(first.value);\n\n const rebalanceResult = this.rebalanceByLevel(projectId, level);\n if (!rebalanceResult.ok) return rebalanceResult;\n\n const second = attempt();\n if (!second.ok) return second;\n if (second.value === null) {\n return err(new AppError('DB_ERROR', 'Rank computation did not converge after rebalance'));\n }\n return ok(second.value);\n }\n\n search(query: string, projectId?: string): Result<SearchResult[]> {\n return logger.startSpan('TaskRepository.search', () => {\n try {\n const parsed = parseSearchQuery(query);\n\n if (parsed.kind === 'id') {\n const conditions = ['t.id LIKE ?', 't.deleted_at IS NULL'];\n const params: string[] = [`%${parsed.value}%`];\n if (projectId) {\n conditions.push('t.project_id = ?');\n params.push(projectId);\n }\n const sql = `SELECT t.*, 0 AS fts_rank FROM tasks t WHERE ${conditions.join(' AND ')} ORDER BY t.rank ASC`;\n const rows = this.db.prepare(sql).all(...params) as (TaskRow & { fts_rank: number })[];\n return ok(rows.map((row) => ({ task: rowToTask(row), rank: row.fts_rank })));\n }\n\n const ftsQuery = parsed.query\n .split(/\\s+/)\n .map((term) => `\"${term.replace(/\"/g, '\"\"')}\"*`)\n .join(' ');\n\n let sql: string;\n let params: string[];\n\n if (projectId) {\n sql = `SELECT t.*, bm25(tasks_fts) AS fts_rank\n FROM tasks_fts f\n JOIN tasks t ON t.id = f.id AND t.deleted_at IS NULL\n WHERE tasks_fts MATCH ? AND t.project_id = ?\n ORDER BY fts_rank ASC`;\n params = [ftsQuery, projectId];\n } else {\n sql = `SELECT t.*, bm25(tasks_fts) AS fts_rank\n FROM tasks_fts f\n JOIN tasks t ON t.id = f.id AND t.deleted_at IS NULL\n WHERE tasks_fts MATCH ?\n ORDER BY fts_rank ASC`;\n params = [ftsQuery];\n }\n\n const rows = this.db.prepare(sql).all(...params) as (TaskRow & { fts_rank: number })[];\n return ok(\n rows.map((row) => ({\n task: rowToTask(row),\n rank: row.fts_rank,\n })),\n );\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Full-text search failed', e));\n }\n });\n }\n}\n","import type { DatabaseSync } from 'node:sqlite';\nimport type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type { TaskDependency } from '../types/dependency.js';\nimport type { Task } from '../types/task.js';\nimport type { DependencyType } from '../types/enums.js';\nimport { AppError } from '../errors/app-error.js';\nimport { logger } from '../logging/logger.js';\nimport { type TaskRow, rowToTask } from './shared.js';\n\ninterface DependencyRow {\n task_id: string;\n depends_on_id: string;\n type: string;\n created_at: string;\n}\n\nfunction rowToDependency(row: DependencyRow): TaskDependency {\n return {\n taskId: row.task_id,\n dependsOnId: row.depends_on_id,\n type: row.type as DependencyType,\n createdAt: row.created_at,\n };\n}\n\nexport interface DependencyRepository {\n insert(taskId: string, dependsOnId: string, type: DependencyType): Result<TaskDependency>;\n delete(taskId: string, dependsOnId: string): Result<void>;\n findByTask(taskId: string): Result<TaskDependency[]>;\n findDependents(taskId: string): Result<TaskDependency[]>;\n /** Tasks that block taskId (taskId depends on them via 'blocks' type). */\n getBlockers(taskId: string): Result<Task[]>;\n /** Tasks that taskId blocks (they depend on taskId via 'blocks' type). */\n getDependents(taskId: string): Result<Task[]>;\n /** Tasks related to taskId via 'relates-to' in either direction. */\n getRelated(taskId: string): Result<Task[]>;\n /** Tasks connected to taskId via 'duplicates' in either direction. */\n getDuplicates(taskId: string): Result<Task[]>;\n /** Returns all transitive blockers using recursive CTE */\n getTransitiveClosure(taskId: string): Result<Task[]>;\n /** Checks if adding an edge would create a cycle */\n wouldCreateCycle(taskId: string, dependsOnId: string): Result<boolean>;\n}\n\nexport class SqliteDependencyRepository implements DependencyRepository {\n constructor(private readonly db: DatabaseSync) {}\n\n insert(taskId: string, dependsOnId: string, type: DependencyType): Result<TaskDependency> {\n return logger.startSpan('DependencyRepository.insert', () => {\n try {\n const now = new Date().toISOString();\n this.db\n .prepare(\n `INSERT INTO task_dependencies (task_id, depends_on_id, type, created_at)\n VALUES (?, ?, ?, ?)`,\n )\n .run(taskId, dependsOnId, type, now);\n\n const row = this.db\n .prepare('SELECT * FROM task_dependencies WHERE task_id = ? AND depends_on_id = ?')\n .get(taskId, dependsOnId) as DependencyRow | undefined;\n if (!row) {\n return err(new AppError('DB_ERROR', 'Failed to retrieve inserted dependency'));\n }\n return ok(rowToDependency(row));\n } catch (e) {\n if (e instanceof Error && e.message.includes('UNIQUE constraint')) {\n return err(\n new AppError('DUPLICATE', `Dependency already exists: ${taskId} -> ${dependsOnId}`, e),\n );\n }\n if (e instanceof Error && e.message.includes('FOREIGN KEY constraint')) {\n return err(new AppError('NOT_FOUND', 'One or both tasks do not exist', e));\n }\n if (e instanceof Error && e.message.includes('CHECK constraint')) {\n return err(new AppError('VALIDATION', 'A task cannot depend on itself', e));\n }\n return err(new AppError('DB_ERROR', 'Failed to insert dependency', e));\n }\n });\n }\n\n delete(taskId: string, dependsOnId: string): Result<void> {\n return logger.startSpan('DependencyRepository.delete', () => {\n try {\n const existing = this.db\n .prepare('SELECT * FROM task_dependencies WHERE task_id = ? AND depends_on_id = ?')\n .get(taskId, dependsOnId) as DependencyRow | undefined;\n if (!existing) {\n return err(\n new AppError('NOT_FOUND', `Dependency not found: ${taskId} -> ${dependsOnId}`),\n );\n }\n this.db\n .prepare('DELETE FROM task_dependencies WHERE task_id = ? AND depends_on_id = ?')\n .run(taskId, dependsOnId);\n return ok(undefined);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to delete dependency', e));\n }\n });\n }\n\n findByTask(taskId: string): Result<TaskDependency[]> {\n try {\n const rows = this.db\n .prepare('SELECT * FROM task_dependencies WHERE task_id = ? ORDER BY created_at ASC')\n .all(taskId) as DependencyRow[];\n return ok(rows.map(rowToDependency));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to find dependencies for task', e));\n }\n }\n\n findDependents(taskId: string): Result<TaskDependency[]> {\n try {\n const rows = this.db\n .prepare('SELECT * FROM task_dependencies WHERE depends_on_id = ? ORDER BY created_at ASC')\n .all(taskId) as DependencyRow[];\n return ok(rows.map(rowToDependency));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to find dependents for task', e));\n }\n }\n\n getBlockers(taskId: string): Result<Task[]> {\n try {\n const rows = this.db\n .prepare(\n `SELECT t.* FROM tasks t\n JOIN task_dependencies td ON t.id = td.depends_on_id\n WHERE td.task_id = ? AND td.type = 'blocks' AND t.deleted_at IS NULL\n ORDER BY t.rank ASC`,\n )\n .all(taskId) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get blockers', e));\n }\n }\n\n getDependents(taskId: string): Result<Task[]> {\n try {\n const rows = this.db\n .prepare(\n `SELECT t.* FROM tasks t\n JOIN task_dependencies td ON t.id = td.task_id\n WHERE td.depends_on_id = ? AND td.type = 'blocks' AND t.deleted_at IS NULL\n ORDER BY t.rank ASC`,\n )\n .all(taskId) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get dependents', e));\n }\n }\n\n getRelated(taskId: string): Result<Task[]> {\n try {\n const rows = this.db\n .prepare(\n `SELECT DISTINCT t.* FROM tasks t\n JOIN task_dependencies td ON (\n (td.task_id = ? AND td.depends_on_id = t.id) OR\n (td.depends_on_id = ? AND td.task_id = t.id)\n )\n WHERE td.type = 'relates-to' AND t.deleted_at IS NULL\n ORDER BY t.rank ASC`,\n )\n .all(taskId, taskId) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get related tasks', e));\n }\n }\n\n getDuplicates(taskId: string): Result<Task[]> {\n try {\n const rows = this.db\n .prepare(\n `SELECT DISTINCT t.* FROM tasks t\n JOIN task_dependencies td ON (\n (td.task_id = ? AND td.depends_on_id = t.id) OR\n (td.depends_on_id = ? AND td.task_id = t.id)\n )\n WHERE td.type = 'duplicates' AND t.deleted_at IS NULL\n ORDER BY t.rank ASC`,\n )\n .all(taskId, taskId) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get duplicate tasks', e));\n }\n }\n\n getTransitiveClosure(taskId: string): Result<Task[]> {\n try {\n const rows = this.db\n .prepare(\n `WITH RECURSIVE transitive_deps(id) AS (\n SELECT depends_on_id FROM task_dependencies WHERE task_id = ?\n UNION\n SELECT td.depends_on_id FROM task_dependencies td\n JOIN transitive_deps d ON td.task_id = d.id\n )\n SELECT t.* FROM tasks t\n WHERE t.id IN (SELECT id FROM transitive_deps) AND t.deleted_at IS NULL\n ORDER BY t.rank ASC`,\n )\n .all(taskId) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to get transitive closure', e));\n }\n }\n\n wouldCreateCycle(taskId: string, dependsOnId: string): Result<boolean> {\n try {\n // Check: can we reach taskId starting from dependsOnId by following depends_on edges?\n // If yes, adding dependsOnId -> taskId would create a cycle.\n const row = this.db\n .prepare(\n `WITH RECURSIVE reachable(id) AS (\n SELECT depends_on_id FROM task_dependencies WHERE task_id = ?\n UNION\n SELECT td.depends_on_id FROM task_dependencies td\n JOIN reachable r ON td.task_id = r.id\n )\n SELECT 1 AS found FROM reachable WHERE id = ? LIMIT 1`,\n )\n .get(dependsOnId, taskId) as { found: number } | undefined;\n return ok(row !== undefined);\n } catch (e) {\n return err(new AppError('DB_ERROR', 'Failed to check for cycle', e));\n }\n }\n}\n","import { z } from 'zod/v4';\nimport { GitRemote } from './git-remote.js';\n\nconst gitRemoteField = z\n .string()\n .min(1, 'Git remote URL must not be empty')\n .transform((v) => GitRemote.parse(v))\n .nullable()\n .optional();\n\nexport const CreateProjectSchema = z.object({\n name: z.string().min(1, 'Project name is required').max(255),\n key: z\n .string()\n .min(2, 'Project key must be at least 2 characters')\n .max(7, 'Project key must be at most 7 characters')\n .regex(/^[A-Za-z0-9]+$/, 'Project key must contain only letters and digits')\n .transform((v) => v.toUpperCase())\n .optional(),\n description: z.string().max(5000).optional(),\n isDefault: z.boolean().optional(),\n gitRemote: gitRemoteField,\n});\nexport type CreateProjectInput = z.infer<typeof CreateProjectSchema>;\n\nexport const UpdateProjectSchema = z.object({\n name: z.string().min(1).max(255).optional(),\n description: z.string().max(5000).optional(),\n isDefault: z.boolean().optional(),\n gitRemote: gitRemoteField,\n});\nexport type UpdateProjectInput = z.infer<typeof UpdateProjectSchema>;\n\nexport interface Project {\n id: string;\n key: string;\n name: string;\n description: string;\n isDefault: boolean;\n gitRemote: GitRemote | null;\n createdAt: string;\n updatedAt: string;\n}\n","import type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type { Project } from '../types/project.js';\nimport { CreateProjectSchema, UpdateProjectSchema } from '../types/project.js';\nimport { GitRemote } from '../types/git-remote.js';\nimport type { ProjectRepository } from '../repository/project.repository.js';\nimport { AppError } from '../errors/app-error.js';\nimport { logger } from '../logging/logger.js';\nimport { detectGitRemote as defaultDetectGitRemote } from '../utils/git.js';\n\nexport type DetectGitRemoteFn = (cwd?: string) => Result<GitRemote | null>;\n\nexport interface ProjectService {\n createProject(input: unknown): Result<Project>;\n listProjects(): Result<Project[]>;\n getProject(id: string): Result<Project>;\n updateProject(id: string, input: unknown): Result<Project>;\n deleteProject(id: string): Result<void>;\n resolveProject(idOrName?: string, cwd?: string): Result<Project>;\n linkGitRemote(idOrName: string, remote?: string): Result<Project>;\n unlinkGitRemote(idOrName: string): Result<Project>;\n nextTaskId(project: Project): Result<string>;\n}\n\nexport class ProjectServiceImpl implements ProjectService {\n constructor(\n private readonly repo: ProjectRepository,\n private readonly detectRemote: DetectGitRemoteFn = defaultDetectGitRemote,\n ) {}\n\n createProject(input: unknown): Result<Project> {\n return logger.startSpan('ProjectService.createProject', () => {\n const parsed = CreateProjectSchema.safeParse(input);\n if (!parsed.success) {\n return err(new AppError('VALIDATION', parsed.error.message));\n }\n\n const key = parsed.data.key ?? this.generateKey(parsed.data.name);\n const keyError = this.validateKey(key);\n if (keyError) {\n return err(new AppError('VALIDATION', keyError));\n }\n\n const existingResult = this.repo.findByKey(key);\n if (!existingResult.ok) return existingResult;\n if (existingResult.value) {\n return err(new AppError('DUPLICATE', `Project key already exists: ${key}`));\n }\n\n return this.repo.insert({ ...parsed.data, key });\n });\n }\n\n private generateKey(name: string): string {\n return name\n .replace(/[^A-Za-z0-9]/g, '')\n .slice(0, 3)\n .toUpperCase();\n }\n\n private validateKey(key: string): string | null {\n if (key.length < 2 || key.length > 7) {\n return `Project key must be 2-7 characters, got ${key.length}. Provide a --key explicitly.`;\n }\n if (!/^[A-Z0-9]+$/.test(key)) {\n return 'Project key must contain only uppercase letters and digits.';\n }\n return null;\n }\n\n listProjects(): Result<Project[]> {\n return this.repo.findAll();\n }\n\n getProject(id: string): Result<Project> {\n return logger.startSpan('ProjectService.getProject', () => {\n const result = this.repo.findById(id);\n if (!result.ok) return result;\n if (!result.value) {\n return err(new AppError('NOT_FOUND', `Project not found: ${id}`));\n }\n return ok(result.value);\n });\n }\n\n updateProject(id: string, input: unknown): Result<Project> {\n return logger.startSpan('ProjectService.updateProject', () => {\n const parsed = UpdateProjectSchema.safeParse(input);\n if (!parsed.success) {\n return err(new AppError('VALIDATION', parsed.error.message));\n }\n return this.repo.update(id, parsed.data);\n });\n }\n\n deleteProject(id: string): Result<void> {\n return this.repo.delete(id);\n }\n\n resolveProject(idOrName?: string, cwd?: string): Result<Project> {\n return logger.startSpan('ProjectService.resolveProject', () => {\n if (idOrName) {\n const byId = this.repo.findById(idOrName);\n if (!byId.ok) return byId;\n if (byId.value) return ok(byId.value);\n\n const byKey = this.repo.findByKey(idOrName.toUpperCase());\n if (!byKey.ok) return byKey;\n if (byKey.value) return ok(byKey.value);\n\n const byName = this.repo.findByName(idOrName);\n if (!byName.ok) return byName;\n if (byName.value) return ok(byName.value);\n\n return err(new AppError('NOT_FOUND', `Project not found: ${idOrName}`));\n }\n\n // Try git remote detection before falling back to default\n const remoteResult = this.detectRemote(cwd);\n if (remoteResult.ok && remoteResult.value) {\n const byRemote = this.repo.findByGitRemote(remoteResult.value);\n if (!byRemote.ok) return byRemote;\n if (byRemote.value) {\n logger.info(`resolveProject: matched git remote to project key=${byRemote.value.key}`);\n return ok(byRemote.value);\n }\n }\n\n const defaultProject = this.repo.findDefault();\n if (!defaultProject.ok) return defaultProject;\n if (defaultProject.value) return ok(defaultProject.value);\n\n return err(\n new AppError(\n 'NOT_FOUND',\n 'No project specified and no default project set. Create a project first.',\n ),\n );\n });\n }\n\n linkGitRemote(idOrName: string, remote?: string): Result<Project> {\n return logger.startSpan('ProjectService.linkGitRemote', () => {\n const resolved = this.resolveProject(idOrName);\n if (!resolved.ok) return resolved;\n\n let gitRemote: GitRemote;\n if (remote) {\n gitRemote = GitRemote.parse(remote);\n } else {\n const detected = this.detectRemote();\n if (!detected.ok) return detected;\n if (!detected.value) {\n return err(\n new AppError(\n 'NOT_FOUND',\n 'No git remote detected in current directory. Use --remote <url> to specify one explicitly.',\n ),\n );\n }\n gitRemote = detected.value;\n }\n\n return this.repo.update(resolved.value.id, { gitRemote });\n });\n }\n\n unlinkGitRemote(idOrName: string): Result<Project> {\n return logger.startSpan('ProjectService.unlinkGitRemote', () => {\n const resolved = this.resolveProject(idOrName);\n if (!resolved.ok) return resolved;\n\n if (!resolved.value.gitRemote) {\n return err(\n new AppError('NOT_FOUND', `Project \"${resolved.value.name}\" has no linked git remote.`),\n );\n }\n\n return this.repo.update(resolved.value.id, { gitRemote: null });\n });\n }\n\n nextTaskId(project: Project): Result<string> {\n return logger.startSpan('ProjectService.nextTaskId', () => {\n const counterResult = this.repo.incrementTaskCounter(project.id);\n if (!counterResult.ok) return counterResult;\n return ok(`${project.key}-${counterResult.value}`);\n });\n }\n}\n","import { z } from 'zod/v4';\nimport { TaskStatus, TaskType, DependencyType, UIDependencyType } from './enums.js';\n\nconst taskStatusValues = Object.values(TaskStatus) as [string, ...string[]];\nconst taskTypeValues = Object.values(TaskType) as [string, ...string[]];\nconst uiDepTypeValues = Object.values(UIDependencyType) as [string, ...string[]];\n\nconst DependencyEntrySchema = z.object({\n id: z.string().min(1),\n type: z.enum(uiDepTypeValues).default(DependencyType.Blocks),\n});\nexport type DependencyEntry = z.infer<typeof DependencyEntrySchema>;\n\nexport const CreateTaskSchema = z.object({\n name: z.string().min(1, 'Task name is required').max(500),\n description: z.string().max(10000).optional(),\n type: z.enum(taskTypeValues).default(TaskType.Story),\n status: z.enum(taskStatusValues).default(TaskStatus.Backlog),\n projectId: z.string().optional(),\n parentId: z.string().optional(),\n technicalNotes: z.string().max(50000).optional(),\n additionalRequirements: z.string().max(50000).optional(),\n dependsOn: z.array(DependencyEntrySchema).optional(),\n});\nexport type CreateTaskInput = z.infer<typeof CreateTaskSchema>;\n\nexport const UpdateTaskSchema = z.object({\n name: z.string().min(1).max(500).optional(),\n description: z.string().max(10000).optional(),\n type: z.enum(taskTypeValues).optional(),\n status: z.enum(taskStatusValues).optional(),\n parentId: z.string().nullable().optional(),\n technicalNotes: z.string().max(50000).optional(),\n additionalRequirements: z.string().max(50000).optional(),\n appendNotes: z.string().max(50000).optional(),\n appendRequirements: z.string().max(50000).optional(),\n});\nexport type UpdateTaskInput = z.infer<typeof UpdateTaskSchema>;\n\nexport const TaskFilterSchema = z.object({\n status: z.enum(taskStatusValues).optional(),\n type: z.enum(taskTypeValues).optional(),\n level: z.number().int().min(1).max(2).optional(),\n parentId: z.string().optional(),\n /** Multi-select filter: show tasks whose parentId is in this list. */\n parentIds: z.array(z.string()).optional(),\n search: z.string().optional(),\n});\nexport type TaskFilter = z.infer<typeof TaskFilterSchema> & { projectId?: string };\n\nexport const RerankTaskSchema = z.object({\n taskId: z.string().min(1, 'Task id is required'),\n afterId: z.string().optional(),\n beforeId: z.string().optional(),\n position: z.number().int().min(1).optional(),\n /** Move to the top of active tasks (highest priority). */\n top: z.boolean().optional(),\n /** Move to the bottom of active tasks, kept above terminal (done/cancelled) tasks. */\n bottom: z.boolean().optional(),\n});\nexport type RerankTaskInput = z.infer<typeof RerankTaskSchema>;\n\nexport interface Task {\n id: string;\n projectId: string;\n parentId: string | null;\n name: string;\n description: string;\n type: TaskType;\n status: TaskStatus;\n rank: number;\n technicalNotes: string;\n additionalRequirements: string;\n createdAt: string;\n updatedAt: string;\n}\n","import type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type { Task, TaskFilter } from '../types/task.js';\nimport {\n CreateTaskSchema,\n UpdateTaskSchema,\n TaskFilterSchema,\n RerankTaskSchema,\n} from '../types/task.js';\nimport type { TaskRepository, SearchResult } from '../repository/task.repository.js';\nimport type { ProjectService } from './project.service.js';\nimport type { Project } from '../types/project.js';\nimport type { DependencyService } from './dependency.service.js';\nimport { AppError } from '../errors/app-error.js';\nimport { logger } from '../logging/logger.js';\nimport {\n TaskStatus,\n TaskLevel,\n RANK_GAP,\n isTerminalStatus,\n getTaskLevel,\n midpoint,\n} from '../types/enums.js';\n\nexport interface TaskService {\n createTask(input: unknown, project: Project): Result<Task>;\n getTask(id: string): Result<Task>;\n listTasks(project: Project, filter: unknown): Result<Task[]>;\n updateTask(id: string, input: unknown): Result<Task>;\n deleteTask(id: string): Result<void>;\n breakdownTask(parentId: string, subtasks: unknown[]): Result<Task[]>;\n rerankTask(input: unknown, project: Project): Result<Task>;\n searchTasks(query: string, project: Project): Result<SearchResult[]>;\n}\n\nexport class TaskServiceImpl implements TaskService {\n constructor(\n private readonly repo: TaskRepository,\n private readonly projectService: ProjectService,\n private readonly getDependencyService: () => DependencyService,\n ) {}\n\n createTask(input: unknown, project: Project): Result<Task> {\n return logger.startSpan('TaskService.createTask', () => {\n const parsed = CreateTaskSchema.safeParse(input);\n if (!parsed.success) {\n return err(new AppError('VALIDATION', parsed.error.message));\n }\n\n const taskLevel = getTaskLevel(parsed.data.type);\n\n // Epics (level 1) cannot have a parent\n if (taskLevel === TaskLevel.Epic && parsed.data.parentId) {\n return err(new AppError('VALIDATION', 'Epic tasks cannot have a parent'));\n }\n\n if (parsed.data.parentId) {\n const parentResult = this.repo.findById(parsed.data.parentId);\n if (!parentResult.ok) return parentResult;\n if (!parentResult.value) {\n return err(new AppError('NOT_FOUND', `Parent task not found: ${parsed.data.parentId}`));\n }\n // Level 2 tasks can only be children of level 1 (epic) tasks\n if (getTaskLevel(parentResult.value.type) !== TaskLevel.Epic) {\n return err(new AppError('VALIDATION', 'Tasks can only be children of epic-level tasks'));\n }\n }\n\n const taskIdResult = this.projectService.nextTaskId(project);\n if (!taskIdResult.ok) return taskIdResult;\n\n const insertResult = this.repo.insert(taskIdResult.value, {\n ...parsed.data,\n projectId: project.id,\n });\n if (!insertResult.ok) return insertResult;\n\n if (parsed.data.dependsOn && parsed.data.dependsOn.length > 0) {\n for (const entry of parsed.data.dependsOn) {\n const depResult = this.getDependencyService().addDependency({\n taskId: insertResult.value.id,\n dependsOnId: entry.id,\n type: entry.type,\n });\n if (!depResult.ok) return depResult;\n }\n }\n\n return insertResult;\n });\n }\n\n getTask(id: string): Result<Task> {\n return logger.startSpan('TaskService.getTask', () => {\n const result = this.repo.findById(id);\n if (!result.ok) return result;\n if (!result.value) {\n return err(new AppError('NOT_FOUND', `Task not found: ${id}`));\n }\n return ok(result.value);\n });\n }\n\n listTasks(project: Project, filter: unknown): Result<Task[]> {\n return logger.startSpan('TaskService.listTasks', () => {\n const parsed = TaskFilterSchema.safeParse(filter);\n if (!parsed.success) {\n return err(new AppError('VALIDATION', parsed.error.message));\n }\n\n const resolvedFilter: TaskFilter = {\n ...parsed.data,\n projectId: project.id,\n };\n\n return this.repo.findMany(resolvedFilter);\n });\n }\n\n updateTask(id: string, input: unknown): Result<Task> {\n return logger.startSpan('TaskService.updateTask', () => {\n const parsed = UpdateTaskSchema.safeParse(input);\n if (!parsed.success) {\n return err(new AppError('VALIDATION', parsed.error.message));\n }\n\n // Enforce: cannot start a task that still has unfinished blockers.\n if (parsed.data.status === TaskStatus.InProgress) {\n const blockersResult = this.getDependencyService().listBlockers(id);\n if (!blockersResult.ok) return blockersResult;\n const hasNonTerminalBlocker = blockersResult.value.some((b) => !isTerminalStatus(b.status));\n if (hasNonTerminalBlocker) {\n return err(new AppError('VALIDATION', 'Task is blocked by unfinished dependencies'));\n }\n }\n\n // Fetch existing task for level/status transition checks\n const existingResult = this.repo.findById(id);\n if (!existingResult.ok) return existingResult;\n if (!existingResult.value) {\n return err(new AppError('NOT_FOUND', `Task not found: ${id}`));\n }\n const existing = existingResult.value;\n\n // Validate type change against level constraints\n if (parsed.data.type) {\n const newLevel = getTaskLevel(parsed.data.type);\n const oldLevel = getTaskLevel(existing.type);\n\n if (newLevel !== oldLevel) {\n // Changing from epic to work: reject if it has children\n if (oldLevel === TaskLevel.Epic) {\n const childrenResult = this.repo.findMany({\n projectId: existing.projectId,\n parentId: id,\n });\n if (childrenResult.ok && childrenResult.value.length > 0) {\n return err(\n new AppError(\n 'VALIDATION',\n 'Cannot change type from epic: task has children. Remove children first.',\n ),\n );\n }\n }\n // Changing to epic: reject if it has a parent\n if (newLevel === TaskLevel.Epic && existing.parentId) {\n return err(new AppError('VALIDATION', 'Cannot change type to epic: task has a parent'));\n }\n }\n }\n\n // Validate parentId change against level constraints\n if (parsed.data.parentId !== undefined) {\n const effectiveType = parsed.data.type ?? existing.type;\n const effectiveLevel = getTaskLevel(effectiveType);\n\n if (effectiveLevel === TaskLevel.Epic && parsed.data.parentId) {\n return err(new AppError('VALIDATION', 'Epic tasks cannot have a parent'));\n }\n if (parsed.data.parentId) {\n const parentResult = this.repo.findById(parsed.data.parentId);\n if (!parentResult.ok) return parentResult;\n if (!parentResult.value) {\n return err(new AppError('NOT_FOUND', `Parent task not found: ${parsed.data.parentId}`));\n }\n if (getTaskLevel(parentResult.value.type) !== TaskLevel.Epic) {\n return err(\n new AppError('VALIDATION', 'Tasks can only be children of epic-level tasks'),\n );\n }\n }\n }\n\n // Check if transitioning to terminal status (done/cancelled)\n if (parsed.data.status && isTerminalStatus(parsed.data.status)) {\n const effectiveType = parsed.data.type ?? existing.type;\n const level = getTaskLevel(effectiveType);\n\n const updateResult = this.repo.update(id, parsed.data);\n if (!updateResult.ok) return updateResult;\n\n // Auto-rerank to bottom only when transitioning from active → terminal\n if (!isTerminalStatus(existing.status)) {\n const maxRankResult = this.repo.getMaxRankByLevel(existing.projectId, level);\n if (!maxRankResult.ok) return maxRankResult;\n const rerankResult = this.repo.rerank(id, maxRankResult.value + RANK_GAP);\n if (!rerankResult.ok) return rerankResult;\n this.propagateParentStatus(existing);\n return rerankResult;\n }\n this.propagateParentStatus(existing);\n return updateResult;\n }\n\n const updateResult = this.repo.update(id, parsed.data);\n if (!updateResult.ok) return updateResult;\n\n // Propagate status to parent when transitioning to in-progress\n if (parsed.data.status && parsed.data.status !== existing.status) {\n this.propagateParentStatus(existing);\n }\n\n return updateResult;\n });\n }\n\n deleteTask(id: string): Result<void> {\n return this.repo.delete(id);\n }\n\n breakdownTask(parentId: string, subtasks: unknown[]): Result<Task[]> {\n return logger.startSpan('TaskService.breakdownTask', () => {\n const parentResult = this.repo.findById(parentId);\n if (!parentResult.ok) return parentResult;\n if (!parentResult.value) {\n return err(new AppError('NOT_FOUND', `Parent task not found: ${parentId}`));\n }\n\n const parent = parentResult.value;\n\n // Parent must be an epic (level 1) to have children\n if (getTaskLevel(parent.type) !== TaskLevel.Epic) {\n return err(new AppError('VALIDATION', 'Breakdown parent must be an epic-level task'));\n }\n\n const projectResult = this.projectService.getProject(parent.projectId);\n if (!projectResult.ok) return projectResult;\n const project = projectResult.value;\n\n const created: Task[] = [];\n\n for (const subtask of subtasks) {\n const parsed = CreateTaskSchema.safeParse(subtask);\n if (!parsed.success) {\n return err(new AppError('VALIDATION', `Invalid subtask: ${parsed.error.message}`));\n }\n\n // Subtasks must be level 2 (work items)\n if (getTaskLevel(parsed.data.type) === TaskLevel.Epic) {\n return err(new AppError('VALIDATION', `Subtask \"${parsed.data.name}\" cannot be an epic`));\n }\n\n const taskIdResult = this.projectService.nextTaskId(project);\n if (!taskIdResult.ok) return taskIdResult;\n\n const result = this.repo.insert(taskIdResult.value, {\n ...parsed.data,\n projectId: parent.projectId,\n parentId,\n });\n if (!result.ok) return result;\n created.push(result.value);\n }\n\n return ok(created);\n });\n }\n\n /**\n * Re-rank a task using Jira-style ranking:\n * - afterId: place the task immediately after the given task\n * - beforeId: place the task immediately before the given task\n * - position: place the task at the given 1-based position in the backlog\n *\n * New rank is computed as the midpoint between neighbors.\n * If moving to the top, rank = first_rank - GAP.\n * If moving to the bottom, rank = last_rank + GAP.\n */\n rerankTask(input: unknown, project: Project): Result<Task> {\n return logger.startSpan('TaskService.rerankTask', () => {\n const parsed = RerankTaskSchema.safeParse(input);\n if (!parsed.success) {\n return err(new AppError('VALIDATION', parsed.error.message));\n }\n\n const { taskId, afterId, beforeId, position, top, bottom } = parsed.data;\n\n const specifiedCount =\n [afterId, beforeId, position].filter((v) => v !== undefined).length +\n (top ? 1 : 0) +\n (bottom ? 1 : 0);\n if (specifiedCount !== 1) {\n return err(\n new AppError(\n 'VALIDATION',\n 'Exactly one of --after, --before, --position, --top, or --bottom must be specified',\n ),\n );\n }\n\n const taskResult = this.repo.findById(taskId);\n if (!taskResult.ok) return taskResult;\n if (!taskResult.value) {\n return err(new AppError('NOT_FOUND', `Task not found: ${taskId}`));\n }\n const task = taskResult.value;\n\n if (isTerminalStatus(task.status)) {\n return err(\n new AppError(\n 'VALIDATION',\n `Cannot rerank a task with status '${task.status}'. Only active tasks can be reranked.`,\n ),\n );\n }\n\n const taskLevel = getTaskLevel(task.type);\n\n const projectId = project.id;\n\n // Filtering excludes terminal and cross-project tasks — neither\n // participates in this rank space, so they cannot constrain it.\n const depService = this.getDependencyService();\n const blockersResult = depService.listBlockers(taskId);\n if (!blockersResult.ok) return blockersResult;\n const constrainingBlockers = blockersResult.value.filter(\n (b) => !isTerminalStatus(b.status) && b.projectId === projectId,\n );\n const dependentsResult = depService.listDependents(taskId);\n if (!dependentsResult.ok) return dependentsResult;\n const constrainingDependents = dependentsResult.value.filter(\n (d) => !isTerminalStatus(d.status) && d.projectId === projectId,\n );\n\n // Returns `ok(null)` to signal FP precision collapse — the caller\n // rebalances once and retries on a fresh snapshot.\n const attempt = (): Result<number | null> => {\n const rankedResult = this.repo.getRankedNonTerminalTasksByLevel(projectId, taskLevel);\n if (!rankedResult.ok) return rankedResult;\n const ranked = rankedResult.value.filter((t) => t.id !== taskId);\n\n if (top === true) {\n return ok(this.computeTopRank(ranked, constrainingBlockers));\n }\n if (bottom === true) {\n const minTerminalResult = this.repo.getMinTerminalRankByLevel(projectId, taskLevel);\n if (!minTerminalResult.ok) return minTerminalResult;\n return ok(\n this.computeBottomRank(ranked, minTerminalResult.value, constrainingDependents),\n );\n }\n if (afterId) {\n const anchorIndex = ranked.findIndex((t) => t.id === afterId);\n const anchor = ranked[anchorIndex];\n if (!anchor) {\n return err(\n new AppError('NOT_FOUND', `Anchor task not found among active tasks: ${afterId}`),\n );\n }\n const next = ranked[anchorIndex + 1];\n return ok(next ? midpoint(anchor.rank, next.rank) : anchor.rank + RANK_GAP);\n }\n if (beforeId) {\n const anchorIndex = ranked.findIndex((t) => t.id === beforeId);\n const anchor = ranked[anchorIndex];\n if (!anchor) {\n return err(\n new AppError('NOT_FOUND', `Anchor task not found among active tasks: ${beforeId}`),\n );\n }\n const prev = ranked[anchorIndex - 1];\n return ok(prev ? midpoint(prev.rank, anchor.rank) : anchor.rank - RANK_GAP);\n }\n // position is defined — guaranteed by the specifiedCount === 1 check above.\n const pos = position as number;\n if (pos < 1) {\n return err(new AppError('VALIDATION', 'Position must be >= 1'));\n }\n if (pos === 1) {\n return ok(this.computeTopRank(ranked));\n }\n if (pos > ranked.length) {\n const minTerminalResult = this.repo.getMinTerminalRankByLevel(projectId, taskLevel);\n if (!minTerminalResult.ok) return minTerminalResult;\n return ok(this.computeBottomRank(ranked, minTerminalResult.value));\n }\n const above = ranked[pos - 2];\n const below = ranked[pos - 1];\n if (!above || !below) {\n return err(new AppError('DB_ERROR', 'Unexpected missing neighbor tasks'));\n }\n return ok(midpoint(above.rank, below.rank));\n };\n\n let computed = attempt();\n if (!computed.ok) return computed;\n if (computed.value === null) {\n const rb = this.repo.rebalanceByLevel(projectId, taskLevel);\n if (!rb.ok) return rb;\n computed = attempt();\n if (!computed.ok) return computed;\n if (computed.value === null) {\n return err(new AppError('DB_ERROR', 'Rank computation did not converge after rebalance'));\n }\n }\n const newRank = computed.value;\n\n // Dependency constraint: a blocked task must not rank higher (lower number)\n // than any of its blockers, and must not rank lower than any of its dependents.\n // top/bottom clamp these constraints upstream, so this check should only\n // trip for explicit --after/--before/--position requests.\n for (const blocker of constrainingBlockers) {\n if (newRank < blocker.rank) {\n return err(\n new AppError(\n 'VALIDATION',\n `Cannot rank above blocker \"${blocker.id}\" (${blocker.name}). Complete or remove the dependency first.`,\n ),\n );\n }\n }\n for (const dep of constrainingDependents) {\n if (newRank > dep.rank) {\n return err(\n new AppError(\n 'VALIDATION',\n `Cannot rank below dependent \"${dep.id}\" (${dep.name}). Complete or remove the dependency first.`,\n ),\n );\n }\n }\n\n return this.repo.rerank(taskId, newRank);\n });\n }\n\n searchTasks(query: string, project: Project): Result<SearchResult[]> {\n return logger.startSpan('TaskService.searchTasks', () => {\n if (!query.trim()) {\n return err(new AppError('VALIDATION', 'Search query cannot be empty'));\n }\n\n return this.repo.search(query, project.id);\n });\n }\n\n /**\n * Rank for placing a task at the top of the active list. Clamps to\n * \"immediately after the highest-ranked blocker\" when blockers exist\n * rather than returning a value that would fail validation.\n *\n * Returns `null` to signal FP precision collapse (caller rebalances).\n */\n private computeTopRank(ranked: Task[], constrainingBlockers: Task[] = []): number | null {\n if (constrainingBlockers.length > 0) {\n const highestBlocker = constrainingBlockers.reduce((a, b) => (a.rank > b.rank ? a : b));\n const idx = ranked.findIndex((t) => t.id === highestBlocker.id);\n if (idx >= 0) {\n const next = ranked[idx + 1];\n return next ? midpoint(highestBlocker.rank, next.rank) : highestBlocker.rank + RANK_GAP;\n }\n }\n const first = ranked[0];\n return first ? first.rank - RANK_GAP : RANK_GAP;\n }\n\n /**\n * Rank for placing a task at the bottom of the active list.\n * - Stays above terminal tasks: terminal tasks live at `maxRank + RANK_GAP`\n * so a naive `last.rank + RANK_GAP` would collide with the most-recently\n * completed task.\n * - Clamps above any dependents rather than failing validation.\n *\n * `minTerminal` is passed in so this helper stays pure (no DB access).\n * Returns `null` to signal FP precision collapse.\n */\n private computeBottomRank(\n ranked: Task[],\n minTerminal: number | null,\n constrainingDependents: Task[] = [],\n ): number | null {\n if (constrainingDependents.length > 0) {\n const lowestDependent = constrainingDependents.reduce((a, b) => (a.rank < b.rank ? a : b));\n const idx = ranked.findIndex((t) => t.id === lowestDependent.id);\n if (idx >= 0) {\n const prev = ranked[idx - 1];\n return prev ? midpoint(prev.rank, lowestDependent.rank) : lowestDependent.rank - RANK_GAP;\n }\n }\n const last = ranked[ranked.length - 1];\n if (!last) return RANK_GAP;\n return minTerminal !== null && minTerminal > last.rank\n ? midpoint(last.rank, minTerminal)\n : last.rank + RANK_GAP;\n }\n\n /**\n * Auto-propagate status to the parent task after a child status change.\n * - If a child moves to in-progress and parent is backlog/todo → parent becomes in-progress.\n * - If all children are terminal (done/cancelled) → parent becomes done.\n */\n private propagateParentStatus(child: Task): void {\n if (!child.parentId) return;\n\n const parentResult = this.repo.findById(child.parentId);\n if (!parentResult.ok || !parentResult.value) return;\n const parent = parentResult.value;\n\n // Re-read the child to get its current (post-update) status\n const updatedChildResult = this.repo.findById(child.id);\n if (!updatedChildResult.ok || !updatedChildResult.value) return;\n const updatedChild = updatedChildResult.value;\n\n // Child moved to in-progress → promote parent from backlog/todo to in-progress\n if (\n updatedChild.status === TaskStatus.InProgress &&\n (parent.status === TaskStatus.Backlog || parent.status === TaskStatus.Todo)\n ) {\n this.repo.update(parent.id, { status: TaskStatus.InProgress });\n return;\n }\n\n // Child became terminal → check if ALL children are terminal → parent becomes done\n if (isTerminalStatus(updatedChild.status)) {\n const siblingsResult = this.repo.findMany({\n projectId: parent.projectId,\n parentId: parent.id,\n });\n if (!siblingsResult.ok) return;\n const allTerminal = siblingsResult.value.every((s) => isTerminalStatus(s.status));\n if (allTerminal && !isTerminalStatus(parent.status)) {\n const maxRankResult = this.repo.getMaxRankByLevel(\n parent.projectId,\n getTaskLevel(parent.type),\n );\n this.repo.update(parent.id, { status: TaskStatus.Done });\n if (maxRankResult.ok) {\n this.repo.rerank(parent.id, maxRankResult.value + RANK_GAP);\n }\n }\n }\n }\n}\n","import { z } from 'zod/v4';\nimport { DependencyType } from './enums.js';\n\n// Only DB-persisted types; blocked-by is resolved to blocks at the service layer.\nconst dbDepTypeValues = [\n DependencyType.Blocks,\n DependencyType.RelatesTo,\n DependencyType.Duplicates,\n] as const;\n\nexport const AddDependencySchema = z.object({\n taskId: z.string().min(1, 'Task id is required'),\n dependsOnId: z.string().min(1, 'Depends-on task id is required'),\n type: z.enum(dbDepTypeValues).default(DependencyType.Blocks),\n});\nexport type AddDependencyInput = z.infer<typeof AddDependencySchema>;\n\nexport const RemoveDependencySchema = z.object({\n taskId: z.string().min(1, 'Task id is required'),\n dependsOnId: z.string().min(1, 'Depends-on task id is required'),\n});\nexport type RemoveDependencyInput = z.infer<typeof RemoveDependencySchema>;\n\nexport interface TaskDependency {\n taskId: string;\n dependsOnId: string;\n type: DependencyType;\n createdAt: string;\n}\n","import type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type { Task } from '../types/task.js';\nimport type { TaskDependency } from '../types/dependency.js';\nimport { AddDependencySchema, RemoveDependencySchema } from '../types/dependency.js';\nimport type { DependencyRepository } from '../repository/dependency.repository.js';\nimport type { TaskRepository } from '../repository/task.repository.js';\nimport { AppError } from '../errors/app-error.js';\nimport { logger } from '../logging/logger.js';\nimport { UIDependencyType, DependencyType } from '../types/enums.js';\n\nexport interface DependencyEdge {\n from: string;\n to: string;\n type: string;\n}\n\nexport interface DependencyGraph {\n nodes: Task[];\n edges: DependencyEdge[];\n mermaid: string;\n}\n\nexport interface DependencyService {\n addDependency(input: unknown): Result<TaskDependency>;\n removeDependency(input: unknown): Result<void>;\n /** Remove a dependency between two tasks regardless of which direction it was stored. */\n removeDependencyBetween(taskId: string, otherId: string): Result<void>;\n listBlockers(taskId: string): Result<Task[]>;\n listDependents(taskId: string): Result<Task[]>;\n listRelated(taskId: string): Result<Task[]>;\n listDuplicates(taskId: string): Result<Task[]>;\n listAllDeps(taskId: string): Result<TaskDependency[]>;\n getTransitiveDeps(taskId: string): Result<Task[]>;\n buildGraph(taskId: string): Result<DependencyGraph>;\n}\n\nexport class DependencyServiceImpl implements DependencyService {\n constructor(\n private readonly depRepo: DependencyRepository,\n private readonly taskRepo: TaskRepository,\n ) {}\n\n private requireTask(taskId: string): Result<Task> {\n const result = this.taskRepo.findById(taskId);\n if (!result.ok) return result;\n if (!result.value) {\n return err(new AppError('NOT_FOUND', `Task not found: ${taskId}`));\n }\n return ok(result.value);\n }\n\n addDependency(input: unknown): Result<TaskDependency> {\n return logger.startSpan('DependencyService.addDependency', () => {\n // Normalize blocked-by: callers express \"A is blocked-by B\" as\n // {taskId: A, dependsOnId: B, type: blocked-by}; we store it as\n // {taskId: B, dependsOnId: A, type: blocks} (B blocks A).\n const normalized = normalizeBlockedBy(input);\n const parsed = AddDependencySchema.safeParse(normalized);\n if (!parsed.success) {\n return err(new AppError('VALIDATION', parsed.error.message));\n }\n\n const { taskId, dependsOnId, type } = parsed.data;\n\n const taskResult = this.requireTask(taskId);\n if (!taskResult.ok) return taskResult;\n\n const depResult = this.requireTask(dependsOnId);\n if (!depResult.ok) return depResult;\n\n const cycleResult = this.depRepo.wouldCreateCycle(taskId, dependsOnId);\n if (!cycleResult.ok) return cycleResult;\n if (cycleResult.value) {\n return err(\n new AppError(\n 'VALIDATION',\n `Adding this dependency would create a cycle: ${taskId} -> ${dependsOnId}`,\n ),\n );\n }\n\n return this.depRepo.insert(taskId, dependsOnId, type);\n });\n }\n\n removeDependency(input: unknown): Result<void> {\n return logger.startSpan('DependencyService.removeDependency', () => {\n const parsed = RemoveDependencySchema.safeParse(input);\n if (!parsed.success) {\n return err(new AppError('VALIDATION', parsed.error.message));\n }\n return this.depRepo.delete(parsed.data.taskId, parsed.data.dependsOnId);\n });\n }\n\n removeDependencyBetween(taskId: string, otherId: string): Result<void> {\n return logger.startSpan('DependencyService.removeDependencyBetween', () => {\n const forward = this.depRepo.delete(taskId, otherId);\n if (forward.ok) return forward;\n return this.depRepo.delete(otherId, taskId);\n });\n }\n\n listBlockers(taskId: string): Result<Task[]> {\n return this.depRepo.getBlockers(taskId);\n }\n\n listDependents(taskId: string): Result<Task[]> {\n return this.depRepo.getDependents(taskId);\n }\n\n listRelated(taskId: string): Result<Task[]> {\n return this.depRepo.getRelated(taskId);\n }\n\n listDuplicates(taskId: string): Result<Task[]> {\n return this.depRepo.getDuplicates(taskId);\n }\n\n listAllDeps(taskId: string): Result<TaskDependency[]> {\n return this.depRepo.findByTask(taskId);\n }\n\n getTransitiveDeps(taskId: string): Result<Task[]> {\n return this.depRepo.getTransitiveClosure(taskId);\n }\n\n buildGraph(taskId: string): Result<DependencyGraph> {\n return logger.startSpan('DependencyService.buildGraph', () => {\n const taskResult = this.taskRepo.findById(taskId);\n if (!taskResult.ok) return taskResult;\n if (!taskResult.value) {\n return err(new AppError('NOT_FOUND', `Task not found: ${taskId}`));\n }\n const rootTask = taskResult.value;\n\n // Collect all reachable nodes via BFS in both directions\n const visited = new Map<string, Task>();\n const allEdges: DependencyEdge[] = [];\n const queue: string[] = [taskId];\n visited.set(taskId, rootTask);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) break;\n\n // Outgoing: things this task depends on\n const blockersResult = this.depRepo.findByTask(current);\n if (!blockersResult.ok) return blockersResult;\n for (const dep of blockersResult.value) {\n allEdges.push({ from: dep.taskId, to: dep.dependsOnId, type: dep.type });\n if (!visited.has(dep.dependsOnId)) {\n const t = this.taskRepo.findById(dep.dependsOnId);\n if (!t.ok) return t;\n if (t.value) {\n visited.set(dep.dependsOnId, t.value);\n queue.push(dep.dependsOnId);\n }\n }\n }\n\n // Incoming: things that depend on this task\n const dependentsResult = this.depRepo.findDependents(current);\n if (!dependentsResult.ok) return dependentsResult;\n for (const dep of dependentsResult.value) {\n allEdges.push({ from: dep.taskId, to: dep.dependsOnId, type: dep.type });\n if (!visited.has(dep.taskId)) {\n const t = this.taskRepo.findById(dep.taskId);\n if (!t.ok) return t;\n if (t.value) {\n visited.set(dep.taskId, t.value);\n queue.push(dep.taskId);\n }\n }\n }\n }\n\n // Deduplicate edges\n const edgeSet = new Set<string>();\n const uniqueEdges: DependencyEdge[] = [];\n for (const edge of allEdges) {\n const key = `${edge.from}->${edge.to}`;\n if (!edgeSet.has(key)) {\n edgeSet.add(key);\n uniqueEdges.push(edge);\n }\n }\n\n const nodes = Array.from(visited.values());\n const mermaid = this.toMermaid(nodes, uniqueEdges, taskId);\n\n return ok({ nodes, edges: uniqueEdges, mermaid });\n });\n }\n\n private toMermaid(nodes: Task[], edges: DependencyEdge[], highlightId: string): string {\n const lines: string[] = ['graph LR'];\n\n for (const node of nodes) {\n const label = `${node.id}: ${node.name} [${node.status}]`;\n const escaped = label.replace(/\"/g, '#quot;');\n if (node.id === highlightId) {\n lines.push(` ${node.id}(\"${escaped}\"):::highlight`);\n } else {\n lines.push(` ${node.id}[\"${escaped}\"]`);\n }\n }\n\n for (const edge of edges) {\n const label = edge.type === 'blocks' ? 'blocks' : edge.type;\n lines.push(` ${edge.from} -->|${label}| ${edge.to}`);\n }\n\n lines.push(' classDef highlight fill:#f9f,stroke:#333,stroke-width:2px');\n\n return lines.join('\\n');\n }\n}\n\n/**\n * Normalizes a blocked-by relationship before schema validation.\n * \"A blocked-by B\" is stored as \"B blocks A\": swap taskId/dependsOnId\n * and change type from blocked-by to blocks.\n */\nfunction normalizeBlockedBy(input: unknown): unknown {\n if (\n typeof input === 'object' &&\n input !== null &&\n 'type' in input &&\n (input as Record<string, unknown>).type === UIDependencyType.BlockedBy\n ) {\n const { taskId, dependsOnId, ...rest } = input as Record<string, unknown>;\n return { ...rest, taskId: dependsOnId, dependsOnId: taskId, type: DependencyType.Blocks };\n }\n return input;\n}\n","import { z } from 'zod/v4';\n\n// ── Export types ──────────────────────────────────────────────────────\n\nexport interface ExportTask {\n id: string;\n name: string;\n description: string;\n type: string;\n status: string;\n parentId: string | null;\n technicalNotes: string;\n additionalRequirements: string;\n rank: number;\n}\n\nexport interface ExportDependency {\n taskId: string;\n dependsOnId: string;\n type: string;\n}\n\nexport interface ExportData {\n version: 1;\n exportedAt: string;\n tasks: ExportTask[];\n dependencies: ExportDependency[];\n}\n\n// ── Import types ──────────────────────────────────────────────────────\n\n/** Loose schema: tasks/dependencies are arbitrary objects to allow field mapping. */\nexport const ImportFileSchema = z.object({\n version: z.number().optional(),\n tasks: z.array(z.record(z.string(), z.unknown())).min(1, 'At least one task is required'),\n dependencies: z.array(z.record(z.string(), z.unknown())).optional().default([]),\n});\nexport type ImportFile = z.infer<typeof ImportFileSchema>;\n\n/** Map from source field name → our field name. */\nexport type FieldMapping = Map<string, string>;\n\nexport interface ImportResult {\n imported: number;\n dependencies: number;\n idMap: Record<string, string>;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\n/**\n * Parse a comma-separated \"source:target\" mapping string.\n * Example: \"title:name,summary:description,key:id\"\n */\nexport function parseFieldMapping(raw: string): FieldMapping {\n const mapping = new Map<string, string>();\n for (const pair of raw.split(',')) {\n const parts = pair.split(':').map((s) => s.trim());\n if (parts.length === 2 && parts[0] && parts[1]) {\n mapping.set(parts[0], parts[1]);\n }\n }\n return mapping;\n}\n","import type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type {\n ExportData,\n ExportTask,\n ExportDependency,\n FieldMapping,\n ImportResult,\n} from '../types/portability.js';\nimport { ImportFileSchema } from '../types/portability.js';\nimport type { TaskService } from './task.service.js';\nimport type { DependencyService } from './dependency.service.js';\nimport type { Project } from '../types/project.js';\nimport { AppError } from '../errors/app-error.js';\nimport { logger } from '../logging/logger.js';\n\n// ── Internal mapped types ─────────────────────────────────────────────\n\ninterface MappedTask {\n sourceId: string;\n name: string;\n description: string;\n type: string;\n status: string;\n parentId: string | null;\n technicalNotes: string;\n additionalRequirements: string;\n}\n\ninterface MappedDependency {\n sourceTaskId: string;\n sourceDependsOnId: string;\n type: string;\n}\n\n// ── Service interface ─────────────────────────────────────────────────\n\nexport interface PortabilityService {\n exportTasks(project: Project): Result<ExportData>;\n importTasks(\n fileData: unknown,\n project: Project,\n fieldMapping?: FieldMapping,\n ): Result<ImportResult>;\n}\n\n// ── Implementation ────────────────────────────────────────────────────\n\nexport class PortabilityServiceImpl implements PortabilityService {\n constructor(\n private readonly taskService: TaskService,\n private readonly depService: DependencyService,\n ) {}\n\n exportTasks(project: Project): Result<ExportData> {\n return logger.startSpan('PortabilityService.exportTasks', () => {\n const tasksResult = this.taskService.listTasks(project, {});\n if (!tasksResult.ok) return tasksResult;\n const tasks = tasksResult.value;\n\n const taskIds = new Set(tasks.map((t) => t.id));\n\n const exportTasks: ExportTask[] = tasks.map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description,\n type: t.type,\n status: t.status,\n parentId: t.parentId,\n technicalNotes: t.technicalNotes,\n additionalRequirements: t.additionalRequirements,\n rank: t.rank,\n }));\n\n // Collect dependencies where both ends belong to this project\n const allDeps: ExportDependency[] = [];\n for (const task of tasks) {\n const depsResult = this.depService.listAllDeps(task.id);\n if (!depsResult.ok) return depsResult;\n for (const dep of depsResult.value) {\n if (taskIds.has(dep.dependsOnId)) {\n allDeps.push({\n taskId: dep.taskId,\n dependsOnId: dep.dependsOnId,\n type: dep.type,\n });\n }\n }\n }\n\n logger.info('Exported tasks', {\n project: project.key,\n tasks: tasks.length,\n dependencies: allDeps.length,\n });\n\n return ok({\n version: 1 as const,\n exportedAt: new Date().toISOString(),\n tasks: exportTasks,\n dependencies: allDeps,\n });\n });\n }\n\n importTasks(\n fileData: unknown,\n project: Project,\n fieldMapping?: FieldMapping,\n ): Result<ImportResult> {\n return logger.startSpan('PortabilityService.importTasks', () => {\n // 1. Validate input structure\n const parsed = ImportFileSchema.safeParse(fileData);\n if (!parsed.success) {\n return err(new AppError('VALIDATION', parsed.error.message));\n }\n\n // 2. Build reverse map (ourField → sourceField)\n const reverseMap = this.buildReverseMap(fieldMapping);\n\n // 3. Map source tasks to our schema\n const mappedTasks: MappedTask[] = [];\n for (const sourceTask of parsed.data.tasks) {\n const mapped = this.mapTaskFields(sourceTask, reverseMap);\n if (!mapped.ok) return mapped;\n mappedTasks.push(mapped.value);\n }\n\n // 4. Map source dependencies\n const mappedDeps: MappedDependency[] = [];\n for (const sourceDep of parsed.data.dependencies) {\n const mapped = this.mapDependencyFields(sourceDep, reverseMap);\n if (!mapped.ok) return mapped;\n mappedDeps.push(mapped.value);\n }\n\n // 5. Topological sort so parents are created before children\n const sorted = this.topoSortByParent(mappedTasks);\n\n // 6. Create tasks, building sourceId → newId map\n const idMap = new Map<string, string>();\n for (const task of sorted) {\n let parentId: string | undefined;\n if (task.parentId) {\n parentId = idMap.get(task.parentId) ?? task.parentId;\n }\n\n const createResult = this.taskService.createTask(\n {\n name: task.name,\n description: task.description || undefined,\n type: task.type || undefined,\n status: task.status || undefined,\n parentId,\n technicalNotes: task.technicalNotes || undefined,\n additionalRequirements: task.additionalRequirements || undefined,\n },\n project,\n );\n if (!createResult.ok) return createResult;\n\n idMap.set(task.sourceId, createResult.value.id);\n logger.info('Imported task', {\n sourceId: task.sourceId,\n newId: createResult.value.id,\n });\n }\n\n // 7. Add dependencies with remapped IDs\n let depCount = 0;\n for (const dep of mappedDeps) {\n const taskId = idMap.get(dep.sourceTaskId) ?? dep.sourceTaskId;\n const dependsOnId = idMap.get(dep.sourceDependsOnId) ?? dep.sourceDependsOnId;\n\n const depResult = this.depService.addDependency({\n taskId,\n dependsOnId,\n type: dep.type || undefined,\n });\n if (!depResult.ok) return depResult;\n\n depCount++;\n logger.info('Imported dependency', { from: taskId, to: dependsOnId });\n }\n\n const idMapObj: Record<string, string> = {};\n for (const [k, v] of idMap) {\n idMapObj[k] = v;\n }\n\n logger.info('Import completed', {\n tasks: mappedTasks.length,\n dependencies: depCount,\n });\n\n return ok({\n imported: mappedTasks.length,\n dependencies: depCount,\n idMap: idMapObj,\n });\n });\n }\n\n // ── Private helpers ───────────────────────────────────────────────\n\n /** Invert the user-provided mapping (source→target) into (target→source). */\n private buildReverseMap(fieldMapping?: FieldMapping): Map<string, string> {\n const reverse = new Map<string, string>();\n if (!fieldMapping) return reverse;\n for (const [source, target] of fieldMapping) {\n reverse.set(target, source);\n }\n return reverse;\n }\n\n /** Read a field from a source object, checking reverse-mapped name first, then literal name. */\n private getField(\n source: Record<string, unknown>,\n field: string,\n reverseMap: Map<string, string>,\n ): string {\n const sourceField = reverseMap.get(field) ?? field;\n const value = source[sourceField];\n if (value == null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return `${value}`;\n return JSON.stringify(value);\n }\n\n private mapTaskFields(\n source: Record<string, unknown>,\n reverseMap: Map<string, string>,\n ): Result<MappedTask> {\n const sourceId = this.getField(source, 'id', reverseMap);\n const name = this.getField(source, 'name', reverseMap);\n\n if (!sourceId) {\n return err(new AppError('VALIDATION', 'Each imported task must have an id'));\n }\n if (!name) {\n return err(\n new AppError('VALIDATION', `Imported task '${sourceId}' is missing required field 'name'`),\n );\n }\n\n return ok({\n sourceId,\n name,\n description: this.getField(source, 'description', reverseMap),\n type: this.getField(source, 'type', reverseMap),\n status: this.getField(source, 'status', reverseMap),\n parentId: this.getField(source, 'parentId', reverseMap) || null,\n technicalNotes: this.getField(source, 'technicalNotes', reverseMap),\n additionalRequirements: this.getField(source, 'additionalRequirements', reverseMap),\n });\n }\n\n private mapDependencyFields(\n source: Record<string, unknown>,\n reverseMap: Map<string, string>,\n ): Result<MappedDependency> {\n const taskId = this.getField(source, 'taskId', reverseMap);\n const dependsOnId = this.getField(source, 'dependsOnId', reverseMap);\n\n if (!taskId || !dependsOnId) {\n return err(new AppError('VALIDATION', 'Each dependency must have taskId and dependsOnId'));\n }\n\n return ok({\n sourceTaskId: taskId,\n sourceDependsOnId: dependsOnId,\n type: this.getField(source, 'type', reverseMap),\n });\n }\n\n /**\n * Sort tasks so that parents come before children within the import set.\n * Tasks whose parentId is outside the import set are treated as roots.\n */\n private topoSortByParent(tasks: MappedTask[]): MappedTask[] {\n const sourceIds = new Set(tasks.map((t) => t.sourceId));\n const sorted: MappedTask[] = [];\n const remaining = new Set(tasks);\n const created = new Set<string>();\n\n while (remaining.size > 0) {\n const batch: MappedTask[] = [];\n for (const task of remaining) {\n const parentInImport = task.parentId !== null && sourceIds.has(task.parentId);\n if (!parentInImport || (task.parentId !== null && created.has(task.parentId))) {\n batch.push(task);\n }\n }\n\n if (batch.length === 0) {\n logger.warn('Circular parent references detected during import, forcing remaining tasks');\n for (const t of remaining) {\n sorted.push(t);\n }\n break;\n }\n\n for (const t of batch) {\n remaining.delete(t);\n created.add(t.sourceId);\n sorted.push(t);\n }\n }\n\n return sorted;\n }\n}\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport { trace } from '@opentelemetry/api';\nimport type { Result, FetchFn } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport { AppError, toMessage } from '../errors/app-error.js';\nimport { logger } from '../logging/logger.js';\nimport { isNewerVersion } from '../utils/version.js';\n\nexport { isNewerVersion };\n\nconst NPM_REGISTRY_URL = 'https://registry.npmjs.org/@tomkapa/tayto/latest';\nconst PACKAGE_NAME = '@tomkapa/tayto';\nconst CHECK_TTL_MS = 24 * 60 * 60 * 1000; // 1 day\n\nexport interface UpdateCheckResult {\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n}\n\ninterface UpdateCache {\n checkedAt: number;\n latestVersion: string;\n}\n\nexport interface UpdateService {\n checkForUpdate(currentVersion: string): Promise<Result<UpdateCheckResult>>;\n performUpgrade(currentVersion: string): Result<{ installedVersion: string }>;\n}\n\n/** Type guard for parsed cache JSON. */\nfunction isValidCache(value: unknown): value is UpdateCache {\n if (typeof value !== 'object' || value === null) return false;\n const obj = value as Record<string, unknown>;\n return typeof obj['checkedAt'] === 'number' && typeof obj['latestVersion'] === 'string';\n}\n\nexport type { FetchFn } from '../types/common.js';\nexport type ExecFn = (cmd: string, args: string[]) => void;\n\nfunction defaultExec(cmd: string, args: string[]): void {\n execFileSync(cmd, args, { stdio: 'inherit', timeout: 60000 });\n}\n\nconst tracer = trace.getTracer('task');\n\nexport class UpdateServiceImpl implements UpdateService {\n constructor(\n private readonly cachePath: string,\n private readonly fetchImpl: FetchFn = globalThis.fetch,\n private readonly execImpl: ExecFn = defaultExec,\n ) {}\n\n async checkForUpdate(currentVersion: string): Promise<Result<UpdateCheckResult>> {\n return tracer.startActiveSpan('UpdateService.checkForUpdate', async (span) => {\n try {\n span.setAttribute('update.current_version', currentVersion);\n\n // Read cache\n const cached = this.readCache();\n if (cached && Date.now() - cached.checkedAt < CHECK_TTL_MS) {\n span.setAttribute('update.cache_hit', true);\n const updateAvailable = isNewerVersion(cached.latestVersion, currentVersion);\n span.setAttribute('update.latest_version', cached.latestVersion);\n span.setAttribute('update.available', updateAvailable);\n return ok({ currentVersion, latestVersion: cached.latestVersion, updateAvailable });\n }\n\n span.setAttribute('update.cache_hit', false);\n\n // Fetch from registry\n let latestVersion: string;\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, 5000);\n try {\n const response = await this.fetchImpl(NPM_REGISTRY_URL, { signal: controller.signal });\n\n if (!response.ok) {\n logger.warn('Update check: registry returned non-OK status', {\n status: response.status,\n });\n return err(\n new AppError(\n 'UPGRADE_CHECK',\n `npm registry returned status ${String(response.status)}`,\n ),\n );\n }\n\n const body = (await response.json()) as Record<string, unknown>;\n if (typeof body['version'] !== 'string') {\n return err(\n new AppError('UPGRADE_CHECK', 'Unexpected response format from npm registry'),\n );\n }\n latestVersion = body['version'];\n } catch (e: unknown) {\n logger.warn('Update check: fetch failed', { error: toMessage(e) });\n return err(\n new AppError('UPGRADE_CHECK', `Failed to check for updates: ${toMessage(e)}`, e),\n );\n } finally {\n clearTimeout(timeout);\n }\n\n // Write cache\n this.writeCache({ checkedAt: Date.now(), latestVersion });\n\n const updateAvailable = isNewerVersion(latestVersion, currentVersion);\n span.setAttribute('update.latest_version', latestVersion);\n span.setAttribute('update.available', updateAvailable);\n return ok({ currentVersion, latestVersion, updateAvailable });\n } finally {\n span.end();\n }\n });\n }\n\n performUpgrade(currentVersion: string): Result<{ installedVersion: string }> {\n return logger.startSpan('UpdateService.performUpgrade', (span) => {\n span.setAttribute('update.previous_version', currentVersion);\n try {\n this.execImpl('npm', ['install', '-g', `${PACKAGE_NAME}@latest`]);\n } catch (e: unknown) {\n logger.error('Upgrade failed', e, { command: `npm install -g ${PACKAGE_NAME}@latest` });\n span.setAttribute('update.success', false);\n return err(new AppError('UPGRADE_CHECK', `Upgrade failed: ${toMessage(e)}`, e));\n }\n\n // Read the newly installed version from the registry cache\n const cached = this.readCache();\n const installedVersion = cached?.latestVersion ?? 'unknown';\n span.setAttribute('update.success', true);\n span.setAttribute('update.installed_version', installedVersion);\n\n // Invalidate cache so next check fetches fresh\n this.writeCache({ checkedAt: 0, latestVersion: installedVersion });\n\n return ok({ installedVersion });\n });\n }\n\n private readCache(): UpdateCache | null {\n try {\n const raw = readFileSync(this.cachePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n return isValidCache(parsed) ? parsed : null;\n } catch (e: unknown) {\n logger.info('Update cache not available', {\n error: toMessage(e),\n });\n return null;\n }\n }\n\n private writeCache(entry: UpdateCache): void {\n try {\n // Merge with existing content to preserve fields written by other utilities\n // (e.g. changelogSeenVersion written by changelog-seen.ts).\n let existing: Record<string, unknown> = {};\n try {\n const raw = readFileSync(this.cachePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed === 'object' && parsed !== null) {\n existing = parsed as Record<string, unknown>;\n }\n } catch {\n // File absent or malformed — start fresh\n }\n writeFileSync(this.cachePath, JSON.stringify({ ...existing, ...entry }), 'utf-8');\n } catch (e: unknown) {\n logger.warn('Failed to write update cache', {\n error: toMessage(e),\n });\n }\n }\n}\n","import { Command } from 'commander';\nimport type { Container } from './container.js';\nimport { APP_VERSION } from '../version.js';\nimport { registerProjectCreate } from './commands/project/create.js';\nimport { registerProjectList } from './commands/project/list.js';\nimport { registerProjectUpdate } from './commands/project/update.js';\nimport { registerProjectDelete } from './commands/project/delete.js';\nimport { registerProjectSetDefault } from './commands/project/set-default.js';\nimport { registerProjectLink } from './commands/project/link.js';\nimport { registerProjectUnlink } from './commands/project/unlink.js';\nimport { registerTaskCreate } from './commands/task/create.js';\nimport { registerTaskList } from './commands/task/list.js';\nimport { registerTaskShow } from './commands/task/show.js';\nimport { registerTaskUpdate } from './commands/task/update.js';\nimport { registerTaskDelete } from './commands/task/delete.js';\nimport { registerTaskBreakdown } from './commands/task/breakdown.js';\nimport { registerTaskRank } from './commands/task/rank.js';\nimport { registerTaskSearch } from './commands/task/search.js';\nimport { registerTaskExport } from './commands/task/export.js';\nimport { registerTaskImport } from './commands/task/import.js';\nimport { registerDepAdd } from './commands/dep/add.js';\nimport { registerDepRemove } from './commands/dep/remove.js';\nimport { registerDepList } from './commands/dep/list.js';\nimport { registerDepGraph } from './commands/dep/graph.js';\nimport { registerUpgrade } from './commands/upgrade.js';\n\nexport function buildCLI(container: Container): Command {\n const program = new Command();\n program\n .name('tayto')\n .description('CLI task management for solo devs and AI agents')\n .version(APP_VERSION);\n\n const project = program.command('project').description('Manage projects');\n registerProjectCreate(project, container);\n registerProjectList(project, container);\n registerProjectUpdate(project, container);\n registerProjectDelete(project, container);\n registerProjectSetDefault(project, container);\n registerProjectLink(project, container);\n registerProjectUnlink(project, container);\n\n const task = program.command('task').description('Manage tasks');\n registerTaskCreate(task, container);\n registerTaskList(task, container);\n registerTaskShow(task, container);\n registerTaskUpdate(task, container);\n registerTaskDelete(task, container);\n registerTaskBreakdown(task, container);\n registerTaskRank(task, container);\n registerTaskSearch(task, container);\n registerTaskExport(task, container);\n registerTaskImport(task, container);\n\n const dep = program.command('dep').description('Manage task dependencies');\n registerDepAdd(dep, container);\n registerDepRemove(dep, container);\n registerDepList(dep, container);\n registerDepGraph(dep, container);\n\n registerUpgrade(program, container);\n\n program\n .command('tui')\n .description('Launch interactive terminal UI')\n .option('-p, --project <project>', 'Start with specific project')\n .action(async (opts: { project?: string }) => {\n const { launchTUI } = await import('../tui/index.js');\n await launchTUI(container, opts.project);\n });\n\n return program;\n}\n","import type { AppError } from '../errors/app-error.js';\n\nexport function printSuccess(data: unknown): void {\n process.stdout.write(JSON.stringify({ ok: true, data }, null, 2) + '\\n');\n}\n\nexport function printError(error: AppError): never {\n process.stderr.write(\n JSON.stringify({ ok: false, error: { code: error.code, message: error.message } }, null, 2) +\n '\\n',\n );\n process.exit(1);\n}\n\nexport function handleResult(\n result: { ok: true; value: unknown } | { ok: false; error: AppError },\n): void {\n if (result.ok) {\n printSuccess(result.value);\n } else {\n printError(result.error);\n }\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerProjectCreate(parent: Command, container: Container): void {\n parent\n .command('create')\n .description('Create a new project')\n .requiredOption('-n, --name <name>', 'Project name')\n .option(\n '-k, --key <key>',\n 'Project key (2-7 uppercase alphanumeric chars, defaults to first 3 chars of name)',\n )\n .option('-d, --description <description>', 'Project description')\n .option('--default', 'Set as default project')\n .option('--git-remote <url>', 'Git remote URL to associate with the project')\n .action(\n (opts: {\n name: string;\n key?: string;\n description?: string;\n default?: boolean;\n gitRemote?: string;\n }) => {\n const result = container.projectService.createProject({\n name: opts.name,\n key: opts.key,\n description: opts.description,\n isDefault: opts.default,\n gitRemote: opts.gitRemote,\n });\n handleResult(result);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerProjectList(parent: Command, container: Container): void {\n parent\n .command('list')\n .description('List all projects')\n .action(() => {\n const result = container.projectService.listProjects();\n handleResult(result);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport type { UpdateProjectInput } from '../../types/project.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerProjectUpdate(parent: Command, container: Container): void {\n parent\n .command('update <idOrKeyOrName>')\n .description('Update a project (lookup by id, key, or name)')\n .option('-n, --name <name>', 'Project name')\n .option('-d, --description <description>', 'Project description')\n .option('--default', 'Set as default project')\n .option('--git-remote <url>', 'Git remote URL (use --no-git-remote to unlink)')\n .option('--no-git-remote', 'Unlink git remote')\n .action(\n (\n idOrKeyOrName: string,\n opts: {\n name?: string;\n description?: string;\n default?: boolean;\n gitRemote?: string | false;\n },\n ) => {\n const resolved = container.projectService.resolveProject(idOrKeyOrName);\n if (!resolved.ok) {\n handleResult(resolved);\n return;\n }\n const updateInput: UpdateProjectInput = {\n name: opts.name,\n description: opts.description,\n isDefault: opts.default,\n ...(opts.gitRemote === false\n ? { gitRemote: null }\n : typeof opts.gitRemote === 'string'\n ? { gitRemote: opts.gitRemote }\n : {}),\n };\n const result = container.projectService.updateProject(resolved.value.id, updateInput);\n handleResult(result);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerProjectDelete(parent: Command, container: Container): void {\n parent\n .command('delete <idOrKeyOrName>')\n .description('Delete a project (lookup by id, key, or name)')\n .action((idOrKeyOrName: string) => {\n const resolved = container.projectService.resolveProject(idOrKeyOrName);\n if (!resolved.ok) {\n handleResult(resolved);\n return;\n }\n const result = container.projectService.deleteProject(resolved.value.id);\n handleResult(result);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerProjectSetDefault(parent: Command, container: Container): void {\n parent\n .command('set-default <idOrKeyOrName>')\n .description('Set a project as the default (lookup by id, key, or name)')\n .action((idOrKeyOrName: string) => {\n const resolved = container.projectService.resolveProject(idOrKeyOrName);\n if (!resolved.ok) {\n handleResult(resolved);\n return;\n }\n const result = container.projectService.updateProject(resolved.value.id, {\n isDefault: true,\n });\n handleResult(result);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerProjectLink(parent: Command, container: Container): void {\n parent\n .command('link <idOrKeyOrName>')\n .description('Link a project to a git remote (auto-detects from cwd if --remote omitted)')\n .option('-r, --remote <url>', 'Git remote URL')\n .action((idOrKeyOrName: string, opts: { remote?: string }) => {\n const result = container.projectService.linkGitRemote(idOrKeyOrName, opts.remote);\n handleResult(result);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerProjectUnlink(parent: Command, container: Container): void {\n parent\n .command('unlink <idOrKeyOrName>')\n .description('Remove git remote link from a project')\n .action((idOrKeyOrName: string) => {\n const result = container.projectService.unlinkGitRemote(idOrKeyOrName);\n handleResult(result);\n });\n}\n","import type { Result } from '../../types/common.js';\nimport type { Project } from '../../types/project.js';\nimport type { Container } from '../container.js';\n\nexport function withProject(container: Container, projectIdOrName?: string): Result<Project> {\n return container.projectService.resolveProject(projectIdOrName);\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\n\nexport function registerTaskCreate(parent: Command, container: Container): void {\n parent\n .command('create')\n .description('Create a new task (appended to bottom of backlog)')\n .requiredOption('-n, --name <name>', 'Task name')\n .option('-p, --project <project>', 'Project id or name')\n .option('-d, --description <description>', 'Task description')\n .option('-t, --type <type>', 'Task type: epic, story, tech-debt, bug', 'story')\n .option('-s, --status <status>', 'Task status', 'backlog')\n .option('--parent <parentId>', 'Parent task id for subtask')\n .option('--technical-notes <notes>', 'Technical notes (markdown)')\n .option('--additional-requirements <requirements>', 'Additional requirements (markdown)')\n .option('--depends-on <ids...>', 'Task ids this task depends on (blocks relationship)')\n .action(\n (opts: {\n name: string;\n project?: string;\n description?: string;\n type?: string;\n status?: string;\n parent?: string;\n technicalNotes?: string;\n additionalRequirements?: string;\n dependsOn?: string[];\n }) => {\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) return printError(projectResult.error);\n const result = container.taskService.createTask(\n {\n name: opts.name,\n description: opts.description,\n type: opts.type,\n status: opts.status,\n parentId: opts.parent,\n technicalNotes: opts.technicalNotes,\n additionalRequirements: opts.additionalRequirements,\n dependsOn: opts.dependsOn?.map((id) => ({ id })),\n },\n projectResult.value,\n );\n handleResult(result);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\n\nexport function registerTaskList(parent: Command, container: Container): void {\n parent\n .command('list')\n .description('List tasks in rank order (defaults to level 2 backlog tasks)')\n .option('-p, --project <project>', 'Filter by project id or name')\n .option('-s, --status <status>', 'Filter by status (default: backlog)')\n .option('-t, --type <type>', 'Filter by type (epic, story, tech-debt, bug)')\n .option('-l, --level <level>', 'Filter by level (1=epic, 2=work). Default: 2')\n .option('--parent <parentId>', 'Filter by parent task id')\n .option('--search <text>', 'Search in name, description, and notes')\n .action(\n (opts: {\n project?: string;\n status?: string;\n type?: string;\n level?: string;\n parent?: string;\n search?: string;\n }) => {\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) return printError(projectResult.error);\n const result = container.taskService.listTasks(projectResult.value, {\n status: opts.status ?? 'backlog',\n type: opts.type,\n level: opts.level ? parseInt(opts.level, 10) : undefined,\n parentId: opts.parent,\n search: opts.search,\n });\n handleResult(result);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerTaskShow(parent: Command, container: Container): void {\n parent\n .command('show <id>')\n .description('Show task details')\n .action((id: string) => {\n const result = container.taskService.getTask(id);\n handleResult(result);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerTaskUpdate(parent: Command, container: Container): void {\n parent\n .command('update <id>')\n .description('Update a task')\n .option('-n, --name <name>', 'Task name')\n .option('-d, --description <description>', 'Task description')\n .option('-t, --type <type>', 'Task type: epic, story, tech-debt, bug')\n .option('-s, --status <status>', 'Task status')\n .option('--parent <parentId>', 'Parent task id')\n .option('--technical-notes <notes>', 'Replace technical notes')\n .option('--additional-requirements <requirements>', 'Replace additional requirements')\n .option('--append-notes <notes>', 'Append to technical notes')\n .option('--append-requirements <requirements>', 'Append to additional requirements')\n .action(\n (\n id: string,\n opts: {\n name?: string;\n description?: string;\n type?: string;\n status?: string;\n parent?: string;\n technicalNotes?: string;\n additionalRequirements?: string;\n appendNotes?: string;\n appendRequirements?: string;\n },\n ) => {\n const result = container.taskService.updateTask(id, {\n name: opts.name,\n description: opts.description,\n type: opts.type,\n status: opts.status,\n parentId: opts.parent,\n technicalNotes: opts.technicalNotes,\n additionalRequirements: opts.additionalRequirements,\n appendNotes: opts.appendNotes,\n appendRequirements: opts.appendRequirements,\n });\n handleResult(result);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerTaskDelete(parent: Command, container: Container): void {\n parent\n .command('delete <id>')\n .description('Delete a task')\n .action((id: string) => {\n const result = container.taskService.deleteTask(id);\n handleResult(result);\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { AppError } from '../../../errors/app-error.js';\n\nexport function registerTaskBreakdown(parent: Command, container: Container): void {\n parent\n .command('breakdown <parentId>')\n .description('Create subtasks from a JSON file')\n .requiredOption('-f, --file <path>', 'JSON file with array of subtask definitions')\n .action((parentId: string, opts: { file: string }) => {\n let content: string;\n try {\n content = readFileSync(opts.file, 'utf-8');\n } catch (e) {\n return printError(\n new AppError('VALIDATION', `Failed to read subtasks file: ${opts.file}`, e),\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch (e) {\n return printError(\n new AppError('VALIDATION', `Invalid JSON in subtasks file: ${opts.file}`, e),\n );\n }\n\n if (!Array.isArray(parsed)) {\n return printError(new AppError('VALIDATION', 'File must contain a JSON array of subtasks'));\n }\n\n handleResult(container.taskService.breakdownTask(parentId, parsed));\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\n\nexport function registerTaskRank(parent: Command, container: Container): void {\n parent\n .command('rank <id>')\n .description('Re-rank a task in the backlog (Jira-style positioning)')\n .option('--after <taskId>', 'Place immediately after this task')\n .option('--before <taskId>', 'Place immediately before this task')\n .option('--position <n>', 'Place at 1-based position in backlog')\n .option('--top', 'Move to the top of active tasks')\n .option('--bottom', 'Move to the bottom of active tasks (above done tasks)')\n .option('-p, --project <project>', 'Project id or name')\n .action(\n (\n id: string,\n opts: {\n after?: string;\n before?: string;\n position?: string;\n top?: boolean;\n bottom?: boolean;\n project?: string;\n },\n ) => {\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) return printError(projectResult.error);\n const result = container.taskService.rerankTask(\n {\n taskId: id,\n afterId: opts.after,\n beforeId: opts.before,\n position: opts.position ? parseInt(opts.position, 10) : undefined,\n top: opts.top,\n bottom: opts.bottom,\n },\n projectResult.value,\n );\n handleResult(result);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\n\nexport function registerTaskSearch(parent: Command, container: Container): void {\n parent\n .command('search <query>')\n .description('Full-text search tasks with relevance ranking (FTS5)')\n .option('-p, --project <project>', 'Limit search to a project')\n .action((query: string, opts: { project?: string }) => {\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) return printError(projectResult.error);\n const result = container.taskService.searchTasks(query, projectResult.value);\n handleResult(result);\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { printSuccess, printError } from '../../output.js';\nimport { AppError } from '../../../errors/app-error.js';\nimport { withProject } from '../../helpers/project.js';\n\nexport function registerTaskExport(parent: Command, container: Container): void {\n parent\n .command('export')\n .description('Export tasks to JSON file')\n .option('-p, --project <project>', 'Project id or name')\n .option('-o, --output <file>', 'Output file path (defaults to stdout)')\n .action((opts: { project?: string; output?: string }) => {\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) return printError(projectResult.error);\n const result = container.portabilityService.exportTasks(projectResult.value);\n if (!result.ok) {\n return printError(result.error);\n }\n\n if (opts.output) {\n try {\n writeFileSync(opts.output, JSON.stringify(result.value, null, 2) + '\\n', 'utf-8');\n } catch (e) {\n return printError(new AppError('UNKNOWN', `Failed to write file: ${opts.output}`, e));\n }\n printSuccess({\n file: opts.output,\n tasks: result.value.tasks.length,\n dependencies: result.value.dependencies.length,\n });\n } else {\n printSuccess(result.value);\n }\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { parseFieldMapping } from '../../../types/portability.js';\nimport { AppError } from '../../../errors/app-error.js';\nimport { withProject } from '../../helpers/project.js';\n\nexport function registerTaskImport(parent: Command, container: Container): void {\n parent\n .command('import')\n .description('Import tasks from JSON file')\n .requiredOption('-f, --file <file>', 'Input JSON file path')\n .option('-p, --project <project>', 'Target project id or name')\n .option(\n '--map <mapping>',\n 'Field mapping as comma-separated source:target pairs (e.g. \"title:name,summary:description\")',\n )\n .action((opts: { file: string; project?: string; map?: string }) => {\n let fileData: unknown;\n try {\n const raw = readFileSync(opts.file, 'utf-8');\n fileData = JSON.parse(raw);\n } catch (e) {\n return printError(\n new AppError(\n 'VALIDATION',\n `Failed to read or parse file: ${opts.file}${e instanceof Error ? ` - ${e.message}` : ''}`,\n ),\n );\n }\n\n const fieldMapping = opts.map ? parseFieldMapping(opts.map) : undefined;\n\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) return printError(projectResult.error);\n const result = container.portabilityService.importTasks(\n fileData,\n projectResult.value,\n fieldMapping,\n );\n handleResult(result);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerDepAdd(parent: Command, container: Container): void {\n parent\n .command('add <taskId> <dependsOnId>')\n .description('Add a dependency (taskId depends on dependsOnId)')\n .option(\n '-t, --type <type>',\n 'Dependency type: blocks, relates-to, duplicates, blocked-by',\n 'blocks',\n )\n .action((taskId: string, dependsOnId: string, opts: { type?: string }) => {\n const result = container.dependencyService.addDependency({\n taskId,\n dependsOnId,\n type: opts.type,\n });\n handleResult(result);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerDepRemove(parent: Command, container: Container): void {\n parent\n .command('remove <taskId> <dependsOnId>')\n .description('Remove a dependency')\n .action((taskId: string, dependsOnId: string) => {\n const result = container.dependencyService.removeDependency({\n taskId,\n dependsOnId,\n });\n handleResult(result);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerDepList(parent: Command, container: Container): void {\n parent\n .command('list <taskId>')\n .description('List direct dependencies of a task')\n .option('--blockers', 'Show tasks that block this task')\n .option('--dependents', 'Show tasks that depend on this task')\n .option('--transitive', 'Show all transitive blockers (deep)')\n .action(\n (\n taskId: string,\n opts: { blockers?: boolean; dependents?: boolean; transitive?: boolean },\n ) => {\n if (opts.transitive) {\n handleResult(container.dependencyService.getTransitiveDeps(taskId));\n } else if (opts.dependents) {\n handleResult(container.dependencyService.listDependents(taskId));\n } else if (opts.blockers) {\n handleResult(container.dependencyService.listBlockers(taskId));\n } else {\n // Default: show all dependency edges\n handleResult(container.dependencyService.listAllDeps(taskId));\n }\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\n\nexport function registerDepGraph(parent: Command, container: Container): void {\n parent\n .command('graph <taskId>')\n .description('Build full dependency graph centered on a task (outputs Mermaid)')\n .action((taskId: string) => {\n const result = container.dependencyService.buildGraph(taskId);\n handleResult(result);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../container.js';\nimport { printSuccess, printError } from '../output.js';\nimport { APP_VERSION } from '../../version.js';\n\nexport function registerUpgrade(program: Command, container: Container): void {\n program\n .command('upgrade')\n .description('Check for updates and upgrade to the latest version')\n .action(async () => {\n const checkResult = await container.updateService.checkForUpdate(APP_VERSION);\n if (!checkResult.ok) {\n printError(checkResult.error);\n return;\n }\n\n if (!checkResult.value.updateAvailable) {\n printSuccess({\n message: 'Already up to date',\n currentVersion: checkResult.value.currentVersion,\n });\n return;\n }\n\n process.stderr.write(\n `Upgrading from ${checkResult.value.currentVersion} to ${checkResult.value.latestVersion}...\\n`,\n );\n\n const upgradeResult = container.updateService.performUpgrade(APP_VERSION);\n if (!upgradeResult.ok) {\n printError(upgradeResult.error);\n return;\n }\n\n printSuccess({\n message: 'Upgrade complete',\n previousVersion: checkResult.value.currentVersion,\n installedVersion: upgradeResult.value.installedVersion,\n });\n });\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { logger } from '../logging/logger.js';\nimport { toMessage } from '../errors/app-error.js';\nimport { InstallId } from '../types/install-id.js';\nimport { isCI } from '../utils/ci.js';\nimport type { FetchFn } from '../types/common.js';\n\nconst HEARTBEAT_URL = 'https://tayto-telemetry.tomkapa.workers.dev/api/heartbeat';\nconst TIMEOUT_MS = 3000;\n\ninterface TelemetryState {\n installId: InstallId;\n lastPingDate: string;\n}\n\nfunction isValidRawState(value: unknown): value is { installId: string; lastPingDate: string } {\n if (typeof value !== 'object' || value === null) return false;\n const obj = value as Record<string, unknown>;\n return typeof obj['installId'] === 'string' && typeof obj['lastPingDate'] === 'string';\n}\n\nexport function todayUTC(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nasync function readState(statePath: string): Promise<TelemetryState | null> {\n let raw: string;\n try {\n raw = await readFile(statePath, 'utf-8');\n } catch (e: unknown) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn('telemetry: failed to read state', { error: toMessage(e), path: statePath });\n }\n return null;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!isValidRawState(parsed)) return null;\n return { installId: InstallId.parse(parsed.installId), lastPingDate: parsed.lastPingDate };\n } catch (e: unknown) {\n logger.warn('telemetry: corrupt state file, will regenerate', {\n error: toMessage(e),\n path: statePath,\n });\n return null;\n }\n}\n\nasync function writeState(\n statePath: string,\n state: { installId: string; lastPingDate: string },\n): Promise<void> {\n try {\n await writeFile(statePath, JSON.stringify(state), 'utf-8');\n } catch (e: unknown) {\n logger.warn('telemetry: failed to write state', { error: toMessage(e), path: statePath });\n }\n}\n\nexport interface HeartbeatDeps {\n statePath: string;\n version: string;\n fetchImpl?: FetchFn;\n env?: Record<string, string | undefined>;\n}\n\n/**\n * Sends at most one anonymous heartbeat ping per calendar day (UTC).\n * Fire-and-forget: never blocks, never throws.\n */\nexport function maybeSendHeartbeat(deps: HeartbeatDeps): void {\n const { statePath, version, fetchImpl = globalThis.fetch, env = process.env } = deps;\n\n void (async () => {\n try {\n if (env['TASKCLI_TELEMETRY_DISABLED'] === '1') {\n logger.info('telemetry: disabled via TASKCLI_TELEMETRY_DISABLED');\n return;\n }\n\n if (isCI(env)) {\n logger.info('telemetry: skipped in CI environment');\n return;\n }\n\n const today = todayUTC();\n const state = await readState(statePath);\n\n if (state && state.lastPingDate === today) {\n return;\n }\n\n const installId = state ? state.installId : InstallId.generate();\n\n // Write today's date before sending so at most one attempt per day even if the endpoint is down\n await writeState(statePath, { installId: installId.toString(), lastPingDate: today });\n\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, TIMEOUT_MS);\n timeout.unref();\n\n const payload = {\n installId: installId.toString(),\n version,\n os: process.platform,\n nodeVersion: process.version,\n timestamp: new Date().toISOString(),\n };\n\n fetchImpl(HEARTBEAT_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: controller.signal,\n })\n .then(() => {\n clearTimeout(timeout);\n logger.info('telemetry: heartbeat sent', { installId: installId.toString() });\n })\n .catch((e: unknown) => {\n clearTimeout(timeout);\n logger.info('telemetry: heartbeat failed (non-blocking)', { error: toMessage(e) });\n });\n } catch (e: unknown) {\n logger.warn('telemetry: unexpected error in maybeSendHeartbeat', { error: toMessage(e) });\n }\n })();\n}\n","import { ulid } from 'ulid';\n\nconst ULID_REGEX = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n\n/**\n * Value object representing an anonymous installation identifier.\n * Generated once per install, stored locally, and used for telemetry deduplication.\n */\nexport class InstallId {\n readonly value: string;\n\n private constructor(id: string) {\n this.value = id;\n }\n\n static generate(): InstallId {\n return new InstallId(ulid());\n }\n\n static parse(raw: string): InstallId {\n const trimmed = raw.trim();\n if (!ULID_REGEX.test(trimmed)) {\n throw new Error(`Invalid InstallId: expected ULID format, got \"${trimmed}\"`);\n }\n return new InstallId(trimmed.toUpperCase());\n }\n\n toString(): string {\n return this.value;\n }\n}\n","const CI_ENV_VARS = [\n 'CI',\n 'GITHUB_ACTIONS',\n 'JENKINS_URL',\n 'GITLAB_CI',\n 'CIRCLECI',\n 'BUILDKITE',\n 'TF_BUILD',\n 'CODEBUILD_BUILD_ID',\n] as const;\n\n/**\n * Detects whether the current process is running in a CI environment\n * by checking common CI provider environment variables.\n */\nexport function isCI(env: Record<string, string | undefined> = process.env): boolean {\n return CI_ENV_VARS.some((key) => {\n const val = env[key];\n return val !== undefined && val !== '';\n });\n}\n","import { loadConfig } from './config/index.js';\nimport { createDatabase } from './db/connection.js';\nimport { runMigrations } from './db/migrator.js';\nimport { initTelemetry, shutdownTelemetry } from './logging/telemetry.js';\nimport { logger } from './logging/logger.js';\nimport { createContainer } from './cli/container.js';\nimport type { Container } from './cli/container.js';\nimport { buildCLI } from './cli/index.js';\nimport { AppError } from './errors/app-error.js';\nimport { APP_VERSION } from './version.js';\nimport type { UpdateCheckResult } from './service/update.service.js';\nimport { maybeSendHeartbeat } from './telemetry/heartbeat.js';\n\nasync function checkForUpdateQuietly(\n container: Container,\n currentVersion: string,\n): Promise<UpdateCheckResult | null> {\n let timerId: ReturnType<typeof setTimeout> | undefined;\n try {\n const result = await Promise.race([\n container.updateService.checkForUpdate(currentVersion),\n new Promise<null>((resolve) => {\n timerId = setTimeout(() => {\n resolve(null);\n }, 2000);\n }),\n ]);\n clearTimeout(timerId);\n if (result !== null && result.ok) {\n return result.value;\n }\n return null;\n } catch {\n clearTimeout(timerId);\n return null;\n }\n}\n\nasync function main(): Promise<void> {\n const config = loadConfig();\n logger.init(config.logDir);\n initTelemetry(config);\n\n maybeSendHeartbeat({ statePath: config.telemetryStatePath, version: APP_VERSION });\n\n const db = createDatabase(config.dbPath);\n runMigrations(db);\n\n const container = createContainer(\n db,\n config.dbPath,\n undefined,\n config.updateCachePath,\n config.dismissedGitRemotesPath,\n );\n\n const args = process.argv.slice(2);\n const isUpgradeCommand = args[0] === 'upgrade';\n\n let updateCheck: UpdateCheckResult | null = null;\n if (!config.noUpdateCheck && !isUpgradeCommand) {\n updateCheck = await checkForUpdateQuietly(container, APP_VERSION);\n }\n\n if (args.length === 0) {\n const { launchTUI } = await import('./tui/index.js');\n await launchTUI(\n container,\n undefined,\n updateCheck?.updateAvailable ? updateCheck.latestVersion : undefined,\n );\n } else {\n if (updateCheck?.updateAvailable) {\n process.stderr.write(\n `\\x1b[33m[tayto]\\x1b[0m Update available: ${updateCheck.currentVersion} → ${updateCheck.latestVersion}. Run: tayto upgrade\\n`,\n );\n }\n const program = buildCLI(container);\n await program.parseAsync(process.argv);\n }\n\n db.close();\n await shutdownTelemetry();\n}\n\nmain().catch((e: unknown) => {\n const error =\n e instanceof AppError\n ? e\n : new AppError('UNKNOWN', e instanceof Error ? e.message : 'Unknown error', e);\n\n process.stderr.write(\n JSON.stringify({ ok: false, error: { code: error.code, message: error.message } }, null, 2) +\n '\\n',\n );\n process.exit(1);\n});\n"],"mappings":"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","names":["join","join","join","params","sql","rows","z","z","updateResult","z","z","z","readFileSync","updateAvailable","readFileSync","detectGitRemote","join","readFileSync","readFileSync","writeFileSync","writeFileSync","readFileSync","readFileSync","ulid"]}
1
+ {"version":3,"sources":["../src/config/index.ts","../src/db/connection.ts","../src/db/migrator.ts","../src/logging/telemetry.ts","../src/cli/container.ts","../src/types/project.ts","../src/types/branded.ts","../src/repository/errors.ts","../src/service/errors.ts","../src/service/project.service.ts","../src/types/task.ts","../src/types/id-fields.ts","../src/service/task.service.ts","../src/types/dependency.ts","../src/service/dependency.service.ts","../src/types/portability.ts","../src/service/portability.service.ts","../src/service/update.service.ts","../src/types/analytic.ts","../src/utils/duration.ts","../src/service/analytic.service.ts","../src/repository/relevance.ts","../src/repository/clock.ts","../src/repository/limits.ts","../src/repository/sqlite/index.ts","../src/repository/sqlite/task.repo.ts","../src/utils/search-parser.ts","../src/repository/sqlite/row-mappers.ts","../src/repository/sqlite/span.ts","../src/repository/sqlite/txn.ts","../src/repository/sqlite/project.repo.ts","../src/repository/sqlite/dependency.repo.ts","../src/cli/index.ts","../src/cli/output.ts","../src/cli/commands/project/create.ts","../src/cli/commands/project/list.ts","../src/cli/commands/project/update.ts","../src/cli/commands/project/delete.ts","../src/cli/commands/project/set-default.ts","../src/cli/commands/project/link.ts","../src/cli/commands/project/unlink.ts","../src/cli/helpers/project.ts","../src/cli/commands/task/create.ts","../src/cli/commands/task/list.ts","../src/cli/helpers/ids.ts","../src/cli/commands/task/show.ts","../src/cli/commands/task/update.ts","../src/cli/commands/task/delete.ts","../src/cli/commands/task/breakdown.ts","../src/cli/commands/task/rank.ts","../src/cli/commands/task/search.ts","../src/cli/commands/task/export.ts","../src/cli/commands/task/import.ts","../src/cli/commands/dep/add.ts","../src/cli/commands/dep/remove.ts","../src/cli/commands/dep/list.ts","../src/cli/commands/dep/graph.ts","../src/cli/commands/upgrade.ts","../src/cli/commands/analytic/summary.ts","../src/cli/commands/analytic/completed.ts","../src/telemetry/heartbeat.ts","../src/types/install-id.ts","../src/utils/ci.ts","../src/index.ts"],"sourcesContent":["import { mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface Config {\n dbPath: string;\n logDir: string;\n logLevel: string;\n otelEndpoint: string | undefined;\n updateCachePath: string;\n dismissedGitRemotesPath: string;\n telemetryStatePath: string;\n noUpdateCheck: boolean;\n}\n\nfunction ensureDir(dir: string): void {\n mkdirSync(dir, { recursive: true });\n}\n\nexport function loadConfig(): Config {\n const dataDir = process.env['TASK_DATA_DIR'] ?? join(homedir(), '.task');\n ensureDir(dataDir);\n\n const logDir = process.env['TASK_LOG_DIR'] ?? join(dataDir, 'logs');\n ensureDir(logDir);\n\n return {\n dbPath: process.env['TASK_DB_PATH'] ?? join(dataDir, 'data.db'),\n logDir,\n logLevel: process.env['TASK_LOG_LEVEL'] ?? 'info',\n otelEndpoint: process.env['OTEL_EXPORTER_OTLP_ENDPOINT'],\n updateCachePath: join(dataDir, 'update-check.json'),\n dismissedGitRemotesPath: join(dataDir, 'dismissed-git-remotes.json'),\n telemetryStatePath: join(dataDir, 'telemetry.json'),\n noUpdateCheck: process.env['TAYTO_NO_UPDATE_CHECK'] === '1',\n };\n}\n","import { DatabaseSync } from 'node:sqlite';\n\nexport function createDatabase(dbPath: string): DatabaseSync {\n const db = new DatabaseSync(dbPath);\n db.exec('PRAGMA journal_mode = WAL');\n db.exec('PRAGMA foreign_keys = ON');\n return db;\n}\n","import { readdirSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { logger } from '../logging/logger.js';\n\nconst migrationsDir = join(dirname(fileURLToPath(import.meta.url)), 'migrations');\n\nfunction loadMigrations(): Array<{ name: string; sql: string }> {\n const files = readdirSync(migrationsDir)\n .filter((f) => f.endsWith('.sql'))\n .sort();\n\n return files.map((name) => ({\n name,\n sql: readFileSync(join(migrationsDir, name), 'utf-8'),\n }));\n}\n\nexport function runMigrations(db: DatabaseSync): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS _migrations (\n name TEXT PRIMARY KEY,\n applied_at TEXT NOT NULL\n );\n `);\n\n const applied = new Set(\n (db.prepare('SELECT name FROM _migrations').all() as Array<{ name: string }>).map(\n (r) => r.name,\n ),\n );\n\n const migrations = loadMigrations();\n\n for (const migration of migrations) {\n if (applied.has(migration.name)) continue;\n\n logger.info(`Applying migration: ${migration.name}`);\n\n db.exec('BEGIN');\n try {\n db.exec(migration.sql);\n db.prepare('INSERT INTO _migrations (name, applied_at) VALUES (?, ?)').run(\n migration.name,\n new Date().toISOString(),\n );\n db.exec('COMMIT');\n } catch (e) {\n db.exec('ROLLBACK');\n throw e;\n }\n logger.info(`Migration applied: ${migration.name}`);\n }\n}\n","import { NodeSDK } from '@opentelemetry/sdk-node';\nimport { BatchSpanProcessor, ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport type { Config } from '../config/index.js';\n\nlet sdk: NodeSDK | undefined;\n\nexport function initTelemetry(config: Config): void {\n const spanProcessor = config.otelEndpoint\n ? new BatchSpanProcessor(new OTLPTraceExporter({ url: config.otelEndpoint }))\n : config.logLevel === 'debug'\n ? new BatchSpanProcessor(new ConsoleSpanExporter())\n : undefined;\n\n sdk = new NodeSDK({\n serviceName: 'task',\n spanProcessors: spanProcessor ? [spanProcessor] : [],\n });\n\n sdk.start();\n}\n\nexport async function shutdownTelemetry(): Promise<void> {\n if (sdk) {\n await sdk.shutdown();\n }\n}\n","import { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport type { RepositorySet } from '../repository/repository-set.js';\nimport { ProjectServiceImpl } from '../service/project.service.js';\nimport type { DetectGitRemoteFn } from '../service/project.service.js';\nimport { TaskServiceImpl } from '../service/task.service.js';\nimport { DependencyServiceImpl } from '../service/dependency.service.js';\nimport { PortabilityServiceImpl } from '../service/portability.service.js';\nimport { UpdateServiceImpl } from '../service/update.service.js';\nimport { AnalyticServiceImpl } from '../service/analytic.service.js';\nimport type { ProjectService } from '../service/project.service.js';\nimport type { TaskService } from '../service/task.service.js';\nimport type { DependencyService } from '../service/dependency.service.js';\nimport type { PortabilityService } from '../service/portability.service.js';\nimport type { UpdateService } from '../service/update.service.js';\nimport type { AnalyticService } from '../service/analytic.service.js';\n\nexport interface Container {\n repos: RepositorySet;\n dbPath: string;\n updateCachePath: string;\n dismissedGitRemotesPath: string;\n projectService: ProjectService;\n taskService: TaskService;\n dependencyService: DependencyService;\n portabilityService: PortabilityService;\n updateService: UpdateService;\n analyticService: AnalyticService;\n}\n\nexport interface CreateContainerOptions {\n dbPath?: string;\n detectGitRemote?: DetectGitRemoteFn;\n updateCachePath?: string;\n dismissedGitRemotesPath?: string;\n}\n\nexport function createContainer(\n repos: RepositorySet,\n options: CreateContainerOptions = {},\n): Container {\n const projectService = new ProjectServiceImpl(repos.projects, options.detectGitRemote);\n const dependencyService = new DependencyServiceImpl(repos.dependencies, repos.tasks);\n const taskService = new TaskServiceImpl(repos.tasks, projectService, () => dependencyService);\n const portabilityService = new PortabilityServiceImpl(taskService, dependencyService);\n const resolvedUpdateCachePath =\n options.updateCachePath ?? join(tmpdir(), 'tayto-update-check.json');\n const updateService = new UpdateServiceImpl(resolvedUpdateCachePath);\n const analyticService = new AnalyticServiceImpl(repos.tasks);\n\n return {\n repos,\n dbPath: options.dbPath ?? '',\n updateCachePath: resolvedUpdateCachePath,\n dismissedGitRemotesPath:\n options.dismissedGitRemotesPath ?? join(tmpdir(), 'tayto-dismissed-git-remotes.json'),\n projectService,\n taskService,\n dependencyService,\n portabilityService,\n updateService,\n analyticService,\n };\n}\n","import { z } from 'zod/v4';\nimport { GitRemote } from './git-remote.js';\nimport type { ProjectId } from './branded.js';\n\nconst gitRemoteField = z\n .string()\n .min(1, 'Git remote URL must not be empty')\n .transform((v) => GitRemote.parse(v))\n .nullable()\n .optional();\n\nexport const CreateProjectSchema = z.object({\n name: z.string().min(1, 'Project name is required').max(255),\n key: z\n .string()\n .min(2, 'Project key must be at least 2 characters')\n .max(7, 'Project key must be at most 7 characters')\n .regex(/^[A-Za-z0-9]+$/, 'Project key must contain only letters and digits')\n .transform((v) => v.toUpperCase())\n .optional(),\n description: z.string().max(5000).optional(),\n isDefault: z.boolean().optional(),\n gitRemote: gitRemoteField,\n});\nexport type CreateProjectInput = z.infer<typeof CreateProjectSchema>;\n\nexport const UpdateProjectSchema = z.object({\n name: z.string().min(1).max(255).optional(),\n description: z.string().max(5000).optional(),\n isDefault: z.boolean().optional(),\n gitRemote: gitRemoteField,\n});\nexport type UpdateProjectInput = z.infer<typeof UpdateProjectSchema>;\n\nexport interface Project {\n id: ProjectId;\n key: string;\n name: string;\n description: string;\n isDefault: boolean;\n gitRemote: GitRemote | null;\n createdAt: string;\n updatedAt: string;\n}\n","declare const __brand: unique symbol;\n\n/**\n * Phantom-branded nominal type. `Brand<T, B>` is structurally a `T` but\n * nominally distinct from any other `Brand<T, _>`. Zero runtime cost.\n */\nexport type Brand<T, B> = T & { readonly [__brand]: B };\n\n/**\n * Parse failure for id constructors. Returned (not thrown) so the\n * caller's control flow stays explicit at the boundary.\n */\nexport interface ParseError {\n readonly kind: 'parse_error';\n readonly detail: string;\n}\n\nexport function isParseError(v: unknown): v is ParseError {\n return (\n typeof v === 'object' &&\n v !== null &&\n 'kind' in v &&\n (v as { kind: unknown }).kind === 'parse_error'\n );\n}\n\n/**\n * Task id: `<PROJECT_KEY>-<N>` where the key is 2-7 uppercase alphanumerics\n * and `N` is a positive integer. Matches the format produced by\n * `projectService.nextTaskId`.\n */\nexport type TaskId = Brand<string, 'TaskId'>;\n\nconst TASK_ID_MAX = 64;\nconst TASK_ID_RE = /^[A-Z0-9]{2,7}-\\d+$/;\n\nexport const TaskId = {\n parse(raw: string): TaskId | ParseError {\n if (raw.length === 0) {\n return { kind: 'parse_error', detail: 'TaskId cannot be empty' };\n }\n if (raw.length > TASK_ID_MAX) {\n return {\n kind: 'parse_error',\n detail: `TaskId exceeds ${TASK_ID_MAX} characters`,\n };\n }\n if (!TASK_ID_RE.test(raw)) {\n return {\n kind: 'parse_error',\n detail: `Invalid TaskId format: ${raw} (expected e.g. ABC-123)`,\n };\n }\n return raw as TaskId;\n },\n /**\n * Escape hatch for trusted DB output inside row-mapper files (which\n * already assert the row shape) and for test fixtures. Never call from\n * service or CLI code.\n */\n unsafe(raw: string): TaskId {\n return raw as TaskId;\n },\n} as const;\n\n/**\n * Project id. Generated as a ULID at creation time (see `projectService`),\n * but the brand tolerates any non-empty string up to `PROJECT_ID_MAX` so\n * migration and import flows work too.\n */\nexport type ProjectId = Brand<string, 'ProjectId'>;\n\nconst PROJECT_ID_MAX = 64;\n\nexport const ProjectId = {\n parse(raw: string): ProjectId | ParseError {\n if (raw.length === 0) {\n return { kind: 'parse_error', detail: 'ProjectId cannot be empty' };\n }\n if (raw.length > PROJECT_ID_MAX) {\n return {\n kind: 'parse_error',\n detail: `ProjectId exceeds ${PROJECT_ID_MAX} characters`,\n };\n }\n return raw as ProjectId;\n },\n unsafe(raw: string): ProjectId {\n return raw as ProjectId;\n },\n} as const;\n\n/**\n * Dependency id is the composite `${taskId}->${dependsOnId}`. There is no\n * stored single-column id, but callers sometimes need a portable\n * representation (e.g. error messages, logs, export). The constructor\n * takes the already-branded parts.\n */\nexport type DependencyId = Brand<string, 'DependencyId'>;\n\nexport const DependencyId = {\n of(taskId: TaskId, dependsOnId: TaskId): DependencyId {\n return `${taskId}->${dependsOnId}` as DependencyId;\n },\n unsafe(raw: string): DependencyId {\n return raw as DependencyId;\n },\n} as const;\n","import type { PresentedError } from '../types/presented-error.js';\n\nexport type RepositoryEntity = 'task' | 'project' | 'dependency';\n\nexport type RepositoryLimit = 'search' | 'find_many' | 'txn_ops';\n\n/**\n * Every expected failure at the repository boundary. `throw` is reserved\n * for assertion failures inside implementations; every other failure mode\n * shows up as one of these variants.\n *\n * `kind: 'transient'` is the only variant the caller may retry\n * automatically. All other kinds are either programmer error (wrap, don't\n * retry) or user error (surface).\n */\nexport type RepositoryError =\n | { readonly kind: 'not_found'; readonly entity: RepositoryEntity; readonly id: string }\n | {\n readonly kind: 'duplicate';\n readonly entity: RepositoryEntity;\n readonly key: string;\n readonly detail: string;\n }\n | {\n readonly kind: 'foreign_key';\n readonly parentEntity: string;\n readonly parentId: string;\n readonly detail: string;\n }\n | { readonly kind: 'invariant_violated'; readonly detail: string }\n | {\n readonly kind: 'limit_exceeded';\n readonly limit: RepositoryLimit;\n readonly max: number;\n readonly detail: string;\n }\n | {\n readonly kind: 'transient';\n readonly cause: 'lock' | 'io' | 'network';\n readonly retryable: true;\n readonly detail: string;\n }\n | {\n readonly kind: 'unavailable';\n readonly cause: 'schema_mismatch' | 'backend_down';\n readonly detail: string;\n };\n\nfunction capitalize(s: string): string {\n const head = s.charAt(0);\n return head === '' ? s : head.toUpperCase() + s.slice(1);\n}\n\n/**\n * Exhaustive switch from `RepositoryError` to the CLI's `{code, message}`\n * output shape. Adding a new variant fails the compile here — and\n * therefore fails every service's `present<Service>Error` that forwards\n * repo-kind errors through.\n */\nexport function presentRepositoryError(e: RepositoryError): PresentedError {\n switch (e.kind) {\n case 'not_found':\n return { code: 'NOT_FOUND', message: `${capitalize(e.entity)} not found: ${e.id}` };\n case 'duplicate':\n return { code: 'DUPLICATE', message: e.detail };\n case 'foreign_key':\n return { code: 'NOT_FOUND', message: e.detail };\n case 'invariant_violated':\n return { code: 'VALIDATION', message: e.detail };\n case 'limit_exceeded':\n return { code: 'VALIDATION', message: e.detail };\n case 'transient':\n return { code: 'DB_ERROR', message: e.detail };\n case 'unavailable':\n return { code: 'DB_ERROR', message: e.detail };\n }\n}\n","import type { Result } from '../types/common.js';\nimport type { PresentedError } from '../types/presented-error.js';\nimport type { RepositoryError } from '../repository/errors.js';\nimport { presentRepositoryError } from '../repository/errors.js';\nimport type { TaskId } from '../types/branded.js';\n\n// ── TaskService ───────────────────────────────────────────────────────\n\nexport type TaskServiceError =\n | { readonly kind: 'not_found'; readonly id: TaskId; readonly message: string }\n | { readonly kind: 'validation'; readonly detail: string; readonly message: string }\n | { readonly kind: 'dep_failed'; readonly cause: DependencyServiceError; readonly message: string }\n | { readonly kind: 'repo'; readonly cause: RepositoryError; readonly message: string };\n\nexport const TaskErr = {\n notFound(id: TaskId): TaskServiceError {\n return { kind: 'not_found', id, message: `Task not found: ${id}` };\n },\n validation(detail: string): TaskServiceError {\n return { kind: 'validation', detail, message: detail };\n },\n depFailed(cause: DependencyServiceError): TaskServiceError {\n return {\n kind: 'dep_failed',\n cause,\n message: presentDependencyServiceError(cause).message,\n };\n },\n repo(cause: RepositoryError): TaskServiceError {\n return { kind: 'repo', cause, message: presentRepositoryError(cause).message };\n },\n} as const;\n\nexport function presentTaskServiceError(e: TaskServiceError): PresentedError {\n switch (e.kind) {\n case 'not_found':\n return { code: 'NOT_FOUND', message: e.message };\n case 'validation':\n return { code: 'VALIDATION', message: e.message };\n case 'dep_failed':\n return presentDependencyServiceError(e.cause);\n case 'repo':\n return presentRepositoryError(e.cause);\n }\n}\n\nexport function mapTaskRepo<T>(\n r: Result<T, RepositoryError>,\n): Result<T, TaskServiceError> {\n return r.ok ? r : { ok: false, error: TaskErr.repo(r.error) };\n}\n\n// ── ProjectService ────────────────────────────────────────────────────\n\nexport type ProjectServiceError =\n | { readonly kind: 'not_found'; readonly idOrName: string; readonly message: string }\n | { readonly kind: 'duplicate'; readonly key: string; readonly message: string }\n | { readonly kind: 'validation'; readonly detail: string; readonly message: string }\n | { readonly kind: 'git_remote_missing'; readonly message: string }\n | { readonly kind: 'repo'; readonly cause: RepositoryError; readonly message: string };\n\nexport const ProjectErr = {\n notFound(idOrName: string, message?: string): ProjectServiceError {\n return {\n kind: 'not_found',\n idOrName,\n message: message ?? `Project not found: ${idOrName}`,\n };\n },\n duplicate(key: string, message?: string): ProjectServiceError {\n return {\n kind: 'duplicate',\n key,\n message: message ?? `Project key already exists: ${key}`,\n };\n },\n validation(detail: string): ProjectServiceError {\n return { kind: 'validation', detail, message: detail };\n },\n gitRemoteMissing(message: string): ProjectServiceError {\n return { kind: 'git_remote_missing', message };\n },\n repo(cause: RepositoryError): ProjectServiceError {\n return { kind: 'repo', cause, message: presentRepositoryError(cause).message };\n },\n} as const;\n\nexport function presentProjectServiceError(e: ProjectServiceError): PresentedError {\n switch (e.kind) {\n case 'not_found':\n return { code: 'NOT_FOUND', message: e.message };\n case 'duplicate':\n return { code: 'DUPLICATE', message: e.message };\n case 'validation':\n return { code: 'VALIDATION', message: e.message };\n case 'git_remote_missing':\n return { code: 'NOT_FOUND', message: e.message };\n case 'repo':\n return presentRepositoryError(e.cause);\n }\n}\n\nexport function mapProjectRepo<T>(\n r: Result<T, RepositoryError>,\n): Result<T, ProjectServiceError> {\n return r.ok ? r : { ok: false, error: ProjectErr.repo(r.error) };\n}\n\n// ── DependencyService ─────────────────────────────────────────────────\n\nexport type DependencyServiceError =\n | { readonly kind: 'task_not_found'; readonly taskId: TaskId; readonly message: string }\n | { readonly kind: 'validation'; readonly detail: string; readonly message: string }\n | { readonly kind: 'cycle'; readonly taskId: TaskId; readonly dependsOnId: TaskId; readonly message: string }\n | { readonly kind: 'not_found'; readonly detail: string; readonly message: string }\n | { readonly kind: 'duplicate'; readonly detail: string; readonly message: string }\n | { readonly kind: 'repo'; readonly cause: RepositoryError; readonly message: string };\n\nexport const DepErr = {\n taskNotFound(taskId: TaskId): DependencyServiceError {\n return { kind: 'task_not_found', taskId, message: `Task not found: ${taskId}` };\n },\n validation(detail: string): DependencyServiceError {\n return { kind: 'validation', detail, message: detail };\n },\n cycle(taskId: TaskId, dependsOnId: TaskId): DependencyServiceError {\n return {\n kind: 'cycle',\n taskId,\n dependsOnId,\n message: `Adding this dependency would create a cycle: ${taskId} -> ${dependsOnId}`,\n };\n },\n notFound(detail: string): DependencyServiceError {\n return { kind: 'not_found', detail, message: detail };\n },\n duplicate(detail: string): DependencyServiceError {\n return { kind: 'duplicate', detail, message: detail };\n },\n repo(cause: RepositoryError): DependencyServiceError {\n // Repo-level not_found / duplicate bubble up as the corresponding\n // service-level variants so the CLI code field stays stable.\n if (cause.kind === 'not_found') {\n return { kind: 'not_found', detail: presentRepositoryError(cause).message, message: presentRepositoryError(cause).message };\n }\n if (cause.kind === 'duplicate') {\n return { kind: 'duplicate', detail: cause.detail, message: cause.detail };\n }\n if (cause.kind === 'foreign_key') {\n return { kind: 'not_found', detail: cause.detail, message: cause.detail };\n }\n if (cause.kind === 'invariant_violated') {\n return { kind: 'validation', detail: cause.detail, message: cause.detail };\n }\n return { kind: 'repo', cause, message: presentRepositoryError(cause).message };\n },\n} as const;\n\nexport function presentDependencyServiceError(e: DependencyServiceError): PresentedError {\n switch (e.kind) {\n case 'task_not_found':\n return { code: 'NOT_FOUND', message: e.message };\n case 'validation':\n return { code: 'VALIDATION', message: e.message };\n case 'cycle':\n return { code: 'VALIDATION', message: e.message };\n case 'not_found':\n return { code: 'NOT_FOUND', message: e.message };\n case 'duplicate':\n return { code: 'DUPLICATE', message: e.message };\n case 'repo':\n return presentRepositoryError(e.cause);\n }\n}\n\nexport function mapDepRepo<T>(\n r: Result<T, RepositoryError>,\n): Result<T, DependencyServiceError> {\n return r.ok ? r : { ok: false, error: DepErr.repo(r.error) };\n}\n\n// ── AnalyticService ───────────────────────────────────────────────────\n\nexport type AnalyticServiceError =\n | { readonly kind: 'validation'; readonly detail: string; readonly message: string }\n | { readonly kind: 'repo'; readonly cause: RepositoryError; readonly message: string };\n\nexport const AnalyticErr = {\n validation(detail: string): AnalyticServiceError {\n return { kind: 'validation', detail, message: detail };\n },\n repo(cause: RepositoryError): AnalyticServiceError {\n return { kind: 'repo', cause, message: presentRepositoryError(cause).message };\n },\n} as const;\n\nexport function presentAnalyticServiceError(e: AnalyticServiceError): PresentedError {\n switch (e.kind) {\n case 'validation':\n return { code: 'VALIDATION', message: e.message };\n case 'repo':\n return presentRepositoryError(e.cause);\n }\n}\n\nexport function mapAnalyticRepo<T>(\n r: Result<T, RepositoryError>,\n): Result<T, AnalyticServiceError> {\n return r.ok ? r : { ok: false, error: AnalyticErr.repo(r.error) };\n}\n\n// ── PortabilityService ────────────────────────────────────────────────\n\nexport type PortabilityServiceError =\n | { readonly kind: 'validation'; readonly detail: string; readonly message: string }\n | { readonly kind: 'task_service'; readonly cause: TaskServiceError; readonly message: string }\n | {\n readonly kind: 'dep_service';\n readonly cause: DependencyServiceError;\n readonly message: string;\n };\n\nexport const PortabilityErr = {\n validation(detail: string): PortabilityServiceError {\n return { kind: 'validation', detail, message: detail };\n },\n taskService(cause: TaskServiceError): PortabilityServiceError {\n return {\n kind: 'task_service',\n cause,\n message: presentTaskServiceError(cause).message,\n };\n },\n depService(cause: DependencyServiceError): PortabilityServiceError {\n return {\n kind: 'dep_service',\n cause,\n message: presentDependencyServiceError(cause).message,\n };\n },\n} as const;\n\nexport function presentPortabilityServiceError(e: PortabilityServiceError): PresentedError {\n switch (e.kind) {\n case 'validation':\n return { code: 'VALIDATION', message: e.message };\n case 'task_service':\n return presentTaskServiceError(e.cause);\n case 'dep_service':\n return presentDependencyServiceError(e.cause);\n }\n}\n\n// ── UpdateService ─────────────────────────────────────────────────────\n\nexport type UpdateServiceError =\n | { readonly kind: 'network'; readonly detail: string; readonly message: string }\n | { readonly kind: 'parse_failure'; readonly detail: string; readonly message: string }\n | { readonly kind: 'upgrade_failed'; readonly detail: string; readonly message: string };\n\nexport const UpdateErr = {\n network(detail: string): UpdateServiceError {\n return { kind: 'network', detail, message: detail };\n },\n parseFailure(detail: string): UpdateServiceError {\n return { kind: 'parse_failure', detail, message: detail };\n },\n upgradeFailed(detail: string): UpdateServiceError {\n return { kind: 'upgrade_failed', detail, message: detail };\n },\n} as const;\n\nexport function presentUpdateServiceError(e: UpdateServiceError): PresentedError {\n switch (e.kind) {\n case 'network':\n case 'parse_failure':\n case 'upgrade_failed':\n return { code: 'UPGRADE_CHECK', message: e.message };\n }\n}\n\n// ── CLI-layer errors ──────────────────────────────────────────────────\n\n/** Errors produced before a service is invoked (arg parsing, file reads). */\nexport type CliError =\n | { readonly kind: 'validation'; readonly detail: string; readonly message: string }\n | { readonly kind: 'io'; readonly detail: string; readonly message: string };\n\nexport const CliErr = {\n validation(detail: string): CliError {\n return { kind: 'validation', detail, message: detail };\n },\n io(detail: string): CliError {\n return { kind: 'io', detail, message: detail };\n },\n} as const;\n\nexport function presentCliError(e: CliError): PresentedError {\n switch (e.kind) {\n case 'validation':\n return { code: 'VALIDATION', message: e.message };\n case 'io':\n return { code: 'UNKNOWN', message: e.message };\n }\n}\n","import type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type { Project } from '../types/project.js';\nimport { CreateProjectSchema, UpdateProjectSchema } from '../types/project.js';\nimport { GitRemote } from '../types/git-remote.js';\nimport type { ProjectId, TaskId } from '../types/branded.js';\nimport {\n TaskId as TaskIdCtor,\n ProjectId as ProjectIdCtor,\n isParseError,\n} from '../types/branded.js';\nimport type { ProjectRepository } from '../repository/project.repository.js';\nimport { logger } from '../logging/logger.js';\nimport { detectGitRemote as defaultDetectGitRemote } from '../utils/git.js';\nimport type { ProjectServiceError } from './errors.js';\nimport { ProjectErr, mapProjectRepo } from './errors.js';\n\nexport type DetectGitRemoteFn = (cwd?: string) => Result<GitRemote | null, never>;\n\nexport interface ProjectService {\n createProject(input: unknown): Result<Project, ProjectServiceError>;\n listProjects(): Result<Project[], ProjectServiceError>;\n getProject(id: ProjectId): Result<Project, ProjectServiceError>;\n updateProject(id: ProjectId, input: unknown): Result<Project, ProjectServiceError>;\n deleteProject(id: ProjectId): Result<void, ProjectServiceError>;\n resolveProject(idOrName?: string, cwd?: string): Result<Project, ProjectServiceError>;\n linkGitRemote(idOrName: string, remote?: string): Result<Project, ProjectServiceError>;\n unlinkGitRemote(idOrName: string): Result<Project, ProjectServiceError>;\n nextTaskId(project: Project): Result<TaskId, ProjectServiceError>;\n}\n\nexport class ProjectServiceImpl implements ProjectService {\n constructor(\n private readonly repo: ProjectRepository,\n private readonly detectRemote: DetectGitRemoteFn = defaultDetectGitRemote,\n ) {}\n\n createProject(input: unknown): Result<Project, ProjectServiceError> {\n return logger.startSpan('ProjectService.createProject', () => {\n const parsed = CreateProjectSchema.safeParse(input);\n if (!parsed.success) {\n return err(ProjectErr.validation(parsed.error.message));\n }\n\n const key = parsed.data.key ?? this.generateKey(parsed.data.name);\n const keyError = this.validateKey(key);\n if (keyError) {\n return err(ProjectErr.validation(keyError));\n }\n\n const existingResult = mapProjectRepo(this.repo.findByKey(key));\n if (!existingResult.ok) return existingResult;\n if (existingResult.value) {\n return err(ProjectErr.duplicate(key));\n }\n\n return mapProjectRepo(this.repo.insert({ ...parsed.data, key }));\n });\n }\n\n private generateKey(name: string): string {\n return name\n .replace(/[^A-Za-z0-9]/g, '')\n .slice(0, 3)\n .toUpperCase();\n }\n\n private validateKey(key: string): string | null {\n if (key.length < 2 || key.length > 7) {\n return `Project key must be 2-7 characters, got ${key.length}. Provide a --key explicitly.`;\n }\n if (!/^[A-Z0-9]+$/.test(key)) {\n return 'Project key must contain only uppercase letters and digits.';\n }\n return null;\n }\n\n listProjects(): Result<Project[], ProjectServiceError> {\n return mapProjectRepo(this.repo.findAll());\n }\n\n getProject(id: ProjectId): Result<Project, ProjectServiceError> {\n return logger.startSpan('ProjectService.getProject', () => {\n const result = mapProjectRepo(this.repo.findById(id));\n if (!result.ok) return result;\n if (!result.value) {\n return err(ProjectErr.notFound(id));\n }\n return ok(result.value);\n });\n }\n\n updateProject(id: ProjectId, input: unknown): Result<Project, ProjectServiceError> {\n return logger.startSpan('ProjectService.updateProject', () => {\n const parsed = UpdateProjectSchema.safeParse(input);\n if (!parsed.success) {\n return err(ProjectErr.validation(parsed.error.message));\n }\n return mapProjectRepo(this.repo.update(id, parsed.data));\n });\n }\n\n deleteProject(id: ProjectId): Result<void, ProjectServiceError> {\n return mapProjectRepo(this.repo.delete(id));\n }\n\n resolveProject(idOrName?: string, cwd?: string): Result<Project, ProjectServiceError> {\n return logger.startSpan('ProjectService.resolveProject', () => {\n if (idOrName) {\n const maybeId = ProjectIdCtor.parse(idOrName);\n if (!isParseError(maybeId)) {\n const byId = mapProjectRepo(this.repo.findById(maybeId));\n if (!byId.ok) return byId;\n if (byId.value) return ok(byId.value);\n }\n\n const byKey = mapProjectRepo(this.repo.findByKey(idOrName.toUpperCase()));\n if (!byKey.ok) return byKey;\n if (byKey.value) return ok(byKey.value);\n\n const byName = mapProjectRepo(this.repo.findByName(idOrName));\n if (!byName.ok) return byName;\n if (byName.value) return ok(byName.value);\n\n return err(ProjectErr.notFound(idOrName));\n }\n\n // Try git remote detection before falling back to default\n const remoteResult = this.detectRemote(cwd);\n if (remoteResult.ok && remoteResult.value) {\n const byRemote = mapProjectRepo(this.repo.findByGitRemote(remoteResult.value));\n if (!byRemote.ok) return byRemote;\n if (byRemote.value) {\n logger.info(`resolveProject: matched git remote to project key=${byRemote.value.key}`);\n return ok(byRemote.value);\n }\n }\n\n const defaultProject = mapProjectRepo(this.repo.findDefault());\n if (!defaultProject.ok) return defaultProject;\n if (defaultProject.value) return ok(defaultProject.value);\n\n return err(\n ProjectErr.notFound(\n '',\n 'No project specified and no default project set. Create a project first.',\n ),\n );\n });\n }\n\n linkGitRemote(idOrName: string, remote?: string): Result<Project, ProjectServiceError> {\n return logger.startSpan('ProjectService.linkGitRemote', () => {\n const resolved = this.resolveProject(idOrName);\n if (!resolved.ok) return resolved;\n\n let gitRemote: GitRemote;\n if (remote) {\n gitRemote = GitRemote.parse(remote);\n } else {\n const detected = this.detectRemote();\n if (!detected.ok) return err(ProjectErr.gitRemoteMissing('Could not detect git remote'));\n if (!detected.value) {\n return err(\n ProjectErr.gitRemoteMissing(\n 'No git remote detected in current directory. Use --remote <url> to specify one explicitly.',\n ),\n );\n }\n gitRemote = detected.value;\n }\n\n return mapProjectRepo(this.repo.update(resolved.value.id, { gitRemote }));\n });\n }\n\n unlinkGitRemote(idOrName: string): Result<Project, ProjectServiceError> {\n return logger.startSpan('ProjectService.unlinkGitRemote', () => {\n const resolved = this.resolveProject(idOrName);\n if (!resolved.ok) return resolved;\n\n if (!resolved.value.gitRemote) {\n return err(\n ProjectErr.notFound(\n resolved.value.name,\n `Project \"${resolved.value.name}\" has no linked git remote.`,\n ),\n );\n }\n\n return mapProjectRepo(this.repo.update(resolved.value.id, { gitRemote: null }));\n });\n }\n\n nextTaskId(project: Project): Result<TaskId, ProjectServiceError> {\n return logger.startSpan('ProjectService.nextTaskId', () => {\n const counterResult = mapProjectRepo(this.repo.incrementTaskCounter(project.id));\n if (!counterResult.ok) return counterResult;\n return ok(TaskIdCtor.unsafe(`${project.key}-${counterResult.value}`));\n });\n }\n}\n","import { z } from 'zod/v4';\nimport { TaskStatus, TaskType, DependencyType, UIDependencyType } from './enums.js';\nimport type { TaskId, ProjectId } from './branded.js';\nimport { taskIdField, projectIdField } from './id-fields.js';\n\nconst taskStatusValues = Object.values(TaskStatus) as [string, ...string[]];\nconst taskTypeValues = Object.values(TaskType) as [string, ...string[]];\nconst uiDepTypeValues = Object.values(UIDependencyType) as [string, ...string[]];\n\nconst DependencyEntrySchema = z.object({\n id: taskIdField,\n type: z.enum(uiDepTypeValues).default(DependencyType.Blocks),\n});\nexport type DependencyEntry = z.infer<typeof DependencyEntrySchema>;\n\nexport const CreateTaskSchema = z.object({\n name: z.string().min(1, 'Task name is required').max(500),\n description: z.string().max(10000).optional(),\n type: z.enum(taskTypeValues).default(TaskType.Story),\n status: z.enum(taskStatusValues).default(TaskStatus.Backlog),\n projectId: projectIdField.optional(),\n parentId: taskIdField.optional(),\n technicalNotes: z.string().max(50000).optional(),\n additionalRequirements: z.string().max(50000).optional(),\n dependsOn: z.array(DependencyEntrySchema).optional(),\n});\nexport type CreateTaskInput = z.infer<typeof CreateTaskSchema>;\n\nexport const UpdateTaskSchema = z.object({\n name: z.string().min(1).max(500).optional(),\n description: z.string().max(10000).optional(),\n type: z.enum(taskTypeValues).optional(),\n status: z.enum(taskStatusValues).optional(),\n parentId: taskIdField.nullable().optional(),\n technicalNotes: z.string().max(50000).optional(),\n additionalRequirements: z.string().max(50000).optional(),\n appendNotes: z.string().max(50000).optional(),\n appendRequirements: z.string().max(50000).optional(),\n});\nexport type UpdateTaskInput = z.infer<typeof UpdateTaskSchema>;\n\nexport const TaskFilterSchema = z.object({\n status: z.enum(taskStatusValues).optional(),\n type: z.enum(taskTypeValues).optional(),\n level: z.number().int().min(1).max(2).optional(),\n parentId: taskIdField.optional(),\n /** Multi-select filter: show tasks whose parentId is in this list. */\n parentIds: z.array(taskIdField).optional(),\n search: z.string().optional(),\n});\nexport type TaskFilter = z.infer<typeof TaskFilterSchema> & { projectId?: ProjectId };\n\nexport const RerankTaskSchema = z.object({\n taskId: taskIdField,\n afterId: taskIdField.optional(),\n beforeId: taskIdField.optional(),\n position: z.number().int().min(1).optional(),\n /** Move to the top of active tasks (highest priority). */\n top: z.boolean().optional(),\n /** Move to the bottom of active tasks, kept above terminal (done/cancelled) tasks. */\n bottom: z.boolean().optional(),\n});\nexport type RerankTaskInput = z.infer<typeof RerankTaskSchema>;\n\nexport interface Task {\n id: TaskId;\n projectId: ProjectId;\n parentId: TaskId | null;\n name: string;\n description: string;\n type: TaskType;\n status: TaskStatus;\n rank: number;\n technicalNotes: string;\n additionalRequirements: string;\n createdAt: string;\n updatedAt: string;\n}\n","import { z } from 'zod/v4';\nimport { TaskId, ProjectId, isParseError } from './branded.js';\n\n/**\n * Zod field that accepts a raw string at the boundary and transforms it\n * into a `TaskId`. Fails schema parsing with the parser's detail message\n * when the format is wrong — so the service layer never sees an invalid\n * id.\n */\nexport const taskIdField = z.string().transform((raw, ctx) => {\n const parsed = TaskId.parse(raw);\n if (isParseError(parsed)) {\n ctx.addIssue({ code: 'custom', message: parsed.detail });\n return z.NEVER;\n }\n return parsed;\n});\n\nexport const projectIdField = z.string().transform((raw, ctx) => {\n const parsed = ProjectId.parse(raw);\n if (isParseError(parsed)) {\n ctx.addIssue({ code: 'custom', message: parsed.detail });\n return z.NEVER;\n }\n return parsed;\n});\n","import type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type { Task, TaskFilter } from '../types/task.js';\nimport {\n CreateTaskSchema,\n UpdateTaskSchema,\n TaskFilterSchema,\n RerankTaskSchema,\n} from '../types/task.js';\nimport type { TaskRepository, SearchResult } from '../repository/task.repository.js';\nimport type { TaskId } from '../types/branded.js';\nimport type { ProjectService } from './project.service.js';\nimport type { Project } from '../types/project.js';\nimport type { DependencyService } from './dependency.service.js';\nimport { logger } from '../logging/logger.js';\nimport {\n TaskStatus,\n TaskLevel,\n RANK_GAP,\n isTerminalStatus,\n getTaskLevel,\n midpoint,\n} from '../types/enums.js';\nimport type { TaskServiceError } from './errors.js';\nimport { TaskErr, mapTaskRepo } from './errors.js';\n\nexport interface TaskService {\n createTask(input: unknown, project: Project): Result<Task, TaskServiceError>;\n getTask(id: TaskId): Result<Task, TaskServiceError>;\n listTasks(project: Project, filter: unknown): Result<Task[], TaskServiceError>;\n updateTask(id: TaskId, input: unknown): Result<Task, TaskServiceError>;\n deleteTask(id: TaskId): Result<void, TaskServiceError>;\n breakdownTask(parentId: TaskId, subtasks: unknown[]): Result<Task[], TaskServiceError>;\n rerankTask(input: unknown, project: Project): Result<Task, TaskServiceError>;\n searchTasks(query: string, project: Project): Result<SearchResult[], TaskServiceError>;\n}\n\nexport class TaskServiceImpl implements TaskService {\n constructor(\n private readonly repo: TaskRepository,\n private readonly projectService: ProjectService,\n private readonly getDependencyService: () => DependencyService,\n ) {}\n\n createTask(input: unknown, project: Project): Result<Task, TaskServiceError> {\n return logger.startSpan('TaskService.createTask', () => {\n const parsed = CreateTaskSchema.safeParse(input);\n if (!parsed.success) {\n return err(TaskErr.validation(parsed.error.message));\n }\n\n const taskLevel = getTaskLevel(parsed.data.type);\n\n if (taskLevel === TaskLevel.Release && parsed.data.parentId) {\n return err(TaskErr.validation('Release tasks cannot have a parent'));\n }\n\n if (parsed.data.parentId) {\n const parentResult = mapTaskRepo(this.repo.findById(parsed.data.parentId));\n if (!parentResult.ok) return parentResult;\n if (!parentResult.value) {\n return err(TaskErr.notFound(parsed.data.parentId));\n }\n if (getTaskLevel(parentResult.value.type) !== TaskLevel.Release) {\n return err(TaskErr.validation('Tasks can only be children of release-level tasks'));\n }\n }\n\n const taskIdResult = this.projectService.nextTaskId(project);\n if (!taskIdResult.ok) {\n // Project-service failure at task creation — surface as repo-level\n // failure for the caller (rare path; keeps the variant count low).\n return err(TaskErr.validation(taskIdResult.error.message));\n }\n\n const insertResult = mapTaskRepo(\n this.repo.insert(taskIdResult.value, {\n ...parsed.data,\n projectId: project.id,\n }),\n );\n if (!insertResult.ok) return insertResult;\n\n if (parsed.data.dependsOn && parsed.data.dependsOn.length > 0) {\n for (const entry of parsed.data.dependsOn) {\n const depResult = this.getDependencyService().addDependency({\n taskId: insertResult.value.id,\n dependsOnId: entry.id,\n type: entry.type,\n });\n if (!depResult.ok) return err(TaskErr.depFailed(depResult.error));\n }\n }\n\n return insertResult;\n });\n }\n\n getTask(id: TaskId): Result<Task, TaskServiceError> {\n return logger.startSpan('TaskService.getTask', () => {\n const result = mapTaskRepo(this.repo.findById(id));\n if (!result.ok) return result;\n if (!result.value) {\n return err(TaskErr.notFound(id));\n }\n return ok(result.value);\n });\n }\n\n listTasks(project: Project, filter: unknown): Result<Task[], TaskServiceError> {\n return logger.startSpan('TaskService.listTasks', () => {\n const parsed = TaskFilterSchema.safeParse(filter);\n if (!parsed.success) {\n return err(TaskErr.validation(parsed.error.message));\n }\n\n const resolvedFilter: TaskFilter = {\n ...parsed.data,\n projectId: project.id,\n };\n\n return mapTaskRepo(this.repo.findMany(resolvedFilter));\n });\n }\n\n updateTask(id: TaskId, input: unknown): Result<Task, TaskServiceError> {\n return logger.startSpan('TaskService.updateTask', () => {\n const parsed = UpdateTaskSchema.safeParse(input);\n if (!parsed.success) {\n return err(TaskErr.validation(parsed.error.message));\n }\n\n if (parsed.data.status === TaskStatus.InProgress) {\n const blockersResult = this.getDependencyService().listBlockers(id);\n if (!blockersResult.ok) return err(TaskErr.depFailed(blockersResult.error));\n const hasNonTerminalBlocker = blockersResult.value.some((b) => !isTerminalStatus(b.status));\n if (hasNonTerminalBlocker) {\n return err(TaskErr.validation('Task is blocked by unfinished dependencies'));\n }\n }\n\n const existingResult = mapTaskRepo(this.repo.findById(id));\n if (!existingResult.ok) return existingResult;\n if (!existingResult.value) {\n return err(TaskErr.notFound(id));\n }\n const existing = existingResult.value;\n\n if (parsed.data.type) {\n const newLevel = getTaskLevel(parsed.data.type);\n const oldLevel = getTaskLevel(existing.type);\n\n if (newLevel !== oldLevel) {\n if (oldLevel === TaskLevel.Release) {\n const childrenResult = mapTaskRepo(\n this.repo.findMany({\n projectId: existing.projectId,\n parentId: id,\n }),\n );\n if (childrenResult.ok && childrenResult.value.length > 0) {\n return err(\n TaskErr.validation(\n 'Cannot change type from release: task has children. Remove children first.',\n ),\n );\n }\n }\n if (newLevel === TaskLevel.Release && existing.parentId) {\n return err(TaskErr.validation('Cannot change type to release: task has a parent'));\n }\n }\n }\n\n if (parsed.data.parentId !== undefined) {\n const effectiveType = parsed.data.type ?? existing.type;\n const effectiveLevel = getTaskLevel(effectiveType);\n\n if (effectiveLevel === TaskLevel.Release && parsed.data.parentId) {\n return err(TaskErr.validation('Release tasks cannot have a parent'));\n }\n if (parsed.data.parentId) {\n const parentResult = mapTaskRepo(this.repo.findById(parsed.data.parentId));\n if (!parentResult.ok) return parentResult;\n if (!parentResult.value) {\n return err(TaskErr.notFound(parsed.data.parentId));\n }\n if (getTaskLevel(parentResult.value.type) !== TaskLevel.Release) {\n return err(TaskErr.validation('Tasks can only be children of release-level tasks'));\n }\n }\n }\n\n if (parsed.data.status && isTerminalStatus(parsed.data.status)) {\n const effectiveType = parsed.data.type ?? existing.type;\n const level = getTaskLevel(effectiveType);\n\n const updateResult = mapTaskRepo(this.repo.update(id, parsed.data));\n if (!updateResult.ok) return updateResult;\n\n if (!isTerminalStatus(existing.status)) {\n const maxRankResult = mapTaskRepo(this.repo.getMaxRankByLevel(existing.projectId, level));\n if (!maxRankResult.ok) return maxRankResult;\n const rerankResult = mapTaskRepo(this.repo.rerank(id, maxRankResult.value + RANK_GAP));\n if (!rerankResult.ok) return rerankResult;\n this.propagateParentStatus(existing);\n return rerankResult;\n }\n this.propagateParentStatus(existing);\n return updateResult;\n }\n\n const updateResult = mapTaskRepo(this.repo.update(id, parsed.data));\n if (!updateResult.ok) return updateResult;\n\n if (parsed.data.status && parsed.data.status !== existing.status) {\n this.propagateParentStatus(existing);\n }\n\n return updateResult;\n });\n }\n\n deleteTask(id: TaskId): Result<void, TaskServiceError> {\n return mapTaskRepo(this.repo.delete(id));\n }\n\n breakdownTask(parentId: TaskId, subtasks: unknown[]): Result<Task[], TaskServiceError> {\n return logger.startSpan('TaskService.breakdownTask', () => {\n const parentResult = mapTaskRepo(this.repo.findById(parentId));\n if (!parentResult.ok) return parentResult;\n if (!parentResult.value) {\n return err(TaskErr.notFound(parentId));\n }\n\n const parent = parentResult.value;\n\n if (getTaskLevel(parent.type) !== TaskLevel.Release) {\n return err(TaskErr.validation('Breakdown parent must be a release-level task'));\n }\n\n const projectResult = this.projectService.getProject(parent.projectId);\n if (!projectResult.ok) return err(TaskErr.validation(projectResult.error.message));\n const project = projectResult.value;\n\n const created: Task[] = [];\n\n for (const subtask of subtasks) {\n const parsed = CreateTaskSchema.safeParse(subtask);\n if (!parsed.success) {\n return err(TaskErr.validation(`Invalid subtask: ${parsed.error.message}`));\n }\n\n if (getTaskLevel(parsed.data.type) === TaskLevel.Release) {\n return err(TaskErr.validation(`Subtask \"${parsed.data.name}\" cannot be a release`));\n }\n\n const taskIdResult = this.projectService.nextTaskId(project);\n if (!taskIdResult.ok) return err(TaskErr.validation(taskIdResult.error.message));\n\n const result = mapTaskRepo(\n this.repo.insert(taskIdResult.value, {\n ...parsed.data,\n projectId: parent.projectId,\n parentId,\n }),\n );\n if (!result.ok) return result;\n created.push(result.value);\n }\n\n return ok(created);\n });\n }\n\n rerankTask(input: unknown, project: Project): Result<Task, TaskServiceError> {\n return logger.startSpan('TaskService.rerankTask', () => {\n const parsed = RerankTaskSchema.safeParse(input);\n if (!parsed.success) {\n return err(TaskErr.validation(parsed.error.message));\n }\n\n const { taskId, afterId, beforeId, position, top, bottom } = parsed.data;\n\n const specifiedCount =\n [afterId, beforeId, position].filter((v) => v !== undefined).length +\n (top ? 1 : 0) +\n (bottom ? 1 : 0);\n if (specifiedCount !== 1) {\n return err(\n TaskErr.validation(\n 'Exactly one of --after, --before, --position, --top, or --bottom must be specified',\n ),\n );\n }\n\n const taskResult = mapTaskRepo(this.repo.findById(taskId));\n if (!taskResult.ok) return taskResult;\n if (!taskResult.value) {\n return err(TaskErr.notFound(taskId));\n }\n const task = taskResult.value;\n\n if (isTerminalStatus(task.status)) {\n return err(\n TaskErr.validation(\n `Cannot rerank a task with status '${task.status}'. Only active tasks can be reranked.`,\n ),\n );\n }\n\n const taskLevel = getTaskLevel(task.type);\n\n const projectId = project.id;\n\n const depService = this.getDependencyService();\n const blockersResult = depService.listBlockers(taskId);\n if (!blockersResult.ok) return err(TaskErr.depFailed(blockersResult.error));\n const constrainingBlockers = blockersResult.value.filter(\n (b) => !isTerminalStatus(b.status) && b.projectId === projectId,\n );\n const dependentsResult = depService.listDependents(taskId);\n if (!dependentsResult.ok) return err(TaskErr.depFailed(dependentsResult.error));\n const constrainingDependents = dependentsResult.value.filter(\n (d) => !isTerminalStatus(d.status) && d.projectId === projectId,\n );\n\n const attempt = (): Result<number | null, TaskServiceError> => {\n const rankedResult = mapTaskRepo(\n this.repo.getRankedNonTerminalTasksByLevel(projectId, taskLevel),\n );\n if (!rankedResult.ok) return rankedResult;\n const ranked = rankedResult.value.filter((t) => t.id !== taskId);\n\n if (top === true) {\n return ok(this.computeTopRank(ranked, constrainingBlockers));\n }\n if (bottom === true) {\n const minTerminalResult = mapTaskRepo(\n this.repo.getMinTerminalRankByLevel(projectId, taskLevel),\n );\n if (!minTerminalResult.ok) return minTerminalResult;\n return ok(\n this.computeBottomRank(ranked, minTerminalResult.value, constrainingDependents),\n );\n }\n if (afterId) {\n const anchorIndex = ranked.findIndex((t) => t.id === afterId);\n const anchor = ranked[anchorIndex];\n if (!anchor) {\n return err(TaskErr.notFound(afterId));\n }\n const next = ranked[anchorIndex + 1];\n return ok(next ? midpoint(anchor.rank, next.rank) : anchor.rank + RANK_GAP);\n }\n if (beforeId) {\n const anchorIndex = ranked.findIndex((t) => t.id === beforeId);\n const anchor = ranked[anchorIndex];\n if (!anchor) {\n return err(TaskErr.notFound(beforeId));\n }\n const prev = ranked[anchorIndex - 1];\n return ok(prev ? midpoint(prev.rank, anchor.rank) : anchor.rank - RANK_GAP);\n }\n const pos = position as number;\n if (pos < 1) {\n return err(TaskErr.validation('Position must be >= 1'));\n }\n if (pos === 1) {\n return ok(this.computeTopRank(ranked));\n }\n if (pos > ranked.length) {\n const minTerminalResult = mapTaskRepo(\n this.repo.getMinTerminalRankByLevel(projectId, taskLevel),\n );\n if (!minTerminalResult.ok) return minTerminalResult;\n return ok(this.computeBottomRank(ranked, minTerminalResult.value));\n }\n const above = ranked[pos - 2];\n const below = ranked[pos - 1];\n if (!above || !below) {\n return err(TaskErr.validation('Unexpected missing neighbor tasks'));\n }\n return ok(midpoint(above.rank, below.rank));\n };\n\n let computed = attempt();\n if (!computed.ok) return computed;\n if (computed.value === null) {\n const rb = mapTaskRepo(this.repo.rebalanceByLevel(projectId, taskLevel));\n if (!rb.ok) return rb;\n computed = attempt();\n if (!computed.ok) return computed;\n if (computed.value === null) {\n return err(TaskErr.validation('Rank computation did not converge after rebalance'));\n }\n }\n const newRank = computed.value;\n\n for (const blocker of constrainingBlockers) {\n if (newRank < blocker.rank) {\n return err(\n TaskErr.validation(\n `Cannot rank above blocker \"${blocker.id}\" (${blocker.name}). Complete or remove the dependency first.`,\n ),\n );\n }\n }\n for (const dep of constrainingDependents) {\n if (newRank > dep.rank) {\n return err(\n TaskErr.validation(\n `Cannot rank below dependent \"${dep.id}\" (${dep.name}). Complete or remove the dependency first.`,\n ),\n );\n }\n }\n\n return mapTaskRepo(this.repo.rerank(taskId, newRank));\n });\n }\n\n searchTasks(query: string, project: Project): Result<SearchResult[], TaskServiceError> {\n return logger.startSpan('TaskService.searchTasks', () => {\n if (!query.trim()) {\n return err(TaskErr.validation('Search query cannot be empty'));\n }\n\n return mapTaskRepo(this.repo.search(query, project.id));\n });\n }\n\n private computeTopRank(ranked: Task[], constrainingBlockers: Task[] = []): number | null {\n if (constrainingBlockers.length > 0) {\n const highestBlocker = constrainingBlockers.reduce((a, b) => (a.rank > b.rank ? a : b));\n const idx = ranked.findIndex((t) => t.id === highestBlocker.id);\n if (idx >= 0) {\n const next = ranked[idx + 1];\n return next ? midpoint(highestBlocker.rank, next.rank) : highestBlocker.rank + RANK_GAP;\n }\n }\n const first = ranked[0];\n return first ? first.rank - RANK_GAP : RANK_GAP;\n }\n\n private computeBottomRank(\n ranked: Task[],\n minTerminal: number | null,\n constrainingDependents: Task[] = [],\n ): number | null {\n if (constrainingDependents.length > 0) {\n const lowestDependent = constrainingDependents.reduce((a, b) => (a.rank < b.rank ? a : b));\n const idx = ranked.findIndex((t) => t.id === lowestDependent.id);\n if (idx >= 0) {\n const prev = ranked[idx - 1];\n return prev ? midpoint(prev.rank, lowestDependent.rank) : lowestDependent.rank - RANK_GAP;\n }\n }\n const last = ranked[ranked.length - 1];\n if (!last) return RANK_GAP;\n return minTerminal !== null && minTerminal > last.rank\n ? midpoint(last.rank, minTerminal)\n : last.rank + RANK_GAP;\n }\n\n /** Best-effort parent status propagation; swallows repo errors. */\n private propagateParentStatus(child: Task): void {\n if (!child.parentId) return;\n\n const parentResult = this.repo.findById(child.parentId);\n if (!parentResult.ok || !parentResult.value) return;\n const parent = parentResult.value;\n\n const updatedChildResult = this.repo.findById(child.id);\n if (!updatedChildResult.ok || !updatedChildResult.value) return;\n const updatedChild = updatedChildResult.value;\n\n if (\n updatedChild.status === TaskStatus.InProgress &&\n (parent.status === TaskStatus.Backlog || parent.status === TaskStatus.Todo)\n ) {\n this.repo.update(parent.id, { status: TaskStatus.InProgress });\n return;\n }\n\n if (isTerminalStatus(updatedChild.status)) {\n const siblingsResult = this.repo.findMany({\n projectId: parent.projectId,\n parentId: parent.id,\n });\n if (!siblingsResult.ok) return;\n const allTerminal = siblingsResult.value.every((s) => isTerminalStatus(s.status));\n if (allTerminal && !isTerminalStatus(parent.status)) {\n const maxRankResult = this.repo.getMaxRankByLevel(\n parent.projectId,\n getTaskLevel(parent.type),\n );\n this.repo.update(parent.id, { status: TaskStatus.Done });\n if (maxRankResult.ok) {\n this.repo.rerank(parent.id, maxRankResult.value + RANK_GAP);\n }\n }\n }\n }\n}\n","import { z } from 'zod/v4';\nimport { DependencyType } from './enums.js';\nimport type { TaskId } from './branded.js';\nimport { taskIdField } from './id-fields.js';\n\n// Only DB-persisted types; blocked-by is resolved to blocks at the service layer.\nconst dbDepTypeValues = [\n DependencyType.Blocks,\n DependencyType.RelatesTo,\n DependencyType.Duplicates,\n] as const;\n\nexport const AddDependencySchema = z.object({\n taskId: taskIdField,\n dependsOnId: taskIdField,\n type: z.enum(dbDepTypeValues).default(DependencyType.Blocks),\n});\nexport type AddDependencyInput = z.infer<typeof AddDependencySchema>;\n\nexport const RemoveDependencySchema = z.object({\n taskId: taskIdField,\n dependsOnId: taskIdField,\n});\nexport type RemoveDependencyInput = z.infer<typeof RemoveDependencySchema>;\n\nexport interface TaskDependency {\n taskId: TaskId;\n dependsOnId: TaskId;\n type: DependencyType;\n createdAt: string;\n}\n","import type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type { Task } from '../types/task.js';\nimport type { TaskDependency } from '../types/dependency.js';\nimport { AddDependencySchema, RemoveDependencySchema } from '../types/dependency.js';\nimport type { DependencyRepository } from '../repository/dependency.repository.js';\nimport type { TaskRepository } from '../repository/task.repository.js';\nimport { logger } from '../logging/logger.js';\nimport { UIDependencyType, DependencyType } from '../types/enums.js';\nimport type { TaskId } from '../types/branded.js';\nimport type { DependencyServiceError } from './errors.js';\nimport { DepErr, mapDepRepo } from './errors.js';\n\nexport interface DependencyEdge {\n from: TaskId;\n to: TaskId;\n type: string;\n}\n\nexport interface DependencyGraph {\n nodes: Task[];\n edges: DependencyEdge[];\n mermaid: string;\n}\n\nexport interface DependencyService {\n addDependency(input: unknown): Result<TaskDependency, DependencyServiceError>;\n removeDependency(input: unknown): Result<void, DependencyServiceError>;\n /** Remove a dependency between two tasks regardless of which direction it was stored. */\n removeDependencyBetween(\n taskId: TaskId,\n otherId: TaskId,\n ): Result<void, DependencyServiceError>;\n listBlockers(taskId: TaskId): Result<Task[], DependencyServiceError>;\n listDependents(taskId: TaskId): Result<Task[], DependencyServiceError>;\n listRelated(taskId: TaskId): Result<Task[], DependencyServiceError>;\n listDuplicates(taskId: TaskId): Result<Task[], DependencyServiceError>;\n listAllDeps(taskId: TaskId): Result<TaskDependency[], DependencyServiceError>;\n getTransitiveDeps(taskId: TaskId): Result<Task[], DependencyServiceError>;\n buildGraph(taskId: TaskId): Result<DependencyGraph, DependencyServiceError>;\n}\n\nexport class DependencyServiceImpl implements DependencyService {\n constructor(\n private readonly depRepo: DependencyRepository,\n private readonly taskRepo: TaskRepository,\n ) {}\n\n private requireTask(taskId: TaskId): Result<Task, DependencyServiceError> {\n const result = mapDepRepo(this.taskRepo.findById(taskId));\n if (!result.ok) return result;\n if (!result.value) {\n return err(DepErr.taskNotFound(taskId));\n }\n return ok(result.value);\n }\n\n addDependency(input: unknown): Result<TaskDependency, DependencyServiceError> {\n return logger.startSpan('DependencyService.addDependency', () => {\n const normalized = normalizeBlockedBy(input);\n const parsed = AddDependencySchema.safeParse(normalized);\n if (!parsed.success) {\n return err(DepErr.validation(parsed.error.message));\n }\n\n const { taskId, dependsOnId, type } = parsed.data;\n\n const taskResult = this.requireTask(taskId);\n if (!taskResult.ok) return taskResult;\n\n const depResult = this.requireTask(dependsOnId);\n if (!depResult.ok) return depResult;\n\n const cycleResult = mapDepRepo(this.depRepo.wouldCreateCycle(taskId, dependsOnId));\n if (!cycleResult.ok) return cycleResult;\n if (cycleResult.value) {\n return err(DepErr.cycle(taskId, dependsOnId));\n }\n\n return mapDepRepo(this.depRepo.insert(taskId, dependsOnId, type));\n });\n }\n\n removeDependency(input: unknown): Result<void, DependencyServiceError> {\n return logger.startSpan('DependencyService.removeDependency', () => {\n const parsed = RemoveDependencySchema.safeParse(input);\n if (!parsed.success) {\n return err(DepErr.validation(parsed.error.message));\n }\n return mapDepRepo(this.depRepo.delete(parsed.data.taskId, parsed.data.dependsOnId));\n });\n }\n\n removeDependencyBetween(taskId: TaskId, otherId: TaskId): Result<void, DependencyServiceError> {\n return logger.startSpan('DependencyService.removeDependencyBetween', () => {\n const forward = mapDepRepo(this.depRepo.delete(taskId, otherId));\n if (forward.ok) return forward;\n return mapDepRepo(this.depRepo.delete(otherId, taskId));\n });\n }\n\n listBlockers(taskId: TaskId): Result<Task[], DependencyServiceError> {\n return mapDepRepo(this.depRepo.getBlockers(taskId));\n }\n\n listDependents(taskId: TaskId): Result<Task[], DependencyServiceError> {\n return mapDepRepo(this.depRepo.getDependents(taskId));\n }\n\n listRelated(taskId: TaskId): Result<Task[], DependencyServiceError> {\n return mapDepRepo(this.depRepo.getRelated(taskId));\n }\n\n listDuplicates(taskId: TaskId): Result<Task[], DependencyServiceError> {\n return mapDepRepo(this.depRepo.getDuplicates(taskId));\n }\n\n listAllDeps(taskId: TaskId): Result<TaskDependency[], DependencyServiceError> {\n return mapDepRepo(this.depRepo.findByTask(taskId));\n }\n\n getTransitiveDeps(taskId: TaskId): Result<Task[], DependencyServiceError> {\n return mapDepRepo(this.depRepo.getTransitiveClosure(taskId));\n }\n\n buildGraph(taskId: TaskId): Result<DependencyGraph, DependencyServiceError> {\n return logger.startSpan('DependencyService.buildGraph', () => {\n const taskResult = mapDepRepo(this.taskRepo.findById(taskId));\n if (!taskResult.ok) return taskResult;\n if (!taskResult.value) {\n return err(DepErr.taskNotFound(taskId));\n }\n const rootTask = taskResult.value;\n\n const visited = new Map<TaskId, Task>();\n const allEdges: DependencyEdge[] = [];\n const queue: TaskId[] = [taskId];\n visited.set(taskId, rootTask);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) break;\n\n const blockersResult = mapDepRepo(this.depRepo.findByTask(current));\n if (!blockersResult.ok) return blockersResult;\n for (const dep of blockersResult.value) {\n allEdges.push({ from: dep.taskId, to: dep.dependsOnId, type: dep.type });\n if (!visited.has(dep.dependsOnId)) {\n const t = mapDepRepo(this.taskRepo.findById(dep.dependsOnId));\n if (!t.ok) return t;\n if (t.value) {\n visited.set(dep.dependsOnId, t.value);\n queue.push(dep.dependsOnId);\n }\n }\n }\n\n const dependentsResult = mapDepRepo(this.depRepo.findDependents(current));\n if (!dependentsResult.ok) return dependentsResult;\n for (const dep of dependentsResult.value) {\n allEdges.push({ from: dep.taskId, to: dep.dependsOnId, type: dep.type });\n if (!visited.has(dep.taskId)) {\n const t = mapDepRepo(this.taskRepo.findById(dep.taskId));\n if (!t.ok) return t;\n if (t.value) {\n visited.set(dep.taskId, t.value);\n queue.push(dep.taskId);\n }\n }\n }\n }\n\n const edgeSet = new Set<string>();\n const uniqueEdges: DependencyEdge[] = [];\n for (const edge of allEdges) {\n const key = `${edge.from}->${edge.to}`;\n if (!edgeSet.has(key)) {\n edgeSet.add(key);\n uniqueEdges.push(edge);\n }\n }\n\n const nodes = Array.from(visited.values());\n const mermaid = this.toMermaid(nodes, uniqueEdges, taskId);\n\n return ok({ nodes, edges: uniqueEdges, mermaid });\n });\n }\n\n private toMermaid(nodes: Task[], edges: DependencyEdge[], highlightId: TaskId): string {\n const lines: string[] = ['graph LR'];\n\n for (const node of nodes) {\n const label = `${node.id}: ${node.name} [${node.status}]`;\n const escaped = label.replace(/\"/g, '#quot;');\n if (node.id === highlightId) {\n lines.push(` ${node.id}(\"${escaped}\"):::highlight`);\n } else {\n lines.push(` ${node.id}[\"${escaped}\"]`);\n }\n }\n\n for (const edge of edges) {\n const label = edge.type === 'blocks' ? 'blocks' : edge.type;\n lines.push(` ${edge.from} -->|${label}| ${edge.to}`);\n }\n\n lines.push(' classDef highlight fill:#f9f,stroke:#333,stroke-width:2px');\n\n return lines.join('\\n');\n }\n}\n\nfunction normalizeBlockedBy(input: unknown): unknown {\n if (\n typeof input === 'object' &&\n input !== null &&\n 'type' in input &&\n (input as Record<string, unknown>).type === UIDependencyType.BlockedBy\n ) {\n const { taskId, dependsOnId, ...rest } = input as Record<string, unknown>;\n return { ...rest, taskId: dependsOnId, dependsOnId: taskId, type: DependencyType.Blocks };\n }\n return input;\n}\n","import { z } from 'zod/v4';\nimport type { TaskId } from './branded.js';\n\n// ── Export types ──────────────────────────────────────────────────────\n\nexport interface ExportTask {\n id: TaskId;\n name: string;\n description: string;\n type: string;\n status: string;\n parentId: TaskId | null;\n technicalNotes: string;\n additionalRequirements: string;\n rank: number;\n}\n\nexport interface ExportDependency {\n taskId: TaskId;\n dependsOnId: TaskId;\n type: string;\n}\n\nexport interface ExportData {\n version: 1;\n exportedAt: string;\n tasks: ExportTask[];\n dependencies: ExportDependency[];\n}\n\n// ── Import types ──────────────────────────────────────────────────────\n\n/** Loose schema: tasks/dependencies are arbitrary objects to allow field mapping. */\nexport const ImportFileSchema = z.object({\n version: z.number().optional(),\n tasks: z.array(z.record(z.string(), z.unknown())).min(1, 'At least one task is required'),\n dependencies: z.array(z.record(z.string(), z.unknown())).optional().default([]),\n});\nexport type ImportFile = z.infer<typeof ImportFileSchema>;\n\n/** Map from source field name → our field name. */\nexport type FieldMapping = Map<string, string>;\n\nexport interface ImportResult {\n imported: number;\n dependencies: number;\n idMap: Record<string, string>;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\n/**\n * Parse a comma-separated \"source:target\" mapping string.\n * Example: \"title:name,summary:description,key:id\"\n */\nexport function parseFieldMapping(raw: string): FieldMapping {\n const mapping = new Map<string, string>();\n for (const pair of raw.split(',')) {\n const parts = pair.split(':').map((s) => s.trim());\n if (parts.length === 2 && parts[0] && parts[1]) {\n mapping.set(parts[0], parts[1]);\n }\n }\n return mapping;\n}\n","import type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type {\n ExportData,\n ExportTask,\n ExportDependency,\n FieldMapping,\n ImportResult,\n} from '../types/portability.js';\nimport { ImportFileSchema } from '../types/portability.js';\nimport type { TaskId } from '../types/branded.js';\nimport type { TaskService } from './task.service.js';\nimport type { DependencyService } from './dependency.service.js';\nimport type { Project } from '../types/project.js';\nimport { logger } from '../logging/logger.js';\nimport type { PortabilityServiceError } from './errors.js';\nimport { PortabilityErr } from './errors.js';\n\n// ── Internal mapped types ─────────────────────────────────────────────\n\ninterface MappedTask {\n sourceId: string;\n name: string;\n description: string;\n type: string;\n status: string;\n parentId: string | null;\n technicalNotes: string;\n additionalRequirements: string;\n}\n\ninterface MappedDependency {\n sourceTaskId: string;\n sourceDependsOnId: string;\n type: string;\n}\n\n// ── Service interface ─────────────────────────────────────────────────\n\nexport interface PortabilityService {\n exportTasks(project: Project): Result<ExportData, PortabilityServiceError>;\n importTasks(\n fileData: unknown,\n project: Project,\n fieldMapping?: FieldMapping,\n ): Result<ImportResult, PortabilityServiceError>;\n}\n\n// ── Implementation ────────────────────────────────────────────────────\n\nexport class PortabilityServiceImpl implements PortabilityService {\n constructor(\n private readonly taskService: TaskService,\n private readonly depService: DependencyService,\n ) {}\n\n exportTasks(project: Project): Result<ExportData, PortabilityServiceError> {\n return logger.startSpan('PortabilityService.exportTasks', () => {\n const tasksResult = this.taskService.listTasks(project, {});\n if (!tasksResult.ok) return err(PortabilityErr.taskService(tasksResult.error));\n const tasks = tasksResult.value;\n\n const taskIds = new Set(tasks.map((t) => t.id));\n\n const exportTasks: ExportTask[] = tasks.map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description,\n type: t.type,\n status: t.status,\n parentId: t.parentId,\n technicalNotes: t.technicalNotes,\n additionalRequirements: t.additionalRequirements,\n rank: t.rank,\n }));\n\n // Collect dependencies where both ends belong to this project\n const allDeps: ExportDependency[] = [];\n for (const task of tasks) {\n const depsResult = this.depService.listAllDeps(task.id);\n if (!depsResult.ok) return err(PortabilityErr.depService(depsResult.error));\n for (const dep of depsResult.value) {\n if (taskIds.has(dep.dependsOnId)) {\n allDeps.push({\n taskId: dep.taskId,\n dependsOnId: dep.dependsOnId,\n type: dep.type,\n });\n }\n }\n }\n\n logger.info('Exported tasks', {\n project: project.key,\n tasks: tasks.length,\n dependencies: allDeps.length,\n });\n\n return ok({\n version: 1 as const,\n exportedAt: new Date().toISOString(),\n tasks: exportTasks,\n dependencies: allDeps,\n });\n });\n }\n\n importTasks(\n fileData: unknown,\n project: Project,\n fieldMapping?: FieldMapping,\n ): Result<ImportResult, PortabilityServiceError> {\n return logger.startSpan('PortabilityService.importTasks', () => {\n const parsed = ImportFileSchema.safeParse(fileData);\n if (!parsed.success) {\n return err(PortabilityErr.validation(parsed.error.message));\n }\n\n const reverseMap = this.buildReverseMap(fieldMapping);\n\n const mappedTasks: MappedTask[] = [];\n for (const sourceTask of parsed.data.tasks) {\n const mapped = this.mapTaskFields(sourceTask, reverseMap);\n if (!mapped.ok) return mapped;\n mappedTasks.push(mapped.value);\n }\n\n const mappedDeps: MappedDependency[] = [];\n for (const sourceDep of parsed.data.dependencies) {\n const mapped = this.mapDependencyFields(sourceDep, reverseMap);\n if (!mapped.ok) return mapped;\n mappedDeps.push(mapped.value);\n }\n\n const sorted = this.topoSortByParent(mappedTasks);\n\n // sourceId is foreign (from the import file); newId is our branded\n // `TaskId`, returned from the repository on insert.\n const idMap = new Map<string, TaskId>();\n for (const task of sorted) {\n let parentId: string | undefined;\n if (task.parentId) {\n parentId = idMap.get(task.parentId) ?? task.parentId;\n }\n\n const createResult = this.taskService.createTask(\n {\n name: task.name,\n description: task.description || undefined,\n type: task.type || undefined,\n status: task.status || undefined,\n parentId,\n technicalNotes: task.technicalNotes || undefined,\n additionalRequirements: task.additionalRequirements || undefined,\n },\n project,\n );\n if (!createResult.ok) return err(PortabilityErr.taskService(createResult.error));\n\n idMap.set(task.sourceId, createResult.value.id);\n logger.info('Imported task', {\n sourceId: task.sourceId,\n newId: createResult.value.id,\n });\n }\n\n let depCount = 0;\n for (const dep of mappedDeps) {\n const taskId = idMap.get(dep.sourceTaskId) ?? dep.sourceTaskId;\n const dependsOnId = idMap.get(dep.sourceDependsOnId) ?? dep.sourceDependsOnId;\n\n const depResult = this.depService.addDependency({\n taskId,\n dependsOnId,\n type: dep.type || undefined,\n });\n if (!depResult.ok) return err(PortabilityErr.depService(depResult.error));\n\n depCount++;\n logger.info('Imported dependency', { from: taskId, to: dependsOnId });\n }\n\n const idMapObj: Record<string, string> = {};\n for (const [k, v] of idMap) {\n idMapObj[k] = v;\n }\n\n logger.info('Import completed', {\n tasks: mappedTasks.length,\n dependencies: depCount,\n });\n\n return ok({\n imported: mappedTasks.length,\n dependencies: depCount,\n idMap: idMapObj,\n });\n });\n }\n\n // ── Private helpers ───────────────────────────────────────────────\n\n private buildReverseMap(fieldMapping?: FieldMapping): Map<string, string> {\n const reverse = new Map<string, string>();\n if (!fieldMapping) return reverse;\n for (const [source, target] of fieldMapping) {\n reverse.set(target, source);\n }\n return reverse;\n }\n\n private getField(\n source: Record<string, unknown>,\n field: string,\n reverseMap: Map<string, string>,\n ): string {\n const sourceField = reverseMap.get(field) ?? field;\n const value = source[sourceField];\n if (value == null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return `${value}`;\n return JSON.stringify(value);\n }\n\n private mapTaskFields(\n source: Record<string, unknown>,\n reverseMap: Map<string, string>,\n ): Result<MappedTask, PortabilityServiceError> {\n const sourceId = this.getField(source, 'id', reverseMap);\n const name = this.getField(source, 'name', reverseMap);\n\n if (!sourceId) {\n return err(PortabilityErr.validation('Each imported task must have an id'));\n }\n if (!name) {\n return err(\n PortabilityErr.validation(\n `Imported task '${sourceId}' is missing required field 'name'`,\n ),\n );\n }\n\n return ok({\n sourceId,\n name,\n description: this.getField(source, 'description', reverseMap),\n type: this.getField(source, 'type', reverseMap),\n status: this.getField(source, 'status', reverseMap),\n parentId: this.getField(source, 'parentId', reverseMap) || null,\n technicalNotes: this.getField(source, 'technicalNotes', reverseMap),\n additionalRequirements: this.getField(source, 'additionalRequirements', reverseMap),\n });\n }\n\n private mapDependencyFields(\n source: Record<string, unknown>,\n reverseMap: Map<string, string>,\n ): Result<MappedDependency, PortabilityServiceError> {\n const taskId = this.getField(source, 'taskId', reverseMap);\n const dependsOnId = this.getField(source, 'dependsOnId', reverseMap);\n\n if (!taskId || !dependsOnId) {\n return err(PortabilityErr.validation('Each dependency must have taskId and dependsOnId'));\n }\n\n return ok({\n sourceTaskId: taskId,\n sourceDependsOnId: dependsOnId,\n type: this.getField(source, 'type', reverseMap),\n });\n }\n\n /**\n * Sort tasks so parents come before children within the import set.\n * Tasks whose parentId is outside the import set are treated as roots.\n */\n private topoSortByParent(tasks: MappedTask[]): MappedTask[] {\n const sourceIds = new Set(tasks.map((t) => t.sourceId));\n const sorted: MappedTask[] = [];\n const remaining = new Set(tasks);\n const created = new Set<string>();\n\n while (remaining.size > 0) {\n const batch: MappedTask[] = [];\n for (const task of remaining) {\n const parentInImport = task.parentId !== null && sourceIds.has(task.parentId);\n if (!parentInImport || (task.parentId !== null && created.has(task.parentId))) {\n batch.push(task);\n }\n }\n\n if (batch.length === 0) {\n logger.warn('Circular parent references detected during import, forcing remaining tasks');\n for (const t of remaining) {\n sorted.push(t);\n }\n break;\n }\n\n for (const t of batch) {\n remaining.delete(t);\n created.add(t.sourceId);\n sorted.push(t);\n }\n }\n\n return sorted;\n }\n}\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport { trace } from '@opentelemetry/api';\nimport type { Result, FetchFn } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport { logger } from '../logging/logger.js';\nimport { isNewerVersion } from '../utils/version.js';\nimport type { UpdateServiceError } from './errors.js';\nimport { UpdateErr } from './errors.js';\n\nfunction toMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\nexport { isNewerVersion };\n\nconst NPM_REGISTRY_URL = 'https://registry.npmjs.org/@tomkapa/tayto/latest';\nconst PACKAGE_NAME = '@tomkapa/tayto';\nconst CHECK_TTL_MS = 24 * 60 * 60 * 1000; // 1 day\n\nexport interface UpdateCheckResult {\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n}\n\ninterface UpdateCache {\n checkedAt: number;\n latestVersion: string;\n}\n\nexport interface UpdateService {\n checkForUpdate(currentVersion: string): Promise<Result<UpdateCheckResult, UpdateServiceError>>;\n performUpgrade(\n currentVersion: string,\n ): Result<{ installedVersion: string }, UpdateServiceError>;\n}\n\n/** Type guard for parsed cache JSON. */\nfunction isValidCache(value: unknown): value is UpdateCache {\n if (typeof value !== 'object' || value === null) return false;\n const obj = value as Record<string, unknown>;\n return typeof obj['checkedAt'] === 'number' && typeof obj['latestVersion'] === 'string';\n}\n\nexport type { FetchFn } from '../types/common.js';\nexport type ExecFn = (cmd: string, args: string[]) => void;\n\nfunction defaultExec(cmd: string, args: string[]): void {\n execFileSync(cmd, args, { stdio: 'inherit', timeout: 60000 });\n}\n\nconst tracer = trace.getTracer('task');\n\nexport class UpdateServiceImpl implements UpdateService {\n constructor(\n private readonly cachePath: string,\n private readonly fetchImpl: FetchFn = globalThis.fetch,\n private readonly execImpl: ExecFn = defaultExec,\n ) {}\n\n async checkForUpdate(\n currentVersion: string,\n ): Promise<Result<UpdateCheckResult, UpdateServiceError>> {\n return tracer.startActiveSpan('UpdateService.checkForUpdate', async (span) => {\n try {\n span.setAttribute('update.current_version', currentVersion);\n\n // Read cache\n const cached = this.readCache();\n if (cached && Date.now() - cached.checkedAt < CHECK_TTL_MS) {\n span.setAttribute('update.cache_hit', true);\n const updateAvailable = isNewerVersion(cached.latestVersion, currentVersion);\n span.setAttribute('update.latest_version', cached.latestVersion);\n span.setAttribute('update.available', updateAvailable);\n return ok({ currentVersion, latestVersion: cached.latestVersion, updateAvailable });\n }\n\n span.setAttribute('update.cache_hit', false);\n\n // Fetch from registry\n let latestVersion: string;\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, 5000);\n try {\n const response = await this.fetchImpl(NPM_REGISTRY_URL, { signal: controller.signal });\n\n if (!response.ok) {\n logger.warn('Update check: registry returned non-OK status', {\n status: response.status,\n });\n return err(\n UpdateErr.network(`npm registry returned status ${String(response.status)}`),\n );\n }\n\n const body = (await response.json()) as Record<string, unknown>;\n if (typeof body['version'] !== 'string') {\n return err(UpdateErr.parseFailure('Unexpected response format from npm registry'));\n }\n latestVersion = body['version'];\n } catch (e: unknown) {\n logger.warn('Update check: fetch failed', { error: toMessage(e) });\n return err(UpdateErr.network(`Failed to check for updates: ${toMessage(e)}`));\n } finally {\n clearTimeout(timeout);\n }\n\n // Write cache\n this.writeCache({ checkedAt: Date.now(), latestVersion });\n\n const updateAvailable = isNewerVersion(latestVersion, currentVersion);\n span.setAttribute('update.latest_version', latestVersion);\n span.setAttribute('update.available', updateAvailable);\n return ok({ currentVersion, latestVersion, updateAvailable });\n } finally {\n span.end();\n }\n });\n }\n\n performUpgrade(\n currentVersion: string,\n ): Result<{ installedVersion: string }, UpdateServiceError> {\n return logger.startSpan('UpdateService.performUpgrade', (span) => {\n span.setAttribute('update.previous_version', currentVersion);\n try {\n this.execImpl('npm', ['install', '-g', `${PACKAGE_NAME}@latest`]);\n } catch (e: unknown) {\n logger.error('Upgrade failed', e, { command: `npm install -g ${PACKAGE_NAME}@latest` });\n span.setAttribute('update.success', false);\n return err(UpdateErr.upgradeFailed(`Upgrade failed: ${toMessage(e)}`));\n }\n\n // Read the newly installed version from the registry cache\n const cached = this.readCache();\n const installedVersion = cached?.latestVersion ?? 'unknown';\n span.setAttribute('update.success', true);\n span.setAttribute('update.installed_version', installedVersion);\n\n // Invalidate cache so next check fetches fresh\n this.writeCache({ checkedAt: 0, latestVersion: installedVersion });\n\n return ok({ installedVersion });\n });\n }\n\n private readCache(): UpdateCache | null {\n try {\n const raw = readFileSync(this.cachePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n return isValidCache(parsed) ? parsed : null;\n } catch (e: unknown) {\n logger.info('Update cache not available', {\n error: toMessage(e),\n });\n return null;\n }\n }\n\n private writeCache(entry: UpdateCache): void {\n try {\n // Merge with existing content to preserve fields written by other utilities\n // (e.g. changelogSeenVersion written by changelog-seen.ts).\n let existing: Record<string, unknown> = {};\n try {\n const raw = readFileSync(this.cachePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed === 'object' && parsed !== null) {\n existing = parsed as Record<string, unknown>;\n }\n } catch {\n // File absent or malformed — start fresh\n }\n writeFileSync(this.cachePath, JSON.stringify({ ...existing, ...entry }), 'utf-8');\n } catch (e: unknown) {\n logger.warn('Failed to write update cache', {\n error: toMessage(e),\n });\n }\n }\n}\n","import { z } from 'zod/v4';\nimport type { TaskStatus, TaskType } from './enums.js';\n\nexport const SummaryQuerySchema = z.object({\n period: z.enum(['day', 'week']),\n});\nexport type SummaryQuery = z.infer<typeof SummaryQuerySchema>;\n\nexport const CompletedQuerySchema = z.object({\n since: z.string().min(1),\n});\nexport type CompletedQuery = z.infer<typeof CompletedQuerySchema>;\n\nexport interface AnalyticSummary {\n period: 'day' | 'week';\n windowStart: string;\n windowEnd: string;\n completed: { total: number; byType: Record<TaskType, number> };\n created: { total: number; byType: Record<TaskType, number> };\n current: {\n total: number;\n byStatus: Record<TaskStatus, number>;\n byType: Record<TaskType, number>;\n };\n backlogDelta: number;\n throughputPerDay: number;\n}\n","import type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\n\nexport type Milliseconds = number;\n\n/**\n * Narrow tagged error returned by `parseDuration`. Callers translate this\n * into their module's error union.\n */\nexport interface DurationParseError {\n readonly kind: 'validation';\n readonly detail: string;\n readonly message: string;\n}\n\ntype DurationUnit = 'm' | 'h' | 'd' | 'w';\n\nconst UNIT_MS: Record<DurationUnit, number> = {\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n w: 7 * 24 * 60 * 60 * 1000,\n};\n\nconst MAX_MS = 365 * 24 * 60 * 60 * 1000;\n\nfunction validation(detail: string): DurationParseError {\n return { kind: 'validation', detail, message: detail };\n}\n\nexport function parseDuration(input: string): Result<Milliseconds, DurationParseError> {\n const match = /^(\\d+)([mhdw])$/.exec(input);\n if (!match) {\n return err(\n validation(\n `Invalid duration: \"${input}\". Format: <positive integer><unit> where unit ∈ m|h|d|w`,\n ),\n );\n }\n const value = parseInt(match[1] as string, 10);\n if (value === 0) {\n return err(validation(`Duration must be positive: \"${input}\"`));\n }\n const ms = value * UNIT_MS[match[2] as DurationUnit];\n if (ms > MAX_MS) {\n return err(validation(`Duration \"${input}\" exceeds the maximum of 365 days`));\n }\n return ok(ms);\n}\n","import type { Result } from '../types/common.js';\nimport { ok, err } from '../types/common.js';\nimport type { Task } from '../types/task.js';\nimport type { Project } from '../types/project.js';\nimport { TaskStatus, TaskType } from '../types/enums.js';\nimport { SummaryQuerySchema, CompletedQuerySchema } from '../types/analytic.js';\nimport type { AnalyticSummary } from '../types/analytic.js';\nimport type { TaskRepository } from '../repository/task.repository.js';\nimport { parseDuration } from '../utils/duration.js';\nimport { logger } from '../logging/logger.js';\nimport type { AnalyticServiceError } from './errors.js';\nimport { AnalyticErr, mapAnalyticRepo } from './errors.js';\n\nexport interface AnalyticService {\n summary(input: unknown, project: Project): Result<AnalyticSummary, AnalyticServiceError>;\n listCompleted(input: unknown, project: Project): Result<Task[], AnalyticServiceError>;\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nconst PERIOD_MS: Record<'day' | 'week', number> = {\n day: DAY_MS,\n week: 7 * DAY_MS,\n};\n\nconst ZERO_BY_TYPE = Object.fromEntries(Object.values(TaskType).map((t) => [t, 0])) as Record<\n TaskType,\n number\n>;\n\nconst ZERO_BY_STATUS = Object.fromEntries(Object.values(TaskStatus).map((s) => [s, 0])) as Record<\n TaskStatus,\n number\n>;\n\nexport class AnalyticServiceImpl implements AnalyticService {\n constructor(private readonly repo: TaskRepository) {}\n\n summary(input: unknown, project: Project): Result<AnalyticSummary, AnalyticServiceError> {\n return logger.startSpan('AnalyticService.summary', () => {\n const parsed = SummaryQuerySchema.safeParse(input);\n if (!parsed.success) {\n return err(AnalyticErr.validation(parsed.error.message));\n }\n const { period } = parsed.data;\n const periodMs = PERIOD_MS[period];\n const now = Date.now();\n const windowStart = new Date(now - periodMs).toISOString();\n const windowEnd = new Date(now).toISOString();\n\n const completedResult = mapAnalyticRepo(this.repo.countCompletedSince(project.id, windowStart));\n if (!completedResult.ok) return completedResult;\n\n const createdResult = mapAnalyticRepo(this.repo.countCreatedSince(project.id, windowStart));\n if (!createdResult.ok) return createdResult;\n\n const currentResult = mapAnalyticRepo(this.repo.countCurrent(project.id));\n if (!currentResult.ok) return currentResult;\n\n const completedTotal = completedResult.value.total;\n const createdTotal = createdResult.value.total;\n\n return ok({\n period,\n windowStart,\n windowEnd,\n completed: {\n total: completedTotal,\n byType: { ...ZERO_BY_TYPE, ...completedResult.value.byType },\n },\n created: {\n total: createdTotal,\n byType: { ...ZERO_BY_TYPE, ...createdResult.value.byType },\n },\n current: {\n total: currentResult.value.total,\n byStatus: { ...ZERO_BY_STATUS, ...currentResult.value.byStatus },\n byType: { ...ZERO_BY_TYPE, ...currentResult.value.byType },\n },\n backlogDelta: createdTotal - completedTotal,\n throughputPerDay: completedTotal / (periodMs / DAY_MS),\n });\n });\n }\n\n listCompleted(input: unknown, project: Project): Result<Task[], AnalyticServiceError> {\n return logger.startSpan('AnalyticService.listCompleted', () => {\n const parsed = CompletedQuerySchema.safeParse(input);\n if (!parsed.success) {\n return err(AnalyticErr.validation(parsed.error.message));\n }\n const durationResult = parseDuration(parsed.data.since);\n if (!durationResult.ok) {\n return err(AnalyticErr.validation(durationResult.error.detail));\n }\n\n const windowStart = new Date(Date.now() - durationResult.value).toISOString();\n return mapAnalyticRepo(this.repo.findCompletedSince(project.id, windowStart));\n });\n }\n}\n","import assert from 'node:assert';\nimport type { Brand } from '../types/branded.js';\n\nexport type { Brand };\n\n/**\n * Bounded relevance score for search hits. `0` means \"no match\", `1` the\n * best match. Normalizing at the boundary prevents backend-specific\n * ranking semantics (sqlite's BM25, Postgres' ts_rank, HTTP backend's\n * custom ranker) from leaking to callers.\n */\nexport type Relevance = Brand<number, 'Relevance'>;\n\nexport const Relevance = {\n of(raw: number): Relevance {\n // Programmer error: the sqlite impl must only emit normalized values.\n assert(\n Number.isFinite(raw) && raw >= 0 && raw <= 1,\n `Relevance out of range [0,1]: ${raw}`,\n );\n return raw as Relevance;\n },\n zero: 0 as Relevance,\n one: 1 as Relevance,\n} as const;\n","/**\n * Time source for repository writes. A fake clock in tests eliminates\n * flakiness from real time drift; in production the system clock is fine.\n */\nexport interface Clock {\n now(): Date;\n nowIso(): string;\n}\n\nexport const systemClock: Clock = {\n now: () => new Date(),\n nowIso: () => new Date().toISOString(),\n};\n","// Guards the repository-interface contract. An HTTP backend cannot stream\n// unbounded results, and a sqlite cursor backed by user input must still\n// fail fast on degenerate queries.\nexport const MAX_SEARCH_RESULTS = 200;\n\n// Guards arbitrary list reads from blowing up when a caller forgets to scope.\n// Large enough that legitimate single-project listings pass; small enough\n// that a forgotten filter stops at the boundary.\nexport const MAX_FIND_MANY = 1000;\n\n// Cap on writes per withTransaction callback. An HTTP backend can map this\n// to a batch-size limit; a sqlite backend keeps the transaction duration\n// bounded so other callers do not starve on the write lock.\nexport const MAX_TXN_OPS = 500;\n\n// Characters. FTS5 MATCH queries past this length are almost certainly\n// misuse; the parameter reaches user input.\nexport const SEARCH_QUERY_LEN = 256;\n","import type { DatabaseSync } from 'node:sqlite';\nimport assert from 'node:assert';\nimport type { Result } from '../../types/common.js';\nimport type { RepositorySet } from '../repository-set.js';\nimport type { RepositoryError } from '../errors.js';\nimport { type Clock, systemClock } from '../clock.js';\nimport { SqliteTaskRepository } from './task.repo.js';\nimport { SqliteProjectRepository } from './project.repo.js';\nimport { SqliteDependencyRepository } from './dependency.repo.js';\nimport { type TxnState, newTxnState } from './txn.js';\n\nexport interface SqliteRepositorySetOptions {\n clock?: Clock;\n}\n\n/**\n * Construct the sqlite-backed `RepositorySet`. The resulting set exposes\n * the three repositories and the single `withTransaction` entry point.\n *\n * `clock` defaults to the system clock; tests pass a fake clock.\n *\n * The caller owns the `DatabaseSync` lifecycle — migrations must have\n * been applied before the set is used. `close()` on the set closes the\n * underlying database.\n */\nexport function createSqliteRepositorySet(\n db: DatabaseSync,\n options: SqliteRepositorySetOptions = {},\n): RepositorySet {\n const clock = options.clock ?? systemClock;\n const rootTxn: TxnState = newTxnState();\n return new SqliteRepositorySet(db, clock, rootTxn);\n}\n\nclass SqliteRepositorySet implements RepositorySet {\n readonly tasks: SqliteTaskRepository;\n readonly projects: SqliteProjectRepository;\n readonly dependencies: SqliteDependencyRepository;\n\n constructor(\n private readonly db: DatabaseSync,\n private readonly clock: Clock,\n private readonly txn: TxnState,\n ) {\n this.tasks = new SqliteTaskRepository(db, clock, txn);\n this.projects = new SqliteProjectRepository(db, clock, txn);\n this.dependencies = new SqliteDependencyRepository(db, clock, txn);\n }\n\n withTransaction<T, E>(fn: (set: RepositorySet) => Result<T, E>): Result<T, E | RepositoryError> {\n assert(!this.txn.active, 'withTransaction: nested transactions are not supported');\n\n const childTxn: TxnState = { active: true, writes: 0 };\n const child = new SqliteRepositorySet(this.db, this.clock, childTxn);\n\n this.db.exec('BEGIN');\n let result: Result<T, E | RepositoryError>;\n try {\n result = fn(child);\n } catch (e) {\n // Assertions and unexpected throws must leave the DB in a clean\n // state. Roll back, then re-throw — the supervisor (CLI entry or\n // future daemon) restarts the process.\n try {\n this.db.exec('ROLLBACK');\n } catch {\n // Already rolled back; swallow so the original cause surfaces.\n }\n throw e;\n }\n\n if (result.ok) {\n this.db.exec('COMMIT');\n } else {\n this.db.exec('ROLLBACK');\n }\n return result;\n }\n\n close(): void {\n this.db.close();\n }\n}\n","import type { DatabaseSync } from 'node:sqlite';\nimport assert from 'node:assert';\nimport type { Result } from '../../types/common.js';\nimport { ok, err } from '../../types/common.js';\nimport type { Task, CreateTaskInput, UpdateTaskInput, TaskFilter } from '../../types/task.js';\nimport type { TaskLevel } from '../../types/enums.js';\nimport {\n RANK_GAP,\n TERMINAL_STATUSES,\n getTaskLevel,\n midpoint,\n WORK_TYPES,\n} from '../../types/enums.js';\nimport { parseSearchQuery } from '../../utils/search-parser.js';\nimport type { TaskId, ProjectId } from '../../types/branded.js';\nimport type {\n TaskRepository,\n SearchResult,\n TypeCounts,\n CurrentCounts,\n} from '../task.repository.js';\nimport type { RepositoryError } from '../errors.js';\nimport { Relevance } from '../relevance.js';\nimport { MAX_FIND_MANY, MAX_SEARCH_RESULTS, SEARCH_QUERY_LEN } from '../limits.js';\nimport type { Clock } from '../clock.js';\nimport { NOT_DELETED, type TaskRow, rowToTask } from './row-mappers.js';\nimport { repoSpan } from './span.js';\nimport { type TxnState, bumpWrite } from './txn.js';\n\nconst TERMINAL_STATUS_ARRAY = [...TERMINAL_STATUSES];\nconst TERMINAL_PLACEHOLDERS = TERMINAL_STATUS_ARRAY.map(() => '?').join(', ');\n\nfunction toTypeCounts(rows: Array<{ type: string; n: number }>): TypeCounts {\n const byType: Record<string, number> = {};\n let total = 0;\n for (const row of rows) {\n byType[row.type] = row.n;\n total += row.n;\n }\n return { byType, total };\n}\n\nfunction isUniqueConstraint(e: unknown): e is Error {\n return e instanceof Error && e.message.includes('UNIQUE constraint');\n}\n\nfunction transientFrom(e: unknown, op: string): RepositoryError {\n const detail = e instanceof Error ? e.message : String(e);\n return {\n kind: 'transient',\n cause: 'io',\n retryable: true,\n detail: `${op}: ${detail}`,\n };\n}\n\nexport class SqliteTaskRepository implements TaskRepository {\n constructor(\n private readonly db: DatabaseSync,\n private readonly clock: Clock,\n private readonly txn: TxnState,\n ) {}\n\n insert(\n id: TaskId,\n input: CreateTaskInput & { projectId: ProjectId },\n ): Result<Task, RepositoryError> {\n return repoSpan('task', 'insert', () => {\n assert(id.length > 0, 'task id must be non-empty');\n assert(input.projectId.length > 0, 'projectId must be non-empty');\n assert(input.name.length > 0, 'task name must be non-empty');\n\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n\n try {\n const now = this.clock.nowIso();\n const level = getTaskLevel(input.type);\n\n const rankResult = this.computeInsertRank(input.projectId, level);\n if (!rankResult.ok) return rankResult;\n const rank = rankResult.value;\n assert(Number.isFinite(rank), 'computed rank must be finite');\n\n this.db\n .prepare(\n `INSERT INTO tasks (id, project_id, parent_id, name, description, type, status, rank, technical_notes, additional_requirements, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n input.projectId,\n input.parentId ?? null,\n input.name,\n input.description ?? '',\n input.type,\n input.status,\n rank,\n input.technicalNotes ?? '',\n input.additionalRequirements ?? '',\n now,\n now,\n );\n\n const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(id) as\n | TaskRow\n | undefined;\n assert(row != null, 'inserted task row must be readable');\n return ok(rowToTask(row));\n } catch (e) {\n return err(transientFrom(e, 'task.insert'));\n }\n });\n }\n\n findById(id: TaskId): Result<Task | null, RepositoryError> {\n return repoSpan('task', 'find_by_id', () => {\n try {\n const row = this.db\n .prepare(`SELECT * FROM tasks WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as TaskRow | undefined;\n return ok(row ? rowToTask(row) : null);\n } catch (e) {\n return err(transientFrom(e, 'task.find_by_id'));\n }\n });\n }\n\n findMany(filter: TaskFilter): Result<Task[], RepositoryError> {\n return repoSpan('task', 'find_many', () => {\n try {\n const conditions: string[] = [NOT_DELETED];\n const params: string[] = [];\n\n if (filter.projectId) {\n conditions.push('project_id = ?');\n params.push(filter.projectId);\n }\n if (filter.status) {\n conditions.push('status = ?');\n params.push(filter.status);\n }\n if (filter.type) {\n conditions.push('type = ?');\n params.push(filter.type);\n }\n if (filter.level !== undefined) {\n const typesForLevel = this.getTypesForLevel(filter.level as TaskLevel);\n const placeholders = typesForLevel.map(() => '?').join(', ');\n conditions.push(`type IN (${placeholders})`);\n params.push(...typesForLevel);\n }\n if (filter.parentId) {\n conditions.push('parent_id = ?');\n params.push(filter.parentId);\n }\n if (filter.parentIds && filter.parentIds.length > 0) {\n const placeholders = filter.parentIds.map(() => '?').join(', ');\n conditions.push(`parent_id IN (${placeholders})`);\n params.push(...filter.parentIds);\n }\n if (filter.search) {\n const parsed = parseSearchQuery(filter.search);\n if (parsed.kind === 'id') {\n conditions.push(`id LIKE ?`);\n params.push(`%${parsed.value}%`);\n } else {\n const ftsQuery = parsed.query\n .split(/\\s+/)\n .map((term) => `\"${term.replace(/\"/g, '\"\"')}\"*`)\n .join(' ');\n conditions.push(`id IN (SELECT id FROM tasks_fts WHERE tasks_fts MATCH ?)`);\n params.push(ftsQuery);\n }\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const sql = `SELECT * FROM tasks ${where} ORDER BY rank ASC LIMIT ?`;\n\n const rows = this.db.prepare(sql).all(...params, MAX_FIND_MANY + 1) as TaskRow[];\n if (rows.length > MAX_FIND_MANY) {\n return err({\n kind: 'limit_exceeded',\n limit: 'find_many',\n max: MAX_FIND_MANY,\n detail: `findMany returned more than ${MAX_FIND_MANY} rows; refine filter`,\n });\n }\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(transientFrom(e, 'task.find_many'));\n }\n });\n }\n\n update(id: TaskId, input: UpdateTaskInput): Result<Task, RepositoryError> {\n return repoSpan('task', 'update', () => {\n assert(id.length > 0, 'task id must be non-empty');\n\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n\n try {\n const existing = this.db\n .prepare(`SELECT * FROM tasks WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as TaskRow | undefined;\n if (!existing) {\n return err({ kind: 'not_found', entity: 'task', id });\n }\n\n const now = this.clock.nowIso();\n\n let technicalNotes = input.technicalNotes ?? existing.technical_notes;\n if (input.appendNotes) {\n technicalNotes =\n existing.technical_notes +\n (existing.technical_notes ? `\\n\\n---\\n_${now}_\\n\\n` : '') +\n input.appendNotes;\n }\n\n let additionalRequirements =\n input.additionalRequirements ?? existing.additional_requirements;\n if (input.appendRequirements) {\n additionalRequirements =\n existing.additional_requirements +\n (existing.additional_requirements ? `\\n\\n---\\n_${now}_\\n\\n` : '') +\n input.appendRequirements;\n }\n\n this.db\n .prepare(\n `UPDATE tasks SET\n name = ?, description = ?, type = ?, status = ?,\n parent_id = ?, technical_notes = ?, additional_requirements = ?, updated_at = ?\n WHERE id = ?`,\n )\n .run(\n input.name ?? existing.name,\n input.description ?? existing.description,\n input.type ?? existing.type,\n input.status ?? existing.status,\n input.parentId !== undefined ? input.parentId : existing.parent_id,\n technicalNotes,\n additionalRequirements,\n now,\n id,\n );\n\n const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(id) as\n | TaskRow\n | undefined;\n assert(row != null, 'updated task row must be readable');\n return ok(rowToTask(row));\n } catch (e) {\n if (isUniqueConstraint(e)) {\n return err({\n kind: 'duplicate',\n entity: 'task',\n key: id,\n detail: `Task already exists: ${id}`,\n });\n }\n return err(transientFrom(e, 'task.update'));\n }\n });\n }\n\n delete(id: TaskId): Result<void, RepositoryError> {\n return repoSpan('task', 'delete', () => {\n assert(id.length > 0, 'task id must be non-empty');\n\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n\n try {\n const existing = this.db\n .prepare(`SELECT * FROM tasks WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as TaskRow | undefined;\n if (!existing) {\n return err({ kind: 'not_found', entity: 'task', id });\n }\n const now = this.clock.nowIso();\n this.db\n .prepare('UPDATE tasks SET deleted_at = ?, updated_at = ? WHERE id = ?')\n .run(now, now, id);\n return ok(undefined);\n } catch (e) {\n return err(transientFrom(e, 'task.delete'));\n }\n });\n }\n\n rerank(taskId: TaskId, newRank: number): Result<Task, RepositoryError> {\n return repoSpan('task', 'rerank', () => {\n assert(taskId.length > 0, 'taskId must be non-empty');\n assert(Number.isFinite(newRank), 'newRank must be finite');\n\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n\n try {\n const now = this.clock.nowIso();\n const existing = this.db\n .prepare(`SELECT * FROM tasks WHERE id = ? AND ${NOT_DELETED}`)\n .get(taskId) as TaskRow | undefined;\n if (!existing) {\n return err({ kind: 'not_found', entity: 'task', id: taskId });\n }\n this.db\n .prepare('UPDATE tasks SET rank = ?, updated_at = ? WHERE id = ?')\n .run(newRank, now, taskId);\n\n const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(taskId) as\n | TaskRow\n | undefined;\n assert(row != null, 'reranked task row must be readable');\n return ok(rowToTask(row));\n } catch (e) {\n return err(transientFrom(e, 'task.rerank'));\n }\n });\n }\n\n getMaxRank(projectId: ProjectId): Result<number, RepositoryError> {\n return repoSpan('task', 'max_rank', () => {\n try {\n const row = this.db\n .prepare(\n `SELECT MAX(rank) as max_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED}`,\n )\n .get(projectId) as { max_rank: number | null } | undefined;\n return ok(row?.max_rank ?? 0);\n } catch (e) {\n return err(transientFrom(e, 'task.max_rank'));\n }\n });\n }\n\n getMaxActiveRank(projectId: ProjectId): Result<number, RepositoryError> {\n return repoSpan('task', 'max_active_rank', () => {\n try {\n const row = this.db\n .prepare(\n `SELECT MAX(rank) as max_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND status NOT IN (${TERMINAL_PLACEHOLDERS})`,\n )\n .get(projectId, ...TERMINAL_STATUS_ARRAY) as { max_rank: number | null } | undefined;\n return ok(row?.max_rank ?? 0);\n } catch (e) {\n return err(transientFrom(e, 'task.max_active_rank'));\n }\n });\n }\n\n getMinTerminalRank(projectId: ProjectId): Result<number | null, RepositoryError> {\n return repoSpan('task', 'min_terminal_rank', () => {\n try {\n const row = this.db\n .prepare(\n `SELECT MIN(rank) as min_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND status IN (${TERMINAL_PLACEHOLDERS})`,\n )\n .get(projectId, ...TERMINAL_STATUS_ARRAY) as { min_rank: number | null } | undefined;\n return ok(row?.min_rank ?? null);\n } catch (e) {\n return err(transientFrom(e, 'task.min_terminal_rank'));\n }\n });\n }\n\n getRankedTasks(projectId: ProjectId, status?: string): Result<Task[], RepositoryError> {\n return repoSpan('task', 'ranked_tasks', () => {\n try {\n let sql: string;\n let params: string[];\n if (status) {\n sql = `SELECT * FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND status = ? ORDER BY rank ASC LIMIT ?`;\n params = [projectId, status];\n } else {\n sql = `SELECT * FROM tasks WHERE project_id = ? AND ${NOT_DELETED} ORDER BY rank ASC LIMIT ?`;\n params = [projectId];\n }\n const rows = this.db.prepare(sql).all(...params, MAX_FIND_MANY + 1) as TaskRow[];\n if (rows.length > MAX_FIND_MANY) {\n return err({\n kind: 'limit_exceeded',\n limit: 'find_many',\n max: MAX_FIND_MANY,\n detail: `getRankedTasks exceeded ${MAX_FIND_MANY} rows`,\n });\n }\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(transientFrom(e, 'task.ranked_tasks'));\n }\n });\n }\n\n private getTypesForLevel(level: TaskLevel): string[] {\n if (level === 1) return ['release'];\n return [...WORK_TYPES];\n }\n\n getMaxRankByLevel(projectId: ProjectId, level: TaskLevel): Result<number, RepositoryError> {\n return repoSpan('task', 'max_rank_by_level', () => {\n try {\n const types = this.getTypesForLevel(level);\n const placeholders = types.map(() => '?').join(', ');\n const row = this.db\n .prepare(\n `SELECT MAX(rank) as max_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${placeholders})`,\n )\n .get(projectId, ...types) as { max_rank: number | null } | undefined;\n return ok(row?.max_rank ?? 0);\n } catch (e) {\n return err(transientFrom(e, 'task.max_rank_by_level'));\n }\n });\n }\n\n getMaxActiveRankByLevel(projectId: ProjectId, level: TaskLevel): Result<number, RepositoryError> {\n return repoSpan('task', 'max_active_rank_by_level', () => {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n const row = this.db\n .prepare(\n `SELECT MAX(rank) as max_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders}) AND status NOT IN (${TERMINAL_PLACEHOLDERS})`,\n )\n .get(projectId, ...types, ...TERMINAL_STATUS_ARRAY) as\n | { max_rank: number | null }\n | undefined;\n return ok(row?.max_rank ?? 0);\n } catch (e) {\n return err(transientFrom(e, 'task.max_active_rank_by_level'));\n }\n });\n }\n\n getMinTerminalRankByLevel(\n projectId: ProjectId,\n level: TaskLevel,\n ): Result<number | null, RepositoryError> {\n return repoSpan('task', 'min_terminal_rank_by_level', () => {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n const row = this.db\n .prepare(\n `SELECT MIN(rank) as min_rank FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders}) AND status IN (${TERMINAL_PLACEHOLDERS})`,\n )\n .get(projectId, ...types, ...TERMINAL_STATUS_ARRAY) as\n | { min_rank: number | null }\n | undefined;\n return ok(row?.min_rank ?? null);\n } catch (e) {\n return err(transientFrom(e, 'task.min_terminal_rank_by_level'));\n }\n });\n }\n\n getRankedTasksByLevel(\n projectId: ProjectId,\n level: TaskLevel,\n status?: string,\n ): Result<Task[], RepositoryError> {\n return repoSpan('task', 'ranked_tasks_by_level', () => {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n let sql: string;\n let params: string[];\n if (status) {\n sql = `SELECT * FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders}) AND status = ? ORDER BY rank ASC LIMIT ?`;\n params = [projectId, ...types, status];\n } else {\n sql = `SELECT * FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders}) ORDER BY rank ASC LIMIT ?`;\n params = [projectId, ...types];\n }\n const rows = this.db.prepare(sql).all(...params, MAX_FIND_MANY + 1) as TaskRow[];\n if (rows.length > MAX_FIND_MANY) {\n return err({\n kind: 'limit_exceeded',\n limit: 'find_many',\n max: MAX_FIND_MANY,\n detail: `getRankedTasksByLevel exceeded ${MAX_FIND_MANY} rows`,\n });\n }\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(transientFrom(e, 'task.ranked_tasks_by_level'));\n }\n });\n }\n\n getRankedNonTerminalTasksByLevel(\n projectId: ProjectId,\n level: TaskLevel,\n ): Result<Task[], RepositoryError> {\n return repoSpan('task', 'ranked_non_terminal_by_level', () => {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n const sql = `SELECT * FROM tasks WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders}) AND status NOT IN (${TERMINAL_PLACEHOLDERS}) ORDER BY rank ASC LIMIT ?`;\n const rows = this.db\n .prepare(sql)\n .all(projectId, ...types, ...TERMINAL_STATUS_ARRAY, MAX_FIND_MANY + 1) as TaskRow[];\n if (rows.length > MAX_FIND_MANY) {\n return err({\n kind: 'limit_exceeded',\n limit: 'find_many',\n max: MAX_FIND_MANY,\n detail: `getRankedNonTerminalTasksByLevel exceeded ${MAX_FIND_MANY} rows`,\n });\n }\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(transientFrom(e, 'task.ranked_non_terminal_by_level'));\n }\n });\n }\n\n rebalanceByLevel(projectId: ProjectId, level: TaskLevel): Result<void, RepositoryError> {\n return repoSpan('task', 'rebalance_by_level', () => {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n // Active tasks first (current rank order), then terminal tasks —\n // this both recovers from precision collapse and repairs any\n // pre-existing interleaved state. The caller decides whether to\n // wrap this in a transaction via withTransaction.\n const rows = this.db\n .prepare(\n `SELECT * FROM tasks\n WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders})\n ORDER BY\n CASE WHEN status IN (${TERMINAL_PLACEHOLDERS}) THEN 1 ELSE 0 END ASC,\n rank ASC,\n id ASC`,\n )\n .all(projectId, ...types, ...TERMINAL_STATUS_ARRAY) as TaskRow[];\n\n if (rows.length === 0) return ok(undefined);\n\n const now = this.clock.nowIso();\n const updateStmt = this.db.prepare(\n 'UPDATE tasks SET rank = ?, updated_at = ? WHERE id = ?',\n );\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (!row) continue;\n const newRank = (i + 1) * RANK_GAP;\n if (row.rank === newRank) continue;\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n updateStmt.run(newRank, now, row.id);\n }\n\n return ok(undefined);\n } catch (e) {\n return err(transientFrom(e, 'task.rebalance_by_level'));\n }\n });\n }\n\n /**\n * Fetch `(maxActive, minTerminal)` for a level in a single SQL round-trip.\n */\n private getRankBoundsByLevel(\n projectId: ProjectId,\n level: TaskLevel,\n ): Result<{ maxActive: number; minTerminal: number | null }, RepositoryError> {\n try {\n const types = this.getTypesForLevel(level);\n const typePlaceholders = types.map(() => '?').join(', ');\n const row = this.db\n .prepare(\n `SELECT\n MAX(CASE WHEN status NOT IN (${TERMINAL_PLACEHOLDERS}) THEN rank END) AS max_active,\n MIN(CASE WHEN status IN (${TERMINAL_PLACEHOLDERS}) THEN rank END) AS min_terminal\n FROM tasks\n WHERE project_id = ? AND ${NOT_DELETED} AND type IN (${typePlaceholders})`,\n )\n .get(...TERMINAL_STATUS_ARRAY, ...TERMINAL_STATUS_ARRAY, projectId, ...types) as\n | { max_active: number | null; min_terminal: number | null }\n | undefined;\n return ok({\n maxActive: row?.max_active ?? 0,\n minTerminal: row?.min_terminal ?? null,\n });\n } catch (e) {\n return err(transientFrom(e, 'task.rank_bounds_by_level'));\n }\n }\n\n /**\n * Compute a fresh rank for a new active task at the given level.\n */\n private computeInsertRank(projectId: ProjectId, level: TaskLevel): Result<number, RepositoryError> {\n const attempt = (): Result<number | null, RepositoryError> => {\n const boundsResult = this.getRankBoundsByLevel(projectId, level);\n if (!boundsResult.ok) return boundsResult;\n const { maxActive, minTerminal } = boundsResult.value;\n\n if (minTerminal === null) {\n return ok(maxActive + RANK_GAP);\n }\n if (minTerminal <= maxActive) {\n return ok(null);\n }\n if (maxActive <= 0) {\n return ok(minTerminal - RANK_GAP);\n }\n return ok(midpoint(maxActive, minTerminal));\n };\n\n const first = attempt();\n if (!first.ok) return first;\n if (first.value !== null) return ok(first.value);\n\n const rebalanceResult = this.rebalanceByLevel(projectId, level);\n if (!rebalanceResult.ok) return rebalanceResult;\n\n const second = attempt();\n if (!second.ok) return second;\n if (second.value === null) {\n return err({\n kind: 'invariant_violated',\n detail: 'Rank computation did not converge after rebalance',\n });\n }\n return ok(second.value);\n }\n\n search(query: string, projectId?: ProjectId): Result<SearchResult[], RepositoryError> {\n return repoSpan('task', 'search', () => {\n if (query.length > SEARCH_QUERY_LEN) {\n return err({\n kind: 'limit_exceeded',\n limit: 'search',\n max: SEARCH_QUERY_LEN,\n detail: `search query exceeds ${SEARCH_QUERY_LEN} characters`,\n });\n }\n\n try {\n const parsed = parseSearchQuery(query);\n\n if (parsed.kind === 'id') {\n const conditions = ['t.id LIKE ?', 't.deleted_at IS NULL'];\n const params: string[] = [`%${parsed.value}%`];\n if (projectId) {\n conditions.push('t.project_id = ?');\n params.push(projectId);\n }\n const sql = `SELECT t.* FROM tasks t WHERE ${conditions.join(' AND ')} ORDER BY t.rank ASC LIMIT ?`;\n const rows = this.db.prepare(sql).all(...params, MAX_SEARCH_RESULTS) as TaskRow[];\n // Id-prefix search has no meaningful relevance; flag all as full match.\n return ok(rows.map((row) => ({ task: rowToTask(row), rank: Relevance.one })));\n }\n\n const ftsQuery = parsed.query\n .split(/\\s+/)\n .map((term) => `\"${term.replace(/\"/g, '\"\"')}\"*`)\n .join(' ');\n\n let sql: string;\n let params: string[];\n\n if (projectId) {\n sql = `SELECT t.*, bm25(tasks_fts) AS fts_rank\n FROM tasks_fts f\n JOIN tasks t ON t.id = f.id AND t.deleted_at IS NULL\n WHERE tasks_fts MATCH ? AND t.project_id = ?\n ORDER BY fts_rank ASC\n LIMIT ?`;\n params = [ftsQuery, projectId];\n } else {\n sql = `SELECT t.*, bm25(tasks_fts) AS fts_rank\n FROM tasks_fts f\n JOIN tasks t ON t.id = f.id AND t.deleted_at IS NULL\n WHERE tasks_fts MATCH ?\n ORDER BY fts_rank ASC\n LIMIT ?`;\n params = [ftsQuery];\n }\n\n const rows = this.db.prepare(sql).all(...params, MAX_SEARCH_RESULTS) as (TaskRow & {\n fts_rank: number;\n })[];\n\n // BM25 rank from sqlite FTS5 is unbounded and only comparable\n // within a single result set. Normalize to `[0, 1]` (higher =\n // better) so the raw sqlite score never escapes this module.\n return ok(normalizeBm25(rows));\n } catch (e) {\n return err(transientFrom(e, 'task.search'));\n }\n });\n }\n\n countCompletedSince(projectId: ProjectId, sinceIso: string): Result<TypeCounts, RepositoryError> {\n return repoSpan('task', 'count_completed_since', () => {\n try {\n const rows = this.db\n .prepare(\n `SELECT type, COUNT(*) as n FROM tasks\n WHERE project_id = ? AND ${NOT_DELETED}\n AND status = 'done' AND updated_at >= ?\n GROUP BY type`,\n )\n .all(projectId, sinceIso) as Array<{ type: string; n: number }>;\n return ok(toTypeCounts(rows));\n } catch (e) {\n return err(transientFrom(e, 'task.count_completed_since'));\n }\n });\n }\n\n countCreatedSince(projectId: ProjectId, sinceIso: string): Result<TypeCounts, RepositoryError> {\n return repoSpan('task', 'count_created_since', () => {\n try {\n const rows = this.db\n .prepare(\n `SELECT type, COUNT(*) as n FROM tasks\n WHERE project_id = ? AND ${NOT_DELETED} AND created_at >= ?\n GROUP BY type`,\n )\n .all(projectId, sinceIso) as Array<{ type: string; n: number }>;\n return ok(toTypeCounts(rows));\n } catch (e) {\n return err(transientFrom(e, 'task.count_created_since'));\n }\n });\n }\n\n countCurrent(projectId: ProjectId): Result<CurrentCounts, RepositoryError> {\n return repoSpan('task', 'count_current', () => {\n try {\n const rows = this.db\n .prepare(\n `SELECT status, type, COUNT(*) as n FROM tasks\n WHERE project_id = ? AND ${NOT_DELETED}\n GROUP BY status, type`,\n )\n .all(projectId) as Array<{ status: string; type: string; n: number }>;\n const byType: Record<string, number> = {};\n const byStatus: Record<string, number> = {};\n let total = 0;\n for (const row of rows) {\n byType[row.type] = (byType[row.type] ?? 0) + row.n;\n byStatus[row.status] = (byStatus[row.status] ?? 0) + row.n;\n total += row.n;\n }\n return ok({ byType, byStatus, total });\n } catch (e) {\n return err(transientFrom(e, 'task.count_current'));\n }\n });\n }\n\n findCompletedSince(projectId: ProjectId, sinceIso: string): Result<Task[], RepositoryError> {\n return repoSpan('task', 'find_completed_since', () => {\n try {\n const rows = this.db\n .prepare(\n `SELECT * FROM tasks\n WHERE project_id = ? AND ${NOT_DELETED}\n AND status = 'done' AND updated_at >= ?\n ORDER BY updated_at DESC\n LIMIT ?`,\n )\n .all(projectId, sinceIso, MAX_FIND_MANY + 1) as TaskRow[];\n if (rows.length > MAX_FIND_MANY) {\n return err({\n kind: 'limit_exceeded',\n limit: 'find_many',\n max: MAX_FIND_MANY,\n detail: `findCompletedSince exceeded ${MAX_FIND_MANY} rows`,\n });\n }\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(transientFrom(e, 'task.find_completed_since'));\n }\n });\n }\n}\n\n/**\n * Convert a set of BM25-ranked rows into normalized `SearchResult[]`.\n * BM25 is negative-is-better and unbounded; we map it to `[0, 1]` where\n * `1` is the best match in this result set. Single-row results get `1`.\n */\nfunction normalizeBm25(rows: Array<TaskRow & { fts_rank: number }>): SearchResult[] {\n if (rows.length === 0) return [];\n const first = rows[0];\n if (rows.length === 1 && first !== undefined) {\n return [{ task: rowToTask(first), rank: Relevance.one }];\n }\n let min = Infinity;\n let max = -Infinity;\n for (const row of rows) {\n if (row.fts_rank < min) min = row.fts_rank;\n if (row.fts_rank > max) max = row.fts_rank;\n }\n const span = Math.max(1e-9, max - min);\n return rows.map((row) => {\n // BM25: lower is better. Flip so 1 = best match in this set.\n const raw = 1 - (row.fts_rank - min) / span;\n const clamped = raw < 0 ? 0 : raw > 1 ? 1 : raw;\n return { task: rowToTask(row), rank: Relevance.of(clamped) };\n });\n}\n","export type ParsedSearch = { kind: 'fts'; query: string } | { kind: 'id'; value: string };\n\nconst ID_PREFIX_RE = /^id:(.+)$/;\n\nexport function parseSearchQuery(raw: string): ParsedSearch {\n const trimmed = raw.trim();\n const match = ID_PREFIX_RE.exec(trimmed);\n if (match?.[1]) {\n return { kind: 'id', value: match[1] };\n }\n return { kind: 'fts', query: trimmed };\n}\n","import type { Task } from '../../types/task.js';\nimport type { TaskStatus, TaskType } from '../../types/enums.js';\nimport type { Project } from '../../types/project.js';\nimport { GitRemote } from '../../types/git-remote.js';\nimport type { TaskDependency } from '../../types/dependency.js';\nimport type { DependencyType } from '../../types/enums.js';\nimport { TaskId, ProjectId } from '../../types/branded.js';\nimport assert from 'node:assert';\n\nexport const NOT_DELETED = 'deleted_at IS NULL';\n\nexport interface TaskRow {\n id: string;\n project_id: string;\n parent_id: string | null;\n name: string;\n description: string;\n type: string;\n status: string;\n rank: number;\n technical_notes: string;\n additional_requirements: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface ProjectRow {\n id: string;\n key: string;\n name: string;\n description: string;\n is_default: number;\n task_counter: number;\n git_remote: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport interface DependencyRow {\n task_id: string;\n depends_on_id: string;\n type: string;\n created_at: string;\n}\n\nexport function rowToTask(row: TaskRow): Task {\n assert(typeof row.id === 'string' && row.id.length > 0, 'TaskRow.id missing');\n assert(\n typeof row.project_id === 'string' && row.project_id.length > 0,\n 'TaskRow.project_id missing',\n );\n return {\n id: TaskId.unsafe(row.id),\n projectId: ProjectId.unsafe(row.project_id),\n parentId: row.parent_id ? TaskId.unsafe(row.parent_id) : null,\n name: row.name,\n description: row.description,\n type: row.type as TaskType,\n status: row.status as TaskStatus,\n rank: row.rank,\n technicalNotes: row.technical_notes,\n additionalRequirements: row.additional_requirements,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nexport function rowToProject(row: ProjectRow): Project {\n assert(typeof row.id === 'string' && row.id.length > 0, 'ProjectRow.id missing');\n assert(typeof row.key === 'string' && row.key.length > 0, 'ProjectRow.key missing');\n return {\n id: ProjectId.unsafe(row.id),\n key: row.key,\n name: row.name,\n description: row.description,\n isDefault: row.is_default === 1,\n gitRemote: row.git_remote ? GitRemote.parse(row.git_remote) : null,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nexport function rowToDependency(row: DependencyRow): TaskDependency {\n assert(\n typeof row.task_id === 'string' && row.task_id.length > 0,\n 'DependencyRow.task_id missing',\n );\n assert(\n typeof row.depends_on_id === 'string' && row.depends_on_id.length > 0,\n 'DependencyRow.depends_on_id missing',\n );\n return {\n taskId: TaskId.unsafe(row.task_id),\n dependsOnId: TaskId.unsafe(row.depends_on_id),\n type: row.type as DependencyType,\n createdAt: row.created_at,\n };\n}\n","import { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { logger } from '../../logging/logger.js';\nimport type { Result } from '../../types/common.js';\nimport type { RepositoryEntity, RepositoryError } from '../errors.js';\n\n/**\n * Wrap a repository call with a stable, low-cardinality span. Names are\n * `repo.<entity>.<op>`; dynamic values (ids, filters) go on `tayto.repo.*`\n * attributes. On a failed `Result`, the kind is attached and the span is\n * marked ERROR — both setStatus and (if present) recordException.\n */\nexport function repoSpan<T>(\n entity: RepositoryEntity,\n op: string,\n fn: (span: Span) => Result<T, RepositoryError>,\n): Result<T, RepositoryError> {\n return logger.startSpan(`repo.${entity}.${op}`, (span) => {\n span.setAttribute('tayto.repo.backend', 'sqlite');\n span.setAttribute('tayto.repo.entity', entity);\n span.setAttribute('tayto.repo.op', op);\n const result = fn(span);\n if (result.ok) {\n span.setAttribute('tayto.result.kind', 'ok');\n } else {\n span.setAttribute('tayto.result.kind', result.error.kind);\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n return result;\n });\n}\n","import assert from 'node:assert';\nimport type { RepositoryError } from '../errors.js';\nimport { MAX_TXN_OPS } from '../limits.js';\n\n/**\n * Per-transaction state shared by the three sqlite repositories inside a\n * `withTransaction` callback. Tracks write count so the boundary can fail\n * fast on over-sized batches instead of holding a long write lock.\n */\nexport interface TxnState {\n active: boolean;\n writes: number;\n}\n\nexport function newTxnState(): TxnState {\n return { active: false, writes: 0 };\n}\n\n/**\n * Record a pending write. Returns a `limit_exceeded` error when the cap\n * would be crossed; callers must return the error rather than proceed.\n */\nexport function bumpWrite(state: TxnState): RepositoryError | null {\n if (!state.active) return null;\n assert(Number.isFinite(state.writes), 'TxnState.writes must be a finite number');\n assert(state.writes >= 0, 'TxnState.writes must be non-negative');\n if (state.writes >= MAX_TXN_OPS) {\n return {\n kind: 'limit_exceeded',\n limit: 'txn_ops',\n max: MAX_TXN_OPS,\n detail: `withTransaction wrote more than ${MAX_TXN_OPS} rows`,\n };\n }\n state.writes += 1;\n return null;\n}\n","import type { DatabaseSync } from 'node:sqlite';\nimport assert from 'node:assert';\nimport type { Result } from '../../types/common.js';\nimport { ok, err } from '../../types/common.js';\nimport type { Project, CreateProjectInput, UpdateProjectInput } from '../../types/project.js';\nimport type { GitRemote } from '../../types/git-remote.js';\nimport { ulid } from 'ulid';\nimport type { ProjectId } from '../../types/branded.js';\nimport type { ProjectRepository } from '../project.repository.js';\nimport type { RepositoryError } from '../errors.js';\nimport type { Clock } from '../clock.js';\nimport { NOT_DELETED, type ProjectRow, rowToProject } from './row-mappers.js';\nimport { repoSpan } from './span.js';\nimport { type TxnState, bumpWrite } from './txn.js';\n\nfunction isUniqueConstraint(e: unknown): e is Error {\n return e instanceof Error && e.message.includes('UNIQUE constraint');\n}\n\nfunction transientFrom(e: unknown, op: string): RepositoryError {\n const detail = e instanceof Error ? e.message : String(e);\n return { kind: 'transient', cause: 'io', retryable: true, detail: `${op}: ${detail}` };\n}\n\nexport class SqliteProjectRepository implements ProjectRepository {\n constructor(\n private readonly db: DatabaseSync,\n private readonly clock: Clock,\n private readonly txn: TxnState,\n ) {}\n\n insert(input: CreateProjectInput & { key: string }): Result<Project, RepositoryError> {\n return repoSpan('project', 'insert', () => {\n assert(input.key.length > 0, 'project key must be non-empty');\n assert(input.name.length > 0, 'project name must be non-empty');\n\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n\n try {\n const now = this.clock.nowIso();\n const id = ulid();\n\n if (input.isDefault) {\n this.db.prepare('UPDATE projects SET is_default = 0 WHERE is_default = 1').run();\n }\n\n this.db\n .prepare(\n `INSERT INTO projects (id, key, name, description, is_default, git_remote, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n input.key,\n input.name,\n input.description ?? '',\n input.isDefault ? 1 : 0,\n input.gitRemote?.value ?? null,\n now,\n now,\n );\n\n const row = this.db.prepare('SELECT * FROM projects WHERE id = ?').get(id) as\n | ProjectRow\n | undefined;\n assert(row != null, 'inserted project row must be readable');\n return ok(rowToProject(row));\n } catch (e) {\n if (isUniqueConstraint(e)) {\n if (e.message.includes('git_remote')) {\n return err({\n kind: 'duplicate',\n entity: 'project',\n key: input.gitRemote?.value ?? '',\n detail: `Git remote already linked to another project: ${input.gitRemote?.value ?? ''}`,\n });\n }\n return err({\n kind: 'duplicate',\n entity: 'project',\n key: input.name,\n detail: `Project name already exists: ${input.name}`,\n });\n }\n return err(transientFrom(e, 'project.insert'));\n }\n });\n }\n\n findById(id: ProjectId): Result<Project | null, RepositoryError> {\n return repoSpan('project', 'find_by_id', () => {\n try {\n const row = this.db\n .prepare(`SELECT * FROM projects WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as ProjectRow | undefined;\n return ok(row ? rowToProject(row) : null);\n } catch (e) {\n return err(transientFrom(e, 'project.find_by_id'));\n }\n });\n }\n\n findByKey(key: string): Result<Project | null, RepositoryError> {\n return repoSpan('project', 'find_by_key', () => {\n try {\n const row = this.db\n .prepare(`SELECT * FROM projects WHERE key = ? AND ${NOT_DELETED}`)\n .get(key) as ProjectRow | undefined;\n return ok(row ? rowToProject(row) : null);\n } catch (e) {\n return err(transientFrom(e, 'project.find_by_key'));\n }\n });\n }\n\n findByName(name: string): Result<Project | null, RepositoryError> {\n return repoSpan('project', 'find_by_name', () => {\n try {\n const row = this.db\n .prepare(`SELECT * FROM projects WHERE name = ? AND ${NOT_DELETED}`)\n .get(name) as ProjectRow | undefined;\n return ok(row ? rowToProject(row) : null);\n } catch (e) {\n return err(transientFrom(e, 'project.find_by_name'));\n }\n });\n }\n\n findByGitRemote(remote: GitRemote): Result<Project | null, RepositoryError> {\n return repoSpan('project', 'find_by_git_remote', () => {\n try {\n const row = this.db\n .prepare(`SELECT * FROM projects WHERE git_remote = ? AND ${NOT_DELETED}`)\n .get(remote.value) as ProjectRow | undefined;\n return ok(row ? rowToProject(row) : null);\n } catch (e) {\n return err(transientFrom(e, 'project.find_by_git_remote'));\n }\n });\n }\n\n findDefault(): Result<Project | null, RepositoryError> {\n return repoSpan('project', 'find_default', () => {\n try {\n const row = this.db\n .prepare(`SELECT * FROM projects WHERE is_default = 1 AND ${NOT_DELETED}`)\n .get() as ProjectRow | undefined;\n return ok(row ? rowToProject(row) : null);\n } catch (e) {\n return err(transientFrom(e, 'project.find_default'));\n }\n });\n }\n\n findAll(): Result<Project[], RepositoryError> {\n return repoSpan('project', 'find_all', () => {\n try {\n const rows = this.db\n .prepare(`SELECT * FROM projects WHERE ${NOT_DELETED} ORDER BY created_at DESC`)\n .all() as ProjectRow[];\n return ok(rows.map(rowToProject));\n } catch (e) {\n return err(transientFrom(e, 'project.find_all'));\n }\n });\n }\n\n update(id: ProjectId, input: UpdateProjectInput): Result<Project, RepositoryError> {\n return repoSpan('project', 'update', () => {\n assert(id.length > 0, 'project id must be non-empty');\n\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n\n try {\n const existing = this.db\n .prepare(`SELECT * FROM projects WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as ProjectRow | undefined;\n if (!existing) {\n return err({ kind: 'not_found', entity: 'project', id });\n }\n\n const now = this.clock.nowIso();\n\n if (input.isDefault) {\n this.db.prepare('UPDATE projects SET is_default = 0 WHERE is_default = 1').run();\n }\n\n this.db\n .prepare(\n `UPDATE projects SET\n name = ?, description = ?, is_default = ?, git_remote = ?, updated_at = ?\n WHERE id = ?`,\n )\n .run(\n input.name ?? existing.name,\n input.description ?? existing.description,\n input.isDefault !== undefined ? (input.isDefault ? 1 : 0) : existing.is_default,\n input.gitRemote !== undefined ? (input.gitRemote?.value ?? null) : existing.git_remote,\n now,\n id,\n );\n\n const row = this.db.prepare('SELECT * FROM projects WHERE id = ?').get(id) as\n | ProjectRow\n | undefined;\n assert(row != null, 'updated project row must be readable');\n return ok(rowToProject(row));\n } catch (e) {\n if (isUniqueConstraint(e)) {\n if (e.message.includes('git_remote')) {\n return err({\n kind: 'duplicate',\n entity: 'project',\n key: 'git_remote',\n detail: 'Git remote already linked to another project',\n });\n }\n return err({\n kind: 'duplicate',\n entity: 'project',\n key: 'name',\n detail: 'Project name already exists',\n });\n }\n return err(transientFrom(e, 'project.update'));\n }\n });\n }\n\n delete(id: ProjectId): Result<void, RepositoryError> {\n return repoSpan('project', 'delete', () => {\n assert(id.length > 0, 'project id must be non-empty');\n\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n\n try {\n const existing = this.db\n .prepare(`SELECT * FROM projects WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as ProjectRow | undefined;\n if (!existing) {\n return err({ kind: 'not_found', entity: 'project', id });\n }\n const now = this.clock.nowIso();\n this.db\n .prepare('UPDATE projects SET deleted_at = ?, updated_at = ? WHERE id = ?')\n .run(now, now, id);\n // Soft-delete all tasks in this project\n this.db\n .prepare(\n 'UPDATE tasks SET deleted_at = ?, updated_at = ? WHERE project_id = ? AND deleted_at IS NULL',\n )\n .run(now, now, id);\n return ok(undefined);\n } catch (e) {\n return err(transientFrom(e, 'project.delete'));\n }\n });\n }\n\n incrementTaskCounter(id: ProjectId): Result<number, RepositoryError> {\n return repoSpan('project', 'increment_task_counter', () => {\n assert(id.length > 0, 'project id must be non-empty');\n\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n\n try {\n this.db\n .prepare(\n `UPDATE projects SET task_counter = task_counter + 1 WHERE id = ? AND ${NOT_DELETED}`,\n )\n .run(id);\n const row = this.db\n .prepare(`SELECT task_counter FROM projects WHERE id = ? AND ${NOT_DELETED}`)\n .get(id) as { task_counter: number } | undefined;\n if (!row) {\n return err({ kind: 'not_found', entity: 'project', id });\n }\n return ok(row.task_counter);\n } catch (e) {\n return err(transientFrom(e, 'project.increment_task_counter'));\n }\n });\n }\n}\n","import type { DatabaseSync } from 'node:sqlite';\nimport assert from 'node:assert';\nimport type { Result } from '../../types/common.js';\nimport { ok, err } from '../../types/common.js';\nimport type { TaskDependency } from '../../types/dependency.js';\nimport type { Task } from '../../types/task.js';\nimport type { DependencyType } from '../../types/enums.js';\nimport type { TaskId } from '../../types/branded.js';\nimport type { DependencyRepository } from '../dependency.repository.js';\nimport type { RepositoryError } from '../errors.js';\nimport type { Clock } from '../clock.js';\nimport { type TaskRow, type DependencyRow, rowToTask, rowToDependency } from './row-mappers.js';\nimport { repoSpan } from './span.js';\nimport { type TxnState, bumpWrite } from './txn.js';\n\nfunction transientFrom(e: unknown, op: string): RepositoryError {\n const detail = e instanceof Error ? e.message : String(e);\n return { kind: 'transient', cause: 'io', retryable: true, detail: `${op}: ${detail}` };\n}\n\nexport class SqliteDependencyRepository implements DependencyRepository {\n constructor(\n private readonly db: DatabaseSync,\n private readonly clock: Clock,\n private readonly txn: TxnState,\n ) {}\n\n insert(\n taskId: TaskId,\n dependsOnId: TaskId,\n type: DependencyType,\n ): Result<TaskDependency, RepositoryError> {\n return repoSpan('dependency', 'insert', () => {\n assert(taskId.length > 0, 'taskId must be non-empty');\n assert(dependsOnId.length > 0, 'dependsOnId must be non-empty');\n\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n\n try {\n const now = this.clock.nowIso();\n this.db\n .prepare(\n `INSERT INTO task_dependencies (task_id, depends_on_id, type, created_at)\n VALUES (?, ?, ?, ?)`,\n )\n .run(taskId, dependsOnId, type, now);\n\n const row = this.db\n .prepare('SELECT * FROM task_dependencies WHERE task_id = ? AND depends_on_id = ?')\n .get(taskId, dependsOnId) as DependencyRow | undefined;\n assert(row != null, 'inserted dependency row must be readable');\n return ok(rowToDependency(row));\n } catch (e) {\n if (e instanceof Error && e.message.includes('UNIQUE constraint')) {\n return err({\n kind: 'duplicate',\n entity: 'dependency',\n key: `${taskId}->${dependsOnId}`,\n detail: `Dependency already exists: ${taskId} -> ${dependsOnId}`,\n });\n }\n if (e instanceof Error && e.message.includes('FOREIGN KEY constraint')) {\n return err({\n kind: 'foreign_key',\n parentEntity: 'task',\n parentId: `${taskId},${dependsOnId}`,\n detail: 'One or both tasks do not exist',\n });\n }\n if (e instanceof Error && e.message.includes('CHECK constraint')) {\n return err({\n kind: 'invariant_violated',\n detail: 'A task cannot depend on itself',\n });\n }\n return err(transientFrom(e, 'dependency.insert'));\n }\n });\n }\n\n delete(taskId: TaskId, dependsOnId: TaskId): Result<void, RepositoryError> {\n return repoSpan('dependency', 'delete', () => {\n assert(taskId.length > 0, 'taskId must be non-empty');\n assert(dependsOnId.length > 0, 'dependsOnId must be non-empty');\n\n const limit = bumpWrite(this.txn);\n if (limit) return err(limit);\n\n try {\n const existing = this.db\n .prepare('SELECT * FROM task_dependencies WHERE task_id = ? AND depends_on_id = ?')\n .get(taskId, dependsOnId) as DependencyRow | undefined;\n if (!existing) {\n return err({\n kind: 'not_found',\n entity: 'dependency',\n id: `${taskId}->${dependsOnId}`,\n });\n }\n this.db\n .prepare('DELETE FROM task_dependencies WHERE task_id = ? AND depends_on_id = ?')\n .run(taskId, dependsOnId);\n return ok(undefined);\n } catch (e) {\n return err(transientFrom(e, 'dependency.delete'));\n }\n });\n }\n\n findByTask(taskId: TaskId): Result<TaskDependency[], RepositoryError> {\n return repoSpan('dependency', 'find_by_task', () => {\n try {\n const rows = this.db\n .prepare('SELECT * FROM task_dependencies WHERE task_id = ? ORDER BY created_at ASC')\n .all(taskId) as DependencyRow[];\n return ok(rows.map(rowToDependency));\n } catch (e) {\n return err(transientFrom(e, 'dependency.find_by_task'));\n }\n });\n }\n\n findDependents(taskId: TaskId): Result<TaskDependency[], RepositoryError> {\n return repoSpan('dependency', 'find_dependents', () => {\n try {\n const rows = this.db\n .prepare(\n 'SELECT * FROM task_dependencies WHERE depends_on_id = ? ORDER BY created_at ASC',\n )\n .all(taskId) as DependencyRow[];\n return ok(rows.map(rowToDependency));\n } catch (e) {\n return err(transientFrom(e, 'dependency.find_dependents'));\n }\n });\n }\n\n getBlockers(taskId: TaskId): Result<Task[], RepositoryError> {\n return repoSpan('dependency', 'get_blockers', () => {\n try {\n const rows = this.db\n .prepare(\n `SELECT t.* FROM tasks t\n JOIN task_dependencies td ON t.id = td.depends_on_id\n WHERE td.task_id = ? AND td.type = 'blocks' AND t.deleted_at IS NULL\n ORDER BY t.rank ASC`,\n )\n .all(taskId) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(transientFrom(e, 'dependency.get_blockers'));\n }\n });\n }\n\n getDependents(taskId: TaskId): Result<Task[], RepositoryError> {\n return repoSpan('dependency', 'get_dependents', () => {\n try {\n const rows = this.db\n .prepare(\n `SELECT t.* FROM tasks t\n JOIN task_dependencies td ON t.id = td.task_id\n WHERE td.depends_on_id = ? AND td.type = 'blocks' AND t.deleted_at IS NULL\n ORDER BY t.rank ASC`,\n )\n .all(taskId) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(transientFrom(e, 'dependency.get_dependents'));\n }\n });\n }\n\n getRelated(taskId: TaskId): Result<Task[], RepositoryError> {\n return repoSpan('dependency', 'get_related', () => {\n try {\n const rows = this.db\n .prepare(\n `SELECT DISTINCT t.* FROM tasks t\n JOIN task_dependencies td ON (\n (td.task_id = ? AND td.depends_on_id = t.id) OR\n (td.depends_on_id = ? AND td.task_id = t.id)\n )\n WHERE td.type = 'relates-to' AND t.deleted_at IS NULL\n ORDER BY t.rank ASC`,\n )\n .all(taskId, taskId) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(transientFrom(e, 'dependency.get_related'));\n }\n });\n }\n\n getDuplicates(taskId: TaskId): Result<Task[], RepositoryError> {\n return repoSpan('dependency', 'get_duplicates', () => {\n try {\n const rows = this.db\n .prepare(\n `SELECT DISTINCT t.* FROM tasks t\n JOIN task_dependencies td ON (\n (td.task_id = ? AND td.depends_on_id = t.id) OR\n (td.depends_on_id = ? AND td.task_id = t.id)\n )\n WHERE td.type = 'duplicates' AND t.deleted_at IS NULL\n ORDER BY t.rank ASC`,\n )\n .all(taskId, taskId) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(transientFrom(e, 'dependency.get_duplicates'));\n }\n });\n }\n\n getTransitiveClosure(taskId: TaskId): Result<Task[], RepositoryError> {\n return repoSpan('dependency', 'get_transitive_closure', () => {\n try {\n const rows = this.db\n .prepare(\n `WITH RECURSIVE transitive_deps(id) AS (\n SELECT depends_on_id FROM task_dependencies WHERE task_id = ?\n UNION\n SELECT td.depends_on_id FROM task_dependencies td\n JOIN transitive_deps d ON td.task_id = d.id\n )\n SELECT t.* FROM tasks t\n WHERE t.id IN (SELECT id FROM transitive_deps) AND t.deleted_at IS NULL\n ORDER BY t.rank ASC`,\n )\n .all(taskId) as TaskRow[];\n return ok(rows.map(rowToTask));\n } catch (e) {\n return err(transientFrom(e, 'dependency.get_transitive_closure'));\n }\n });\n }\n\n wouldCreateCycle(taskId: TaskId, dependsOnId: TaskId): Result<boolean, RepositoryError> {\n return repoSpan('dependency', 'would_create_cycle', () => {\n try {\n const row = this.db\n .prepare(\n `WITH RECURSIVE reachable(id) AS (\n SELECT depends_on_id FROM task_dependencies WHERE task_id = ?\n UNION\n SELECT td.depends_on_id FROM task_dependencies td\n JOIN reachable r ON td.task_id = r.id\n )\n SELECT 1 AS found FROM reachable WHERE id = ? LIMIT 1`,\n )\n .get(dependsOnId, taskId) as { found: number } | undefined;\n return ok(row !== undefined);\n } catch (e) {\n return err(transientFrom(e, 'dependency.would_create_cycle'));\n }\n });\n }\n}\n","import { Command } from 'commander';\nimport type { Container } from './container.js';\nimport { APP_VERSION } from '../version.js';\nimport { registerProjectCreate } from './commands/project/create.js';\nimport { registerProjectList } from './commands/project/list.js';\nimport { registerProjectUpdate } from './commands/project/update.js';\nimport { registerProjectDelete } from './commands/project/delete.js';\nimport { registerProjectSetDefault } from './commands/project/set-default.js';\nimport { registerProjectLink } from './commands/project/link.js';\nimport { registerProjectUnlink } from './commands/project/unlink.js';\nimport { registerTaskCreate } from './commands/task/create.js';\nimport { registerTaskList } from './commands/task/list.js';\nimport { registerTaskShow } from './commands/task/show.js';\nimport { registerTaskUpdate } from './commands/task/update.js';\nimport { registerTaskDelete } from './commands/task/delete.js';\nimport { registerTaskBreakdown } from './commands/task/breakdown.js';\nimport { registerTaskRank } from './commands/task/rank.js';\nimport { registerTaskSearch } from './commands/task/search.js';\nimport { registerTaskExport } from './commands/task/export.js';\nimport { registerTaskImport } from './commands/task/import.js';\nimport { registerDepAdd } from './commands/dep/add.js';\nimport { registerDepRemove } from './commands/dep/remove.js';\nimport { registerDepList } from './commands/dep/list.js';\nimport { registerDepGraph } from './commands/dep/graph.js';\nimport { registerUpgrade } from './commands/upgrade.js';\nimport { registerAnalyticSummary } from './commands/analytic/summary.js';\nimport { registerAnalyticCompleted } from './commands/analytic/completed.js';\n\nexport function buildCLI(container: Container): Command {\n const program = new Command();\n program\n .name('tayto')\n .description('CLI task management for solo devs and AI agents')\n .version(APP_VERSION);\n\n const project = program.command('project').description('Manage projects');\n registerProjectCreate(project, container);\n registerProjectList(project, container);\n registerProjectUpdate(project, container);\n registerProjectDelete(project, container);\n registerProjectSetDefault(project, container);\n registerProjectLink(project, container);\n registerProjectUnlink(project, container);\n\n const task = program.command('task').description('Manage tasks');\n registerTaskCreate(task, container);\n registerTaskList(task, container);\n registerTaskShow(task, container);\n registerTaskUpdate(task, container);\n registerTaskDelete(task, container);\n registerTaskBreakdown(task, container);\n registerTaskRank(task, container);\n registerTaskSearch(task, container);\n registerTaskExport(task, container);\n registerTaskImport(task, container);\n\n const dep = program.command('dep').description('Manage task dependencies');\n registerDepAdd(dep, container);\n registerDepRemove(dep, container);\n registerDepList(dep, container);\n registerDepGraph(dep, container);\n\n const analytic = program\n .command('analytic')\n .description('Analytic queries for productivity reporting');\n registerAnalyticSummary(analytic, container);\n registerAnalyticCompleted(analytic, container);\n\n registerUpgrade(program, container);\n\n program\n .command('tui')\n .description('Launch interactive terminal UI')\n .option('-p, --project <project>', 'Start with specific project')\n .action(async (opts: { project?: string }) => {\n const { launchTUI } = await import('../tui/index.js');\n await launchTUI(container, opts.project);\n });\n\n return program;\n}\n","import type { Result } from '../types/common.js';\nimport type { PresentedError } from '../types/presented-error.js';\n\nexport function printSuccess(data: unknown): void {\n process.stdout.write(JSON.stringify({ ok: true, data }, null, 2) + '\\n');\n}\n\nexport function printError(error: PresentedError): never {\n process.stderr.write(\n JSON.stringify({ ok: false, error: { code: error.code, message: error.message } }, null, 2) +\n '\\n',\n );\n process.exit(1);\n}\n\n/**\n * Generic helper that prints a successful result or delegates to a\n * service-specific presenter to format the error. The presenter is the\n * exhaustive switch; `handleResult` stays agnostic.\n */\nexport function handleResult<T, E>(\n result: Result<T, E>,\n presenter: (e: E) => PresentedError,\n): void {\n if (result.ok) {\n printSuccess(result.value);\n } else {\n printError(presenter(result.error));\n }\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\nimport { presentProjectServiceError } from '../../../service/errors.js';\n\nexport function registerProjectCreate(parent: Command, container: Container): void {\n parent\n .command('create')\n .description('Create a new project')\n .requiredOption('-n, --name <name>', 'Project name')\n .option(\n '-k, --key <key>',\n 'Project key (2-7 uppercase alphanumeric chars, defaults to first 3 chars of name)',\n )\n .option('-d, --description <description>', 'Project description')\n .option('--default', 'Set as default project')\n .option('--git-remote <url>', 'Git remote URL to associate with the project')\n .action(\n (opts: {\n name: string;\n key?: string;\n description?: string;\n default?: boolean;\n gitRemote?: string;\n }) => {\n const result = container.projectService.createProject({\n name: opts.name,\n key: opts.key,\n description: opts.description,\n isDefault: opts.default,\n gitRemote: opts.gitRemote,\n });\n handleResult(result, presentProjectServiceError);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\nimport { presentProjectServiceError } from '../../../service/errors.js';\n\nexport function registerProjectList(parent: Command, container: Container): void {\n parent\n .command('list')\n .description('List all projects')\n .action(() => {\n const result = container.projectService.listProjects();\n handleResult(result, presentProjectServiceError);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { presentProjectServiceError } from '../../../service/errors.js';\n\nexport function registerProjectUpdate(parent: Command, container: Container): void {\n parent\n .command('update <idOrKeyOrName>')\n .description('Update a project (lookup by id, key, or name)')\n .option('-n, --name <name>', 'Project name')\n .option('-d, --description <description>', 'Project description')\n .option('--default', 'Set as default project')\n .option('--git-remote <url>', 'Git remote URL (use --no-git-remote to unlink)')\n .option('--no-git-remote', 'Unlink git remote')\n .action(\n (\n idOrKeyOrName: string,\n opts: {\n name?: string;\n description?: string;\n default?: boolean;\n gitRemote?: string | false;\n },\n ) => {\n const resolved = container.projectService.resolveProject(idOrKeyOrName);\n if (!resolved.ok) return printError(presentProjectServiceError(resolved.error));\n const updateInput = {\n name: opts.name,\n description: opts.description,\n isDefault: opts.default,\n ...(opts.gitRemote === false\n ? { gitRemote: null }\n : typeof opts.gitRemote === 'string'\n ? { gitRemote: opts.gitRemote }\n : {}),\n };\n const result = container.projectService.updateProject(resolved.value.id, updateInput);\n handleResult(result, presentProjectServiceError);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { presentProjectServiceError } from '../../../service/errors.js';\n\nexport function registerProjectDelete(parent: Command, container: Container): void {\n parent\n .command('delete <idOrKeyOrName>')\n .description('Delete a project (lookup by id, key, or name)')\n .action((idOrKeyOrName: string) => {\n const resolved = container.projectService.resolveProject(idOrKeyOrName);\n if (!resolved.ok) return printError(presentProjectServiceError(resolved.error));\n const result = container.projectService.deleteProject(resolved.value.id);\n handleResult(result, presentProjectServiceError);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { presentProjectServiceError } from '../../../service/errors.js';\n\nexport function registerProjectSetDefault(parent: Command, container: Container): void {\n parent\n .command('set-default <idOrKeyOrName>')\n .description('Set a project as the default (lookup by id, key, or name)')\n .action((idOrKeyOrName: string) => {\n const resolved = container.projectService.resolveProject(idOrKeyOrName);\n if (!resolved.ok) return printError(presentProjectServiceError(resolved.error));\n const result = container.projectService.updateProject(resolved.value.id, {\n isDefault: true,\n });\n handleResult(result, presentProjectServiceError);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\nimport { presentProjectServiceError } from '../../../service/errors.js';\n\nexport function registerProjectLink(parent: Command, container: Container): void {\n parent\n .command('link <idOrKeyOrName>')\n .description('Link a project to a git remote (auto-detects from cwd if --remote omitted)')\n .option('-r, --remote <url>', 'Git remote URL')\n .action((idOrKeyOrName: string, opts: { remote?: string }) => {\n const result = container.projectService.linkGitRemote(idOrKeyOrName, opts.remote);\n handleResult(result, presentProjectServiceError);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\nimport { presentProjectServiceError } from '../../../service/errors.js';\n\nexport function registerProjectUnlink(parent: Command, container: Container): void {\n parent\n .command('unlink <idOrKeyOrName>')\n .description('Remove git remote link from a project')\n .action((idOrKeyOrName: string) => {\n const result = container.projectService.unlinkGitRemote(idOrKeyOrName);\n handleResult(result, presentProjectServiceError);\n });\n}\n","import type { Result } from '../../types/common.js';\nimport type { Project } from '../../types/project.js';\nimport type { ProjectServiceError } from '../../service/errors.js';\nimport type { Container } from '../container.js';\n\nexport function withProject(\n container: Container,\n projectIdOrName?: string,\n): Result<Project, ProjectServiceError> {\n return container.projectService.resolveProject(projectIdOrName);\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\nimport {\n presentProjectServiceError,\n presentTaskServiceError,\n} from '../../../service/errors.js';\n\nexport function registerTaskCreate(parent: Command, container: Container): void {\n parent\n .command('create')\n .description('Create a new task (appended to bottom of backlog)')\n .requiredOption('-n, --name <name>', 'Task name')\n .option('-p, --project <project>', 'Project id or name')\n .option('-d, --description <description>', 'Task description')\n .option('-t, --type <type>', 'Task type: release, story, tech-debt, bug', 'story')\n .option('-s, --status <status>', 'Task status', 'backlog')\n .option('--parent <parentId>', 'Parent task id for subtask')\n .option('--technical-notes <notes>', 'Technical notes (markdown)')\n .option('--additional-requirements <requirements>', 'Additional requirements (markdown)')\n .option('--depends-on <ids...>', 'Task ids this task depends on (blocks relationship)')\n .action(\n (opts: {\n name: string;\n project?: string;\n description?: string;\n type?: string;\n status?: string;\n parent?: string;\n technicalNotes?: string;\n additionalRequirements?: string;\n dependsOn?: string[];\n }) => {\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) {\n return printError(presentProjectServiceError(projectResult.error));\n }\n const result = container.taskService.createTask(\n {\n name: opts.name,\n description: opts.description,\n type: opts.type,\n status: opts.status,\n parentId: opts.parent,\n technicalNotes: opts.technicalNotes,\n additionalRequirements: opts.additionalRequirements,\n dependsOn: opts.dependsOn?.map((id) => ({ id })),\n },\n projectResult.value,\n );\n handleResult(result, presentTaskServiceError);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\nimport {\n presentProjectServiceError,\n presentTaskServiceError,\n} from '../../../service/errors.js';\n\nexport function registerTaskList(parent: Command, container: Container): void {\n parent\n .command('list')\n .description('List tasks in rank order (defaults to level 2 backlog tasks)')\n .option('-p, --project <project>', 'Filter by project id or name')\n .option('-s, --status <status>', 'Filter by status (default: backlog)')\n .option('-t, --type <type>', 'Filter by type (release, story, tech-debt, bug)')\n .option('-l, --level <level>', 'Filter by level (1=release, 2=work). Default: 2')\n .option('--parent <parentId>', 'Filter by parent task id')\n .option('--search <text>', 'Search in name, description, and notes')\n .action(\n (opts: {\n project?: string;\n status?: string;\n type?: string;\n level?: string;\n parent?: string;\n search?: string;\n }) => {\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) {\n return printError(presentProjectServiceError(projectResult.error));\n }\n const result = container.taskService.listTasks(projectResult.value, {\n status: opts.status ?? 'backlog',\n type: opts.type,\n level: opts.level ? parseInt(opts.level, 10) : undefined,\n parentId: opts.parent,\n search: opts.search,\n });\n handleResult(result, presentTaskServiceError);\n },\n );\n}\n","import type { Result } from '../../types/common.js';\nimport { ok, err } from '../../types/common.js';\nimport type { TaskId, ProjectId } from '../../types/branded.js';\nimport {\n TaskId as TaskIdCtor,\n ProjectId as ProjectIdCtor,\n isParseError,\n} from '../../types/branded.js';\nimport type { CliError } from '../../service/errors.js';\nimport { CliErr } from '../../service/errors.js';\n\n/**\n * Parse a raw CLI-provided task id into the branded type. Returns a\n * `CliError` with `kind: 'validation'` if the format is wrong — CLI\n * commands surface this to stderr via the normal error pipeline.\n */\nexport function parseTaskIdArg(raw: string): Result<TaskId, CliError> {\n const parsed = TaskIdCtor.parse(raw);\n if (isParseError(parsed)) {\n return err(CliErr.validation(parsed.detail));\n }\n return ok(parsed);\n}\n\nexport function parseProjectIdArg(raw: string): Result<ProjectId, CliError> {\n const parsed = ProjectIdCtor.parse(raw);\n if (isParseError(parsed)) {\n return err(CliErr.validation(parsed.detail));\n }\n return ok(parsed);\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { parseTaskIdArg } from '../../helpers/ids.js';\nimport { presentTaskServiceError, presentCliError } from '../../../service/errors.js';\n\nexport function registerTaskShow(parent: Command, container: Container): void {\n parent\n .command('show <id>')\n .description('Show task details')\n .action((rawId: string) => {\n const parsed = parseTaskIdArg(rawId);\n if (!parsed.ok) return printError(presentCliError(parsed.error));\n handleResult(container.taskService.getTask(parsed.value), presentTaskServiceError);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { parseTaskIdArg } from '../../helpers/ids.js';\nimport { presentTaskServiceError, presentCliError } from '../../../service/errors.js';\n\nexport function registerTaskUpdate(parent: Command, container: Container): void {\n parent\n .command('update <id>')\n .description('Update a task')\n .option('-n, --name <name>', 'Task name')\n .option('-d, --description <description>', 'Task description')\n .option('-t, --type <type>', 'Task type: release, story, tech-debt, bug')\n .option('-s, --status <status>', 'Task status')\n .option('--parent <parentId>', 'Parent task id')\n .option('--detach-parent', 'Remove the parent from this task')\n .option('--technical-notes <notes>', 'Replace technical notes')\n .option('--additional-requirements <requirements>', 'Replace additional requirements')\n .option('--append-notes <notes>', 'Append to technical notes')\n .option('--append-requirements <requirements>', 'Append to additional requirements')\n .action(\n (\n rawId: string,\n opts: {\n name?: string;\n description?: string;\n type?: string;\n status?: string;\n parent?: string;\n detachParent?: boolean;\n technicalNotes?: string;\n additionalRequirements?: string;\n appendNotes?: string;\n appendRequirements?: string;\n },\n ) => {\n if (opts.detachParent && opts.parent) {\n console.error('Cannot use --detach-parent and --parent together');\n process.exit(1);\n }\n const parsed = parseTaskIdArg(rawId);\n if (!parsed.ok) return printError(presentCliError(parsed.error));\n const result = container.taskService.updateTask(parsed.value, {\n name: opts.name,\n description: opts.description,\n type: opts.type,\n status: opts.status,\n parentId: opts.detachParent ? null : opts.parent,\n technicalNotes: opts.technicalNotes,\n additionalRequirements: opts.additionalRequirements,\n appendNotes: opts.appendNotes,\n appendRequirements: opts.appendRequirements,\n });\n handleResult(result, presentTaskServiceError);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { parseTaskIdArg } from '../../helpers/ids.js';\nimport { presentTaskServiceError, presentCliError } from '../../../service/errors.js';\n\nexport function registerTaskDelete(parent: Command, container: Container): void {\n parent\n .command('delete <id>')\n .description('Delete a task')\n .action((rawId: string) => {\n const parsed = parseTaskIdArg(rawId);\n if (!parsed.ok) return printError(presentCliError(parsed.error));\n handleResult(container.taskService.deleteTask(parsed.value), presentTaskServiceError);\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { parseTaskIdArg } from '../../helpers/ids.js';\nimport {\n CliErr,\n presentCliError,\n presentTaskServiceError,\n} from '../../../service/errors.js';\n\nexport function registerTaskBreakdown(parent: Command, container: Container): void {\n parent\n .command('breakdown <parentId>')\n .description('Create subtasks from a JSON file')\n .requiredOption('-f, --file <path>', 'JSON file with array of subtask definitions')\n .action((rawParentId: string, opts: { file: string }) => {\n let content: string;\n try {\n content = readFileSync(opts.file, 'utf-8');\n } catch {\n return printError(\n presentCliError(CliErr.validation(`Failed to read subtasks file: ${opts.file}`)),\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n return printError(\n presentCliError(CliErr.validation(`Invalid JSON in subtasks file: ${opts.file}`)),\n );\n }\n\n if (!Array.isArray(parsed)) {\n return printError(\n presentCliError(CliErr.validation('File must contain a JSON array of subtasks')),\n );\n }\n\n const parsedId = parseTaskIdArg(rawParentId);\n if (!parsedId.ok) return printError(presentCliError(parsedId.error));\n handleResult(\n container.taskService.breakdownTask(parsedId.value, parsed),\n presentTaskServiceError,\n );\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\nimport {\n presentProjectServiceError,\n presentTaskServiceError,\n} from '../../../service/errors.js';\n\nexport function registerTaskRank(parent: Command, container: Container): void {\n parent\n .command('rank <id>')\n .description('Re-rank a task in the backlog (Jira-style positioning)')\n .option('--after <taskId>', 'Place immediately after this task')\n .option('--before <taskId>', 'Place immediately before this task')\n .option('--position <n>', 'Place at 1-based position in backlog')\n .option('--top', 'Move to the top of active tasks')\n .option('--bottom', 'Move to the bottom of active tasks (above done tasks)')\n .option('-p, --project <project>', 'Project id or name')\n .action(\n (\n rawId: string,\n opts: {\n after?: string;\n before?: string;\n position?: string;\n top?: boolean;\n bottom?: boolean;\n project?: string;\n },\n ) => {\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) {\n return printError(presentProjectServiceError(projectResult.error));\n }\n const result = container.taskService.rerankTask(\n {\n taskId: rawId,\n afterId: opts.after,\n beforeId: opts.before,\n position: opts.position ? parseInt(opts.position, 10) : undefined,\n top: opts.top,\n bottom: opts.bottom,\n },\n projectResult.value,\n );\n handleResult(result, presentTaskServiceError);\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\nimport {\n presentProjectServiceError,\n presentTaskServiceError,\n} from '../../../service/errors.js';\n\nexport function registerTaskSearch(parent: Command, container: Container): void {\n parent\n .command('search <query>')\n .description('Full-text search tasks with relevance ranking (FTS5)')\n .option('-p, --project <project>', 'Limit search to a project')\n .action((query: string, opts: { project?: string }) => {\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) {\n return printError(presentProjectServiceError(projectResult.error));\n }\n const result = container.taskService.searchTasks(query, projectResult.value);\n handleResult(result, presentTaskServiceError);\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { printSuccess, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\nimport {\n CliErr,\n presentCliError,\n presentPortabilityServiceError,\n presentProjectServiceError,\n} from '../../../service/errors.js';\n\nexport function registerTaskExport(parent: Command, container: Container): void {\n parent\n .command('export')\n .description('Export tasks to JSON file')\n .option('-p, --project <project>', 'Project id or name')\n .option('-o, --output <file>', 'Output file path (defaults to stdout)')\n .action((opts: { project?: string; output?: string }) => {\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) {\n return printError(presentProjectServiceError(projectResult.error));\n }\n const result = container.portabilityService.exportTasks(projectResult.value);\n if (!result.ok) {\n return printError(presentPortabilityServiceError(result.error));\n }\n\n if (opts.output) {\n try {\n writeFileSync(opts.output, JSON.stringify(result.value, null, 2) + '\\n', 'utf-8');\n } catch {\n return printError(presentCliError(CliErr.io(`Failed to write file: ${opts.output}`)));\n }\n printSuccess({\n file: opts.output,\n tasks: result.value.tasks.length,\n dependencies: result.value.dependencies.length,\n });\n } else {\n printSuccess(result.value);\n }\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { parseFieldMapping } from '../../../types/portability.js';\nimport { withProject } from '../../helpers/project.js';\nimport {\n CliErr,\n presentCliError,\n presentPortabilityServiceError,\n presentProjectServiceError,\n} from '../../../service/errors.js';\n\nexport function registerTaskImport(parent: Command, container: Container): void {\n parent\n .command('import')\n .description('Import tasks from JSON file')\n .requiredOption('-f, --file <file>', 'Input JSON file path')\n .option('-p, --project <project>', 'Target project id or name')\n .option(\n '--map <mapping>',\n 'Field mapping as comma-separated source:target pairs (e.g. \"title:name,summary:description\")',\n )\n .action((opts: { file: string; project?: string; map?: string }) => {\n let fileData: unknown;\n try {\n const raw = readFileSync(opts.file, 'utf-8');\n fileData = JSON.parse(raw);\n } catch (e) {\n const detail = `Failed to read or parse file: ${opts.file}${e instanceof Error ? ` - ${e.message}` : ''}`;\n return printError(presentCliError(CliErr.validation(detail)));\n }\n\n const fieldMapping = opts.map ? parseFieldMapping(opts.map) : undefined;\n\n const projectResult = withProject(container, opts.project);\n if (!projectResult.ok) {\n return printError(presentProjectServiceError(projectResult.error));\n }\n const result = container.portabilityService.importTasks(\n fileData,\n projectResult.value,\n fieldMapping,\n );\n handleResult(result, presentPortabilityServiceError);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\nimport { presentDependencyServiceError } from '../../../service/errors.js';\n\nexport function registerDepAdd(parent: Command, container: Container): void {\n parent\n .command('add <taskId> <dependsOnId>')\n .description('Add a dependency (taskId depends on dependsOnId)')\n .option(\n '-t, --type <type>',\n 'Dependency type: blocks, relates-to, duplicates, blocked-by',\n 'blocks',\n )\n .action((rawTaskId: string, rawDependsOnId: string, opts: { type?: string }) => {\n const result = container.dependencyService.addDependency({\n taskId: rawTaskId,\n dependsOnId: rawDependsOnId,\n type: opts.type,\n });\n handleResult(result, presentDependencyServiceError);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult } from '../../output.js';\nimport { presentDependencyServiceError } from '../../../service/errors.js';\n\nexport function registerDepRemove(parent: Command, container: Container): void {\n parent\n .command('remove <taskId> <dependsOnId>')\n .description('Remove a dependency')\n .action((rawTaskId: string, rawDependsOnId: string) => {\n const result = container.dependencyService.removeDependency({\n taskId: rawTaskId,\n dependsOnId: rawDependsOnId,\n });\n handleResult(result, presentDependencyServiceError);\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { parseTaskIdArg } from '../../helpers/ids.js';\nimport {\n presentCliError,\n presentDependencyServiceError,\n} from '../../../service/errors.js';\n\nexport function registerDepList(parent: Command, container: Container): void {\n parent\n .command('list <taskId>')\n .description('List direct dependencies of a task')\n .option('--blockers', 'Show tasks that block this task')\n .option('--dependents', 'Show tasks that depend on this task')\n .option('--transitive', 'Show all transitive blockers (deep)')\n .action(\n (\n rawTaskId: string,\n opts: { blockers?: boolean; dependents?: boolean; transitive?: boolean },\n ) => {\n const parsed = parseTaskIdArg(rawTaskId);\n if (!parsed.ok) return printError(presentCliError(parsed.error));\n const id = parsed.value;\n if (opts.transitive) {\n handleResult(\n container.dependencyService.getTransitiveDeps(id),\n presentDependencyServiceError,\n );\n } else if (opts.dependents) {\n handleResult(\n container.dependencyService.listDependents(id),\n presentDependencyServiceError,\n );\n } else if (opts.blockers) {\n handleResult(\n container.dependencyService.listBlockers(id),\n presentDependencyServiceError,\n );\n } else {\n handleResult(\n container.dependencyService.listAllDeps(id),\n presentDependencyServiceError,\n );\n }\n },\n );\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { parseTaskIdArg } from '../../helpers/ids.js';\nimport {\n presentCliError,\n presentDependencyServiceError,\n} from '../../../service/errors.js';\n\nexport function registerDepGraph(parent: Command, container: Container): void {\n parent\n .command('graph <taskId>')\n .description('Build full dependency graph centered on a task (outputs Mermaid)')\n .action((rawTaskId: string) => {\n const parsed = parseTaskIdArg(rawTaskId);\n if (!parsed.ok) return printError(presentCliError(parsed.error));\n handleResult(\n container.dependencyService.buildGraph(parsed.value),\n presentDependencyServiceError,\n );\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../container.js';\nimport { printSuccess, printError } from '../output.js';\nimport { APP_VERSION } from '../../version.js';\nimport { presentUpdateServiceError } from '../../service/errors.js';\n\nexport function registerUpgrade(program: Command, container: Container): void {\n program\n .command('upgrade')\n .description('Check for updates and upgrade to the latest version')\n .action(async () => {\n const checkResult = await container.updateService.checkForUpdate(APP_VERSION);\n if (!checkResult.ok) {\n printError(presentUpdateServiceError(checkResult.error));\n return;\n }\n\n if (!checkResult.value.updateAvailable) {\n printSuccess({\n message: 'Already up to date',\n currentVersion: checkResult.value.currentVersion,\n });\n return;\n }\n\n process.stderr.write(\n `Upgrading from ${checkResult.value.currentVersion} to ${checkResult.value.latestVersion}...\\n`,\n );\n\n const upgradeResult = container.updateService.performUpgrade(APP_VERSION);\n if (!upgradeResult.ok) {\n printError(presentUpdateServiceError(upgradeResult.error));\n return;\n }\n\n printSuccess({\n message: 'Upgrade complete',\n previousVersion: checkResult.value.currentVersion,\n installedVersion: upgradeResult.value.installedVersion,\n });\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\nimport {\n presentAnalyticServiceError,\n presentProjectServiceError,\n} from '../../../service/errors.js';\n\nexport function registerAnalyticSummary(parent: Command, container: Container): void {\n parent\n .command('summary')\n .description('Productivity summary over a rolling period')\n .option('-p, --project <project>', 'Project id or name')\n .requiredOption('--period <period>', 'Period: day | week')\n .action((opts: { project?: string; period: string }) => {\n const proj = withProject(container, opts.project);\n if (!proj.ok) return printError(presentProjectServiceError(proj.error));\n handleResult(\n container.analyticService.summary({ period: opts.period }, proj.value),\n presentAnalyticServiceError,\n );\n });\n}\n","import { Command } from 'commander';\nimport type { Container } from '../../container.js';\nimport { handleResult, printError } from '../../output.js';\nimport { withProject } from '../../helpers/project.js';\nimport {\n presentAnalyticServiceError,\n presentProjectServiceError,\n} from '../../../service/errors.js';\n\nexport function registerAnalyticCompleted(parent: Command, container: Container): void {\n parent\n .command('completed')\n .description('Tasks completed within a rolling window')\n .option('-p, --project <project>', 'Project id or name')\n .requiredOption('--since <duration>', 'Window length, e.g. 24h, 7d, 2w')\n .action((opts: { project?: string; since: string }) => {\n const proj = withProject(container, opts.project);\n if (!proj.ok) return printError(presentProjectServiceError(proj.error));\n handleResult(\n container.analyticService.listCompleted({ since: opts.since }, proj.value),\n presentAnalyticServiceError,\n );\n });\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { logger } from '../logging/logger.js';\nimport { InstallId } from '../types/install-id.js';\n\nfunction toMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\nimport { isCI } from '../utils/ci.js';\nimport type { FetchFn } from '../types/common.js';\n\nconst HEARTBEAT_URL = 'https://tayto-telemetry.tomkapa.workers.dev/api/heartbeat';\nconst TIMEOUT_MS = 3000;\n\ninterface TelemetryState {\n installId: InstallId;\n lastPingDate: string;\n}\n\nfunction isValidRawState(value: unknown): value is { installId: string; lastPingDate: string } {\n if (typeof value !== 'object' || value === null) return false;\n const obj = value as Record<string, unknown>;\n return typeof obj['installId'] === 'string' && typeof obj['lastPingDate'] === 'string';\n}\n\nexport function todayUTC(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nasync function readState(statePath: string): Promise<TelemetryState | null> {\n let raw: string;\n try {\n raw = await readFile(statePath, 'utf-8');\n } catch (e: unknown) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn('telemetry: failed to read state', { error: toMessage(e), path: statePath });\n }\n return null;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!isValidRawState(parsed)) return null;\n return { installId: InstallId.parse(parsed.installId), lastPingDate: parsed.lastPingDate };\n } catch (e: unknown) {\n logger.warn('telemetry: corrupt state file, will regenerate', {\n error: toMessage(e),\n path: statePath,\n });\n return null;\n }\n}\n\nasync function writeState(\n statePath: string,\n state: { installId: string; lastPingDate: string },\n): Promise<void> {\n try {\n await writeFile(statePath, JSON.stringify(state), 'utf-8');\n } catch (e: unknown) {\n logger.warn('telemetry: failed to write state', { error: toMessage(e), path: statePath });\n }\n}\n\nexport interface HeartbeatDeps {\n statePath: string;\n version: string;\n fetchImpl?: FetchFn;\n env?: Record<string, string | undefined>;\n}\n\n/**\n * Sends at most one anonymous heartbeat ping per calendar day (UTC).\n * Fire-and-forget: never blocks, never throws.\n */\nexport function maybeSendHeartbeat(deps: HeartbeatDeps): void {\n const { statePath, version, fetchImpl = globalThis.fetch, env = process.env } = deps;\n\n void (async () => {\n try {\n if (env['TASKCLI_TELEMETRY_DISABLED'] === '1') {\n logger.info('telemetry: disabled via TASKCLI_TELEMETRY_DISABLED');\n return;\n }\n\n if (isCI(env)) {\n logger.info('telemetry: skipped in CI environment');\n return;\n }\n\n const today = todayUTC();\n const state = await readState(statePath);\n\n if (state && state.lastPingDate === today) {\n return;\n }\n\n const installId = state ? state.installId : InstallId.generate();\n\n // Write today's date before sending so at most one attempt per day even if the endpoint is down\n await writeState(statePath, { installId: installId.toString(), lastPingDate: today });\n\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, TIMEOUT_MS);\n timeout.unref();\n\n const payload = {\n installId: installId.toString(),\n version,\n os: process.platform,\n nodeVersion: process.version,\n timestamp: new Date().toISOString(),\n };\n\n fetchImpl(HEARTBEAT_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: controller.signal,\n })\n .then(() => {\n clearTimeout(timeout);\n logger.info('telemetry: heartbeat sent', { installId: installId.toString() });\n })\n .catch((e: unknown) => {\n clearTimeout(timeout);\n logger.info('telemetry: heartbeat failed (non-blocking)', { error: toMessage(e) });\n });\n } catch (e: unknown) {\n logger.warn('telemetry: unexpected error in maybeSendHeartbeat', { error: toMessage(e) });\n }\n })();\n}\n","import assert from 'node:assert';\nimport { ulid } from 'ulid';\n\nconst ULID_REGEX = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n\n/**\n * Value object representing an anonymous installation identifier.\n * Generated once per install, stored locally, and used for telemetry deduplication.\n */\nexport class InstallId {\n readonly value: string;\n\n private constructor(id: string) {\n this.value = id;\n }\n\n static generate(): InstallId {\n return new InstallId(ulid());\n }\n\n static parse(raw: string): InstallId {\n const trimmed = raw.trim();\n assert(ULID_REGEX.test(trimmed), `Invalid InstallId: expected ULID format, got \"${trimmed}\"`);\n return new InstallId(trimmed.toUpperCase());\n }\n\n toString(): string {\n return this.value;\n }\n}\n","const CI_ENV_VARS = [\n 'CI',\n 'GITHUB_ACTIONS',\n 'JENKINS_URL',\n 'GITLAB_CI',\n 'CIRCLECI',\n 'BUILDKITE',\n 'TF_BUILD',\n 'CODEBUILD_BUILD_ID',\n] as const;\n\n/**\n * Detects whether the current process is running in a CI environment\n * by checking common CI provider environment variables.\n */\nexport function isCI(env: Record<string, string | undefined> = process.env): boolean {\n return CI_ENV_VARS.some((key) => {\n const val = env[key];\n return val !== undefined && val !== '';\n });\n}\n","import { loadConfig } from './config/index.js';\nimport { createDatabase } from './db/connection.js';\nimport { runMigrations } from './db/migrator.js';\nimport { initTelemetry, shutdownTelemetry } from './logging/telemetry.js';\nimport { logger } from './logging/logger.js';\nimport { createContainer } from './cli/container.js';\nimport type { Container } from './cli/container.js';\nimport { createSqliteRepositorySet } from './repository/index.js';\nimport { buildCLI } from './cli/index.js';\nimport { APP_VERSION } from './version.js';\nimport type { UpdateCheckResult } from './service/update.service.js';\nimport { maybeSendHeartbeat } from './telemetry/heartbeat.js';\n\nasync function checkForUpdateQuietly(\n container: Container,\n currentVersion: string,\n): Promise<UpdateCheckResult | null> {\n let timerId: ReturnType<typeof setTimeout> | undefined;\n try {\n const result = await Promise.race([\n container.updateService.checkForUpdate(currentVersion),\n new Promise<null>((resolve) => {\n timerId = setTimeout(() => {\n resolve(null);\n }, 2000);\n }),\n ]);\n clearTimeout(timerId);\n if (result !== null && result.ok) {\n return result.value;\n }\n return null;\n } catch {\n clearTimeout(timerId);\n return null;\n }\n}\n\nasync function main(): Promise<void> {\n const config = loadConfig();\n logger.init(config.logDir);\n initTelemetry(config);\n\n maybeSendHeartbeat({ statePath: config.telemetryStatePath, version: APP_VERSION });\n\n const db = createDatabase(config.dbPath);\n runMigrations(db);\n\n const repos = createSqliteRepositorySet(db);\n const container = createContainer(repos, {\n dbPath: config.dbPath,\n updateCachePath: config.updateCachePath,\n dismissedGitRemotesPath: config.dismissedGitRemotesPath,\n });\n\n const args = process.argv.slice(2);\n const isUpgradeCommand = args[0] === 'upgrade';\n\n let updateCheck: UpdateCheckResult | null = null;\n if (!config.noUpdateCheck && !isUpgradeCommand) {\n updateCheck = await checkForUpdateQuietly(container, APP_VERSION);\n }\n\n if (args.length === 0) {\n const { launchTUI } = await import('./tui/index.js');\n await launchTUI(\n container,\n undefined,\n updateCheck?.updateAvailable ? updateCheck.latestVersion : undefined,\n );\n } else {\n if (updateCheck?.updateAvailable) {\n process.stderr.write(\n `\\x1b[33m[tayto]\\x1b[0m Update available: ${updateCheck.currentVersion} → ${updateCheck.latestVersion}. Run: tayto upgrade\\n`,\n );\n }\n const program = buildCLI(container);\n await program.parseAsync(process.argv);\n }\n\n db.close();\n await shutdownTelemetry();\n}\n\nmain().catch((e: unknown) => {\n // Top-level crash handler: assertion failures and unexpected rejections\n // land here. Present a best-effort `{code, message}` and exit non-zero.\n const message = e instanceof Error ? e.message : 'Unknown error';\n process.stderr.write(\n JSON.stringify({ ok: false, error: { code: 'UNKNOWN', message } }, null, 2) + '\\n',\n );\n process.exit(1);\n});\n"],"mappings":"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","names":["join","join","join","z","z","z","z","updateResult","z","z","z","readFileSync","updateAvailable","readFileSync","z","join","assert","assert","assert","assert","assert","assert","params","sql","rows","assert","isUniqueConstraint","transientFrom","assert","assert","transientFrom","assert","assert","readFileSync","readFileSync","writeFileSync","writeFileSync","readFileSync","readFileSync","assert","ulid","toMessage"]}