@tomkapa/tayto 0.1.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/README.md +217 -0
- package/dist/chunk-6NQOFUIQ.js +133 -0
- package/dist/chunk-6NQOFUIQ.js.map +1 -0
- package/dist/index.js +1962 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/001_initial.sql +37 -0
- package/dist/migrations/002_dependencies_and_fts.sql +47 -0
- package/dist/migrations/003_soft_delete.sql +39 -0
- package/dist/tui-JNZRBEIQ.js +2352 -0
- package/dist/tui-JNZRBEIQ.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tui/index.tsx","../src/tui/components/App.tsx","../src/tui/types.ts","../src/tui/state.ts","../src/tui/theme.ts","../src/tui/constants.ts","../src/tui/components/Header.tsx","../src/tui/components/Crumbs.tsx","../src/tui/components/FlashMessage.tsx","../src/tui/components/TaskList.tsx","../src/tui/components/TaskDetail.tsx","../src/tui/components/Markdown.tsx","../src/tui/mermaid.ts","../src/tui/components/TaskForm.tsx","../src/tui/editor.ts","../src/tui/components/TaskPicker.tsx","../src/tui/components/ProjectSelector.tsx","../src/tui/components/ProjectForm.tsx","../src/tui/components/HelpOverlay.tsx","../src/tui/components/ConfirmDialog.tsx","../src/tui/components/DependencyList.tsx"],"sourcesContent":["import { render } from 'ink';\nimport type { Container } from '../cli/container.js';\nimport { App } from './components/App.js';\n\nexport async function launchTUI(container: Container, initialProject?: string): Promise<void> {\n const instance = render(<App container={container} initialProject={initialProject} />, {\n exitOnCtrlC: true,\n });\n\n await instance.waitUntilExit();\n}\n","import { useReducer, useEffect, useCallback, useMemo } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport type { Container } from '../../cli/container.js';\nimport { TaskStatus, TaskType, DependencyType, isTerminalStatus } from '../../types/enums.js';\nimport type { Task, DependencyEntry } from '../../types/task.js';\nimport type { Project } from '../../types/project.js';\nimport { ViewType } from '../types.js';\nimport { appReducer, initialState } from '../state.js';\nimport { STATUS_VALUES, TYPE_VALUES } from '../constants.js';\nimport { Header } from './Header.js';\nimport { Crumbs } from './Crumbs.js';\nimport { FlashMessage } from './FlashMessage.js';\nimport { TaskList } from './TaskList.js';\nimport { TaskDetail } from './TaskDetail.js';\nimport { TaskForm } from './TaskForm.js';\nimport { ProjectSelector } from './ProjectSelector.js';\nimport { ProjectForm } from './ProjectForm.js';\nimport { HelpOverlay } from './HelpOverlay.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\nimport { DependencyList } from './DependencyList.js';\nimport { openAllMermaidDiagrams } from './Markdown.js';\nimport { theme } from '../theme.js';\nimport { logger } from '../../logging/logger.js';\n\ninterface Props {\n container: Container;\n initialProject?: string | undefined;\n}\n\nconst STATUS_CYCLE: TaskStatus[] = [\n TaskStatus.Backlog,\n TaskStatus.Todo,\n TaskStatus.InProgress,\n TaskStatus.Review,\n TaskStatus.Done,\n];\n\nexport function App({ container, initialProject }: Props) {\n const { exit } = useApp();\n const [state, dispatch] = useReducer(appReducer, initialState);\n\n const loadProjects = useCallback(() => {\n const result = container.projectService.listProjects();\n if (result.ok) {\n logger.info(`TUI.loadProjects: loaded ${result.value.length} projects`);\n dispatch({ type: 'SET_PROJECTS', projects: result.value });\n } else {\n logger.error('TUI.loadProjects: failed', result.error);\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n }, [container]);\n\n const loadTasks = useCallback(() => {\n logger.startSpan('TUI.loadTasks', () => {\n const filter = { ...state.filter };\n if (state.activeProject) {\n filter.projectId = state.activeProject.id;\n }\n const result = container.taskService.listTasks(filter);\n if (result.ok) {\n logger.info(`TUI.loadTasks: loaded ${result.value.length} tasks`);\n dispatch({ type: 'SET_TASKS', tasks: result.value });\n } else {\n logger.error('TUI.loadTasks: failed', result.error);\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n });\n }, [container, state.filter, state.activeProject]);\n\n const loadDeps = useCallback(\n (taskId: string) => {\n const blockersResult = container.dependencyService.listBlockers(taskId);\n const dependentsResult = container.dependencyService.listDependents(taskId);\n const relatedResult = container.dependencyService.listRelated(taskId);\n const duplicatesResult = container.dependencyService.listDuplicates(taskId);\n dispatch({\n type: 'SET_DEPS',\n blockers: blockersResult.ok ? blockersResult.value : [],\n dependents: dependentsResult.ok ? dependentsResult.value : [],\n related: relatedResult.ok ? relatedResult.value : [],\n duplicates: duplicatesResult.ok ? duplicatesResult.value : [],\n });\n },\n [container],\n );\n\n const cycleStatus = useCallback(\n (task: Task) => {\n const currentIndex = STATUS_CYCLE.indexOf(task.status);\n const nextStatus = STATUS_CYCLE[(currentIndex + 1) % STATUS_CYCLE.length];\n if (!nextStatus) return;\n\n const result = container.taskService.updateTask(task.id, { status: nextStatus });\n if (result.ok) {\n dispatch({ type: 'FLASH', message: `Status -> ${nextStatus}`, level: 'info' });\n if (state.selectedTask?.id === task.id) {\n dispatch({ type: 'SELECT_TASK', task: result.value });\n }\n loadTasks();\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n },\n [container, state.selectedTask, loadTasks],\n );\n\n const saveReorder = useCallback(() => {\n const tasks = state.tasks;\n const idx = state.selectedIndex;\n const task = tasks[idx];\n if (!task) return;\n\n const prev = tasks[idx - 1];\n const next = tasks[idx + 1];\n\n // Use after/before positioning so the service computes the rank\n const result = prev\n ? container.taskService.rerankTask({ taskId: task.id, afterId: prev.id })\n : next\n ? container.taskService.rerankTask({ taskId: task.id, beforeId: next.id })\n : container.taskService.rerankTask({ taskId: task.id, position: 1 });\n\n dispatch({ type: 'EXIT_REORDER', save: result.ok });\n dispatch({\n type: 'FLASH',\n message: result.ok ? 'Rank saved' : result.error.message,\n level: result.ok ? 'info' : 'error',\n });\n loadTasks();\n }, [container, state.tasks, state.selectedIndex, loadTasks]);\n\n // Initial load\n useEffect(() => {\n loadProjects();\n }, [loadProjects]);\n\n // Resolve initial project\n useEffect(() => {\n if (state.projects.length > 0 && !state.activeProject) {\n logger.info(`TUI.resolveProject: resolving initialProject=${initialProject ?? '(default)'}`);\n const result = container.projectService.resolveProject(initialProject);\n if (result.ok) {\n logger.info(\n `TUI.resolveProject: resolved to key=${result.value.key} name=${result.value.name}`,\n );\n dispatch({ type: 'SET_ACTIVE_PROJECT', project: result.value });\n } else {\n logger.error('TUI.resolveProject: failed', result.error);\n const fallback = state.projects[0] ?? null;\n logger.info(`TUI.resolveProject: falling back to ${fallback?.name ?? 'null'}`);\n dispatch({ type: 'SET_ACTIVE_PROJECT', project: fallback });\n }\n }\n }, [state.projects, state.activeProject, initialProject, container]);\n\n // Reload tasks when project or filter changes\n useEffect(() => {\n if (state.activeProject) {\n loadTasks();\n }\n }, [state.activeProject, state.filter, loadTasks]);\n\n // Auto-clear flash\n useEffect(() => {\n if (state.flash) {\n const timer = setTimeout(() => {\n dispatch({ type: 'CLEAR_FLASH' });\n }, 3000);\n return () => {\n clearTimeout(timer);\n };\n }\n return undefined;\n }, [state.flash]);\n\n // Keyboard handler\n useInput((input, key) => {\n // Handle confirm delete dialog\n if (state.confirmDelete) {\n if (input === 'y') {\n const result = container.taskService.deleteTask(state.confirmDelete.id);\n if (result.ok) {\n dispatch({ type: 'FLASH', message: 'Task deleted', level: 'info' });\n dispatch({ type: 'CANCEL_DELETE' });\n if (state.activeView === ViewType.TaskDetail) {\n dispatch({ type: 'GO_BACK' });\n }\n loadTasks();\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n dispatch({ type: 'CANCEL_DELETE' });\n }\n } else if (input === 'n' || key.escape) {\n dispatch({ type: 'CANCEL_DELETE' });\n }\n return;\n }\n\n // Help view - any key closes\n if (state.activeView === ViewType.Help) {\n dispatch({ type: 'GO_BACK' });\n return;\n }\n\n // Form/selector views handle their own input\n if (\n state.activeView === ViewType.TaskCreate ||\n state.activeView === ViewType.TaskEdit ||\n state.activeView === ViewType.ProjectSelector ||\n state.activeView === ViewType.ProjectCreate\n ) {\n return;\n }\n\n // Dep add-input mode: handle inline then return\n if (state.activeView === ViewType.DependencyList && state.isAddingDep) {\n if (key.escape) {\n dispatch({ type: 'SET_ADDING_DEP', active: false });\n return;\n }\n if (key.return && state.addDepInput.trim() && state.selectedTask) {\n // Format: \"TASK-ID\" or \"TASK-ID:relates-to\" or \"TASK-ID:duplicates\"\n const raw = state.addDepInput.trim();\n const colonIdx = raw.lastIndexOf(':');\n const validTypes = new Set(['blocks', 'relates-to', 'duplicates']);\n let depId: string;\n let depType: string | undefined;\n if (colonIdx > 0) {\n const maybetype = raw.slice(colonIdx + 1);\n if (validTypes.has(maybetype)) {\n depId = raw.slice(0, colonIdx);\n depType = maybetype;\n } else {\n depId = raw;\n }\n } else {\n depId = raw;\n }\n const result = container.dependencyService.addDependency({\n taskId: state.selectedTask.id,\n dependsOnId: depId,\n type: depType,\n });\n if (result.ok) {\n dispatch({ type: 'FLASH', message: 'Dependency added', level: 'info' });\n loadDeps(state.selectedTask.id);\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n dispatch({ type: 'SET_ADDING_DEP', active: false });\n return;\n }\n if (key.backspace || key.delete) {\n dispatch({ type: 'SET_ADD_DEP_INPUT', input: state.addDepInput.slice(0, -1) });\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n dispatch({ type: 'SET_ADD_DEP_INPUT', input: state.addDepInput + input });\n return;\n }\n return;\n }\n\n // Search mode\n if (state.isSearchActive) {\n if (key.escape) {\n dispatch({ type: 'SET_SEARCH_ACTIVE', active: false });\n dispatch({ type: 'SET_SEARCH_QUERY', query: '' });\n dispatch({ type: 'SET_FILTER', filter: { search: undefined } });\n return;\n }\n if (key.return) {\n dispatch({ type: 'SET_SEARCH_ACTIVE', active: false });\n dispatch({ type: 'SET_FILTER', filter: { search: state.searchQuery || undefined } });\n return;\n }\n if (key.backspace || key.delete) {\n dispatch({ type: 'SET_SEARCH_QUERY', query: state.searchQuery.slice(0, -1) });\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n dispatch({ type: 'SET_SEARCH_QUERY', query: state.searchQuery + input });\n return;\n }\n return;\n }\n\n // Reorder mode\n if (state.isReordering) {\n if (key.upArrow || input === 'k') {\n dispatch({ type: 'REORDER_MOVE', direction: 'up' });\n return;\n }\n if (key.downArrow || input === 'j') {\n dispatch({ type: 'REORDER_MOVE', direction: 'down' });\n return;\n }\n if (key.rightArrow) {\n saveReorder();\n return;\n }\n if (key.escape || key.leftArrow) {\n dispatch({ type: 'EXIT_REORDER', save: false });\n dispatch({ type: 'FLASH', message: 'Reorder cancelled', level: 'info' });\n return;\n }\n return;\n }\n\n // Global\n if (input === 'q' && state.activeView === ViewType.TaskList && state.focusedPanel === 'list') {\n exit();\n return;\n }\n if (input === 'q' || key.escape) {\n // In split view with detail focused: escape/q returns focus to list\n if (state.activeView === ViewType.TaskList && state.focusedPanel === 'detail') {\n dispatch({ type: 'SET_PANEL_FOCUS', panel: 'list' });\n return;\n }\n dispatch({ type: 'GO_BACK' });\n return;\n }\n if (input === '?') {\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.Help });\n return;\n }\n\n // Tab: toggle panel focus in split view\n if (key.tab && state.activeView === ViewType.TaskList && previewTask) {\n dispatch({\n type: 'SET_PANEL_FOCUS',\n panel: state.focusedPanel === 'list' ? 'detail' : 'list',\n });\n return;\n }\n\n // Task List — list panel focused\n if (state.activeView === ViewType.TaskList && state.focusedPanel === 'list') {\n if (key.upArrow || input === 'k') {\n dispatch({ type: 'MOVE_CURSOR', direction: 'up' });\n return;\n }\n if (key.downArrow || input === 'j') {\n dispatch({ type: 'MOVE_CURSOR', direction: 'down' });\n return;\n }\n // g = go to top, G = go to bottom\n if (input === 'g') {\n dispatch({ type: 'SET_CURSOR', index: 0 });\n return;\n }\n if (input === 'G') {\n dispatch({ type: 'SET_CURSOR', index: state.tasks.length - 1 });\n return;\n }\n if (key.return) {\n const task = state.tasks[state.selectedIndex];\n if (task) {\n dispatch({ type: 'SELECT_TASK', task });\n loadDeps(task.id);\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskDetail });\n }\n return;\n }\n if (input === 'c') {\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskCreate });\n return;\n }\n if (input === 'e') {\n const task = state.tasks[state.selectedIndex];\n if (task) {\n dispatch({ type: 'SELECT_TASK', task });\n loadDeps(task.id);\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskEdit });\n }\n return;\n }\n if (input === 'd') {\n const task = state.tasks[state.selectedIndex];\n if (task) {\n dispatch({ type: 'CONFIRM_DELETE', task });\n }\n return;\n }\n if (input === 's') {\n const task = state.tasks[state.selectedIndex];\n if (task) {\n cycleStatus(task);\n }\n return;\n }\n if (input === '/') {\n dispatch({ type: 'SET_SEARCH_ACTIVE', active: true });\n dispatch({ type: 'SET_SEARCH_QUERY', query: '' });\n return;\n }\n if (input === 'p') {\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.ProjectSelector });\n return;\n }\n // Left arrow: enter reorder mode\n if (key.leftArrow) {\n if (state.tasks.length > 0) {\n dispatch({ type: 'ENTER_REORDER' });\n dispatch({ type: 'FLASH', message: 'Reorder: ↑↓ move, → save, ← cancel', level: 'info' });\n }\n return;\n }\n if (input === 'f') {\n const currentStatus = state.filter.status;\n const currentIndex = currentStatus\n ? STATUS_VALUES.indexOf(currentStatus as TaskStatus)\n : -1;\n const nextIndex = currentIndex + 1;\n const nextStatus = nextIndex < STATUS_VALUES.length ? STATUS_VALUES[nextIndex] : undefined;\n dispatch({ type: 'SET_FILTER', filter: { status: nextStatus } });\n return;\n }\n if (input === 't') {\n const currentType = state.filter.type;\n const currentIndex = currentType ? TYPE_VALUES.indexOf(currentType as TaskType) : -1;\n const nextIndex = currentIndex + 1;\n const nextType = nextIndex < TYPE_VALUES.length ? TYPE_VALUES[nextIndex] : undefined;\n dispatch({ type: 'SET_FILTER', filter: { type: nextType } });\n return;\n }\n if (input === '0') {\n dispatch({ type: 'CLEAR_FILTER' });\n return;\n }\n }\n\n // Task List — detail panel focused (preview task shortcuts)\n if (state.activeView === ViewType.TaskList && state.focusedPanel === 'detail' && previewTask) {\n if (input === 'e') {\n dispatch({ type: 'SELECT_TASK', task: previewTask });\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskEdit });\n return;\n }\n if (input === 'd') {\n dispatch({ type: 'CONFIRM_DELETE', task: previewTask });\n return;\n }\n if (input === 's') {\n cycleStatus(previewTask);\n return;\n }\n if (input === 'm') {\n const allText = `${previewTask.description}\\n${previewTask.technicalNotes}\\n${previewTask.additionalRequirements}`;\n const count = openAllMermaidDiagrams(allText);\n if (count > 0) {\n dispatch({\n type: 'FLASH',\n message: `Opened ${count} diagram${count > 1 ? 's' : ''} in browser`,\n level: 'info',\n });\n }\n return;\n }\n if (input === 'D') {\n dispatch({ type: 'SELECT_TASK', task: previewTask });\n loadDeps(previewTask.id);\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.DependencyList });\n return;\n }\n }\n\n // Task Detail (full-screen)\n if (state.activeView === ViewType.TaskDetail) {\n if (input === 'e' && state.selectedTask) {\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskEdit });\n return;\n }\n if (input === 'd' && state.selectedTask) {\n dispatch({ type: 'CONFIRM_DELETE', task: state.selectedTask });\n return;\n }\n if (input === 's' && state.selectedTask) {\n cycleStatus(state.selectedTask);\n return;\n }\n if (input === 'm' && state.selectedTask) {\n const allText = `${state.selectedTask.description}\\n${state.selectedTask.technicalNotes}\\n${state.selectedTask.additionalRequirements}`;\n const count = openAllMermaidDiagrams(allText);\n if (count > 0) {\n dispatch({\n type: 'FLASH',\n message: `Opened ${count} diagram${count > 1 ? 's' : ''} in browser`,\n level: 'info',\n });\n }\n return;\n }\n if (input === 'D' && state.selectedTask) {\n loadDeps(state.selectedTask.id);\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.DependencyList });\n return;\n }\n }\n\n // Dependency List (non-adding mode — adding is handled above)\n if (state.activeView === ViewType.DependencyList && state.selectedTask) {\n if (key.upArrow || input === 'k') {\n dispatch({ type: 'DEP_MOVE_CURSOR', direction: 'up' });\n return;\n }\n if (key.downArrow || input === 'j') {\n dispatch({ type: 'DEP_MOVE_CURSOR', direction: 'down' });\n return;\n }\n if (input === 'a') {\n dispatch({ type: 'SET_ADDING_DEP', active: true });\n return;\n }\n if (input === 'x') {\n const allItems = [\n ...state.depBlockers,\n ...state.depDependents,\n ...state.depRelated,\n ...state.depDuplicates,\n ];\n const selected = allItems[state.depSelectedIndex];\n if (selected) {\n // removeDependencyBetween handles direction-agnostic removal for\n // all relationship types (blockers, dependents, related, duplicates).\n const result = container.dependencyService.removeDependencyBetween(\n state.selectedTask.id,\n selected.id,\n );\n if (result.ok) {\n dispatch({ type: 'FLASH', message: 'Dependency removed', level: 'info' });\n loadDeps(state.selectedTask.id);\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n }\n return;\n }\n if (key.return) {\n const allItems = [\n ...state.depBlockers,\n ...state.depDependents,\n ...state.depRelated,\n ...state.depDuplicates,\n ];\n const selected = allItems[state.depSelectedIndex];\n if (selected) {\n dispatch({ type: 'SELECT_TASK', task: selected });\n loadDeps(selected.id);\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskDetail });\n }\n return;\n }\n }\n });\n\n const handleFormSave = useCallback(\n (data: {\n name: string;\n description: string;\n type: string;\n status: string;\n technicalNotes: string;\n additionalRequirements: string;\n dependsOn?: DependencyEntry[];\n }) => {\n if (state.activeView === ViewType.TaskEdit && state.selectedTask) {\n const taskId = state.selectedTask.id;\n const result = container.taskService.updateTask(taskId, data);\n if (!result.ok) {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n return;\n }\n\n // Diff and apply dependency changes.\n // Current outgoing deps (what this task depends on, in stored direction).\n const currentDepsResult = container.dependencyService.listAllDeps(taskId);\n const currentDeps = currentDepsResult.ok ? currentDepsResult.value : [];\n\n // New desired outgoing deps from the form.\n const newDeps = data.dependsOn ?? [];\n\n // Build lookup keys: \"dependsOnId:type\" for outgoing edges.\n const currentKeys = new Set(currentDeps.map((d) => `${d.dependsOnId}:${d.type}`));\n const newKeys = new Set(newDeps.map((d) => `${d.id}:${d.type}`));\n\n // Remove edges that are no longer in new deps.\n for (const dep of currentDeps) {\n if (!newKeys.has(`${dep.dependsOnId}:${dep.type}`)) {\n container.dependencyService.removeDependency({\n taskId,\n dependsOnId: dep.dependsOnId,\n });\n }\n }\n\n // Add edges that are new (service handles blocked-by normalization).\n for (const entry of newDeps) {\n if (currentKeys.has(`${entry.id}:${entry.type}`)) continue;\n container.dependencyService.addDependency({\n taskId,\n dependsOnId: entry.id,\n type: entry.type,\n });\n }\n\n dispatch({ type: 'FLASH', message: 'Task updated', level: 'info' });\n dispatch({ type: 'SELECT_TASK', task: result.value });\n loadDeps(taskId);\n dispatch({ type: 'GO_BACK' });\n loadTasks();\n } else {\n const result = container.taskService.createTask(data, state.activeProject?.id);\n if (result.ok) {\n dispatch({ type: 'FLASH', message: 'Task created', level: 'info' });\n dispatch({ type: 'GO_BACK' });\n loadTasks();\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n }\n },\n [container, state.activeView, state.selectedTask, state.activeProject, loadTasks, loadDeps],\n );\n\n const handleFormCancel = useCallback(() => {\n dispatch({ type: 'GO_BACK' });\n }, []);\n\n const handleProjectSelect = useCallback((project: Project) => {\n dispatch({ type: 'SET_ACTIVE_PROJECT', project });\n dispatch({ type: 'GO_BACK' });\n dispatch({ type: 'FLASH', message: `Switched to: ${project.name}`, level: 'info' });\n }, []);\n\n const handleSetDefault = useCallback(\n (project: Project) => {\n const result = container.projectService.updateProject(project.id, { isDefault: true });\n if (result.ok) {\n logger.info(`TUI.setDefault: set key=${result.value.key} as default`);\n dispatch({ type: 'FLASH', message: `Default project: ${result.value.name}`, level: 'info' });\n loadProjects();\n } else {\n logger.error('TUI.setDefault: failed', result.error);\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n },\n [container, loadProjects],\n );\n\n const handleProjectCreate = useCallback(() => {\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.ProjectCreate });\n }, []);\n\n const handleProjectFormSave = useCallback(\n (data: { name: string; key: string; description: string; isDefault: boolean }) => {\n const result = container.projectService.createProject({\n name: data.name,\n key: data.key || undefined,\n description: data.description || undefined,\n isDefault: data.isDefault,\n });\n if (result.ok) {\n logger.info(`TUI.createProject: created key=${result.value.key} name=${result.value.name}`);\n dispatch({\n type: 'FLASH',\n message: `Project created: ${result.value.name}`,\n level: 'info',\n });\n dispatch({ type: 'SET_ACTIVE_PROJECT', project: result.value });\n // Go back past ProjectCreate and ProjectSelector to TaskList\n dispatch({ type: 'GO_BACK' });\n dispatch({ type: 'GO_BACK' });\n loadProjects();\n } else {\n logger.error('TUI.createProject: failed', result.error);\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n },\n [container, loadProjects],\n );\n\n const handleProjectFormCancel = useCallback(() => {\n dispatch({ type: 'GO_BACK' });\n }, []);\n\n const handleProjectCancel = useCallback(() => {\n dispatch({ type: 'GO_BACK' });\n }, []);\n\n const previewTask = state.tasks[state.selectedIndex] ?? null;\n\n // Derive initial deps for the edit form from the already-loaded dep state.\n // depBlockers = tasks the selected task depends on (outgoing blocks edges).\n // depRelated / depDuplicates = bidirectional, but we seed them as outgoing.\n const initialDepsForEdit = useMemo((): import('./TaskPicker.js').PickedDependency[] => {\n return [\n ...state.depBlockers.map((t) => ({ id: t.id, name: t.name, type: DependencyType.Blocks })),\n ...state.depRelated.map((t) => ({ id: t.id, name: t.name, type: DependencyType.RelatesTo })),\n ...state.depDuplicates.map((t) => ({\n id: t.id,\n name: t.name,\n type: DependencyType.Duplicates,\n })),\n ];\n }, [state.depBlockers, state.depRelated, state.depDuplicates]);\n\n // All project tasks (unfiltered) for the dependency picker.\n // Depends on state.tasks so it re-fetches whenever loadTasks() updates the list\n // (e.g. after a task is created), ensuring newly created tasks appear in the picker.\n const allProjectTasks = useMemo(() => {\n if (!state.activeProject) return [];\n const result = container.taskService.listTasks({ projectId: state.activeProject.id });\n return result.ok ? result.value : [];\n }, [container, state.activeProject, state.tasks]);\n const previewTaskId = previewTask?.id ?? null;\n\n // Load deps for the preview pane when selection changes (track ID, not object reference)\n useEffect(() => {\n if (state.activeView === ViewType.TaskList && previewTaskId) {\n loadDeps(previewTaskId);\n }\n }, [state.activeView, previewTaskId, loadDeps]);\n\n return (\n <Box flexDirection=\"column\" height=\"100%\">\n {/* Header: app info + key hints + logo */}\n <Header state={state} />\n\n {/* Content area */}\n <Box flexDirection=\"column\" flexGrow={1}>\n {state.confirmDelete && <ConfirmDialog task={state.confirmDelete} />}\n\n {!state.confirmDelete && state.activeView === ViewType.TaskList && (\n <Box flexDirection=\"row\" flexGrow={1}>\n <Box width=\"50%\">\n <TaskList\n tasks={state.tasks}\n selectedIndex={state.selectedIndex}\n searchQuery={state.searchQuery}\n isSearchActive={state.isSearchActive}\n isReordering={state.isReordering}\n filter={state.filter}\n activeProjectName={state.activeProject?.name ?? 'none'}\n nonTerminalBlockerIds={\n new Set(\n state.depBlockers.filter((t) => !isTerminalStatus(t.status)).map((t) => t.id),\n )\n }\n nonTerminalDependentIds={\n new Set(\n state.depDependents.filter((t) => !isTerminalStatus(t.status)).map((t) => t.id),\n )\n }\n isSelectedBlocked={state.depBlockers.some((t) => !isTerminalStatus(t.status))}\n isFocused={state.focusedPanel === 'list'}\n />\n </Box>\n <Box flexGrow={1}>\n {previewTask ? (\n <TaskDetail\n task={previewTask}\n blockers={state.depBlockers}\n dependents={state.depDependents}\n related={state.depRelated}\n duplicates={state.depDuplicates}\n isFocused={state.focusedPanel === 'detail'}\n />\n ) : (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"bold\"\n borderColor={theme.border}\n >\n <Box>\n <Text color={theme.title} bold>\n {' '}\n detail\n </Text>\n </Box>\n <Box flexGrow={1} justifyContent=\"center\" alignItems=\"center\">\n <Text dimColor>No task selected</Text>\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n )}\n\n {!state.confirmDelete && state.activeView === ViewType.TaskDetail && state.selectedTask && (\n <TaskDetail\n task={state.selectedTask}\n blockers={state.depBlockers}\n dependents={state.depDependents}\n related={state.depRelated}\n duplicates={state.depDuplicates}\n />\n )}\n\n {!state.confirmDelete &&\n state.activeView === ViewType.DependencyList &&\n state.selectedTask && (\n <DependencyList\n task={state.selectedTask}\n blockers={state.depBlockers}\n dependents={state.depDependents}\n related={state.depRelated}\n duplicates={state.depDuplicates}\n selectedIndex={state.depSelectedIndex}\n isAddingDep={state.isAddingDep}\n addDepInput={state.addDepInput}\n />\n )}\n\n {!state.confirmDelete &&\n (state.activeView === ViewType.TaskCreate || state.activeView === ViewType.TaskEdit) && (\n <TaskForm\n editingTask={state.activeView === ViewType.TaskEdit ? state.selectedTask : null}\n allTasks={allProjectTasks}\n initialDeps={state.activeView === ViewType.TaskEdit ? initialDepsForEdit : undefined}\n onSave={handleFormSave}\n onCancel={handleFormCancel}\n />\n )}\n\n {!state.confirmDelete && state.activeView === ViewType.ProjectSelector && (\n <ProjectSelector\n projects={state.projects}\n activeProject={state.activeProject}\n onSelect={handleProjectSelect}\n onCreate={handleProjectCreate}\n onSetDefault={handleSetDefault}\n onCancel={handleProjectCancel}\n />\n )}\n\n {!state.confirmDelete && state.activeView === ViewType.ProjectCreate && (\n <ProjectForm onSave={handleProjectFormSave} onCancel={handleProjectFormCancel} />\n )}\n\n {!state.confirmDelete && state.activeView === ViewType.Help && <HelpOverlay />}\n </Box>\n\n {/* Breadcrumbs */}\n <Crumbs breadcrumbs={state.breadcrumbs} />\n\n {/* Flash message */}\n {state.flash && <FlashMessage message={state.flash.message} level={state.flash.level} />}\n </Box>\n );\n}\n","import type { Task } from '../types/task.js';\nimport type { Project } from '../types/project.js';\nimport type { TaskFilter } from '../types/task.js';\n\nexport const ViewType = {\n TaskList: 'task-list',\n TaskDetail: 'task-detail',\n TaskCreate: 'task-create',\n TaskEdit: 'task-edit',\n ProjectSelector: 'project-selector',\n ProjectCreate: 'project-create',\n DependencyList: 'dependency-list',\n Help: 'help',\n} as const;\nexport type ViewType = (typeof ViewType)[keyof typeof ViewType];\n\nexport type FlashLevel = 'info' | 'warn' | 'error';\n\nexport type PanelFocus = 'list' | 'detail';\n\nexport interface AppState {\n activeView: ViewType;\n breadcrumbs: ViewType[];\n tasks: Task[];\n selectedIndex: number;\n selectedTask: Task | null;\n projects: Project[];\n activeProject: Project | null;\n filter: TaskFilter;\n searchQuery: string;\n isSearchActive: boolean;\n isReordering: boolean;\n reorderSnapshot: Task[] | null;\n flash: { message: string; level: FlashLevel } | null;\n confirmDelete: Task | null;\n formData: Partial<FormData> | null;\n depBlockers: Task[];\n depDependents: Task[];\n depRelated: Task[];\n depDuplicates: Task[];\n depSelectedIndex: number;\n isAddingDep: boolean;\n addDepInput: string;\n focusedPanel: PanelFocus;\n}\n\nexport interface FormData {\n name: string;\n description: string;\n type: string;\n status: string;\n technicalNotes: string;\n additionalRequirements: string;\n}\n\nexport type Action =\n | { type: 'NAVIGATE_TO'; view: ViewType }\n | { type: 'GO_BACK' }\n | { type: 'SET_TASKS'; tasks: Task[] }\n | { type: 'SET_PROJECTS'; projects: Project[] }\n | { type: 'SET_ACTIVE_PROJECT'; project: Project | null }\n | { type: 'SET_FILTER'; filter: Partial<TaskFilter> }\n | { type: 'CLEAR_FILTER' }\n | { type: 'SET_SEARCH_ACTIVE'; active: boolean }\n | { type: 'SET_SEARCH_QUERY'; query: string }\n | { type: 'FLASH'; message: string; level: FlashLevel }\n | { type: 'CLEAR_FLASH' }\n | { type: 'CONFIRM_DELETE'; task: Task }\n | { type: 'CANCEL_DELETE' }\n | { type: 'MOVE_CURSOR'; direction: 'up' | 'down' }\n | { type: 'SET_CURSOR'; index: number }\n | { type: 'SELECT_TASK'; task: Task }\n | { type: 'SET_FORM_DATA'; data: Partial<FormData> | null }\n | { type: 'ENTER_REORDER' }\n | { type: 'REORDER_MOVE'; direction: 'up' | 'down' }\n | { type: 'EXIT_REORDER'; save: boolean }\n | { type: 'SET_DEPS'; blockers: Task[]; dependents: Task[]; related: Task[]; duplicates: Task[] }\n | { type: 'DEP_MOVE_CURSOR'; direction: 'up' | 'down' }\n | { type: 'SET_ADDING_DEP'; active: boolean }\n | { type: 'SET_ADD_DEP_INPUT'; input: string }\n | { type: 'SET_PANEL_FOCUS'; panel: PanelFocus };\n","import { ViewType } from './types.js';\nimport type { AppState, Action } from './types.js';\n\nexport const initialState: AppState = {\n activeView: ViewType.TaskList,\n breadcrumbs: [ViewType.TaskList],\n tasks: [],\n selectedIndex: 0,\n selectedTask: null,\n projects: [],\n activeProject: null,\n filter: {},\n searchQuery: '',\n isSearchActive: false,\n isReordering: false,\n reorderSnapshot: null,\n flash: null,\n confirmDelete: null,\n formData: null,\n depBlockers: [],\n depDependents: [],\n depRelated: [],\n depDuplicates: [],\n depSelectedIndex: 0,\n isAddingDep: false,\n addDepInput: '',\n focusedPanel: 'list',\n};\n\nexport function appReducer(state: AppState, action: Action): AppState {\n switch (action.type) {\n case 'NAVIGATE_TO':\n return {\n ...state,\n breadcrumbs: [...state.breadcrumbs, action.view],\n activeView: action.view,\n confirmDelete: null,\n focusedPanel: 'list',\n };\n\n case 'GO_BACK': {\n const crumbs =\n state.breadcrumbs.length > 1 ? state.breadcrumbs.slice(0, -1) : [ViewType.TaskList];\n return {\n ...state,\n activeView: crumbs[crumbs.length - 1] ?? ViewType.TaskList,\n breadcrumbs: crumbs,\n confirmDelete: null,\n isSearchActive: false,\n formData: null,\n focusedPanel: 'list',\n };\n }\n\n case 'SET_TASKS':\n return {\n ...state,\n tasks: action.tasks,\n selectedIndex: Math.min(state.selectedIndex, Math.max(0, action.tasks.length - 1)),\n };\n\n case 'SET_PROJECTS':\n return { ...state, projects: action.projects };\n\n case 'SET_ACTIVE_PROJECT':\n return { ...state, activeProject: action.project };\n\n case 'SET_FILTER':\n return {\n ...state,\n filter: { ...state.filter, ...action.filter },\n selectedIndex: 0,\n };\n\n case 'CLEAR_FILTER':\n return { ...state, filter: {}, selectedIndex: 0, searchQuery: '' };\n\n case 'SET_SEARCH_ACTIVE':\n return { ...state, isSearchActive: action.active };\n\n case 'SET_SEARCH_QUERY':\n return { ...state, searchQuery: action.query };\n\n case 'FLASH':\n return {\n ...state,\n flash: { message: action.message, level: action.level },\n };\n\n case 'CLEAR_FLASH':\n return { ...state, flash: null };\n\n case 'CONFIRM_DELETE':\n return { ...state, confirmDelete: action.task };\n\n case 'CANCEL_DELETE':\n return { ...state, confirmDelete: null };\n\n case 'MOVE_CURSOR': {\n const maxIndex = Math.max(0, state.tasks.length - 1);\n const newIndex =\n action.direction === 'up'\n ? Math.max(0, state.selectedIndex - 1)\n : Math.min(maxIndex, state.selectedIndex + 1);\n return { ...state, selectedIndex: newIndex };\n }\n\n case 'SET_CURSOR': {\n const maxIndex = Math.max(0, state.tasks.length - 1);\n return { ...state, selectedIndex: Math.max(0, Math.min(action.index, maxIndex)) };\n }\n\n case 'SELECT_TASK':\n return { ...state, selectedTask: action.task };\n\n case 'SET_FORM_DATA':\n return { ...state, formData: action.data };\n\n case 'ENTER_REORDER':\n return {\n ...state,\n isReordering: true,\n reorderSnapshot: [...state.tasks],\n };\n\n case 'REORDER_MOVE': {\n if (!state.isReordering) return state;\n const idx = state.selectedIndex;\n const tasks = [...state.tasks];\n const swapIdx = action.direction === 'up' ? idx - 1 : idx + 1;\n if (swapIdx < 0 || swapIdx >= tasks.length) return state;\n\n // Swap tasks in the local array\n const current = tasks[idx];\n const swap = tasks[swapIdx];\n if (!current || !swap) return state;\n tasks[idx] = swap;\n tasks[swapIdx] = current;\n\n return {\n ...state,\n tasks,\n selectedIndex: swapIdx,\n };\n }\n\n case 'EXIT_REORDER': {\n if (!action.save && state.reorderSnapshot) {\n // Revert to snapshot\n return {\n ...state,\n isReordering: false,\n tasks: state.reorderSnapshot,\n reorderSnapshot: null,\n };\n }\n return {\n ...state,\n isReordering: false,\n reorderSnapshot: null,\n };\n }\n\n case 'SET_DEPS':\n return {\n ...state,\n depBlockers: action.blockers,\n depDependents: action.dependents,\n depRelated: action.related,\n depDuplicates: action.duplicates,\n depSelectedIndex: 0,\n };\n\n case 'DEP_MOVE_CURSOR': {\n const total =\n state.depBlockers.length +\n state.depDependents.length +\n state.depRelated.length +\n state.depDuplicates.length;\n if (total === 0) return state;\n const maxIdx = Math.max(0, total - 1);\n const newIdx =\n action.direction === 'up'\n ? Math.max(0, state.depSelectedIndex - 1)\n : Math.min(maxIdx, state.depSelectedIndex + 1);\n return { ...state, depSelectedIndex: newIdx };\n }\n\n case 'SET_ADDING_DEP':\n return { ...state, isAddingDep: action.active, addDepInput: '' };\n\n case 'SET_ADD_DEP_INPUT':\n return { ...state, addDepInput: action.input };\n\n case 'SET_PANEL_FOCUS':\n return { ...state, focusedPanel: action.panel };\n }\n}\n","// k9s-inspired color theme\nexport const theme = {\n // Body\n fg: '#1E90FF', // dodgerblue\n bg: 'black',\n logo: '#FFA500', // orange\n\n // Table\n table: {\n fg: '#00FFFF', // aqua\n cursorFg: 'black',\n cursorBg: '#00FFFF', // aqua\n headerFg: 'white',\n markColor: '#98FB98', // palegreen\n depHighlightBg: '#1A5276', // dark steel blue – non-terminal dep rows\n blockedCursorBg: '#C0392B', // strong red – selected row blocked by non-terminal dep\n },\n\n // Status colors (row-level)\n status: {\n new: '#87CEFA', // lightskyblue\n modified: '#ADFF2F', // greenyellow\n added: '#1E90FF', // dodgerblue\n error: '#FF4500', // orangered\n pending: '#FF8C00', // darkorange\n highlight: '#00FFFF', // aqua\n kill: '#9370DB', // mediumpurple\n completed: '#778899', // lightslategray\n },\n\n // Frame / borders\n border: '#1E90FF', // dodgerblue\n borderFocus: '#00FFFF', // aqua\n\n // Title\n title: '#00FFFF', // aqua\n titleHighlight: '#FF00FF', // fuchsia\n titleCounter: '#FFEFD5', // papayawhip\n titleFilter: '#2E8B57', // seagreen\n\n // Prompt\n prompt: '#5F9EA0', // cadetblue\n promptSuggest: '#1E90FF', // dodgerblue\n\n // Dialog\n dialog: {\n fg: '#1E90FF', // dodgerblue\n buttonFg: 'black',\n buttonBg: '#1E90FF',\n buttonFocusFg: 'white',\n buttonFocusBg: '#FF00FF', // fuchsia\n label: '#FF00FF', // fuchsia\n field: '#1E90FF',\n },\n\n // Detail/YAML\n yaml: {\n key: '#4682B4', // steelblue\n colon: 'white',\n value: '#FFEFD5', // papayawhip\n },\n\n // Crumbs\n crumb: {\n fg: 'black',\n bg: '#4682B4', // steelblue\n activeBg: '#FFA500', // orange\n },\n\n // Flash\n flash: {\n info: '#FFDEAD', // navajowhite\n warn: '#FFA500', // orange\n error: '#FF4500', // orangered\n },\n\n // Menu / key hints\n menu: {\n key: '#1E90FF', // dodgerblue\n numKey: '#FF00FF', // fuchsia\n desc: 'white',\n },\n} as const;\n","import { TaskStatus, TaskType, DependencyType, UIDependencyType } from '../types/enums.js';\nimport { theme } from './theme.js';\n\nexport const STATUS_VALUES = Object.values(TaskStatus);\nexport const TYPE_VALUES = Object.values(TaskType);\n\nexport const STATUS_COLOR: Record<string, string> = {\n [TaskStatus.Backlog]: theme.status.completed,\n [TaskStatus.Todo]: theme.status.new,\n [TaskStatus.InProgress]: theme.status.pending,\n [TaskStatus.Review]: theme.status.modified,\n [TaskStatus.Done]: theme.status.added,\n [TaskStatus.Cancelled]: theme.status.kill,\n};\n\nexport const TYPE_COLOR: Record<string, string> = {\n [TaskType.Story]: theme.status.highlight,\n [TaskType.TechDebt]: theme.status.pending,\n [TaskType.Bug]: theme.status.error,\n};\n\nexport const DEP_TYPE_LABEL: Record<string, string> = {\n [DependencyType.Blocks]: 'blocks',\n [DependencyType.RelatesTo]: 'relates-to',\n [DependencyType.Duplicates]: 'duplicates',\n [UIDependencyType.BlockedBy]: 'blocked-by',\n};\n","import { Box, Text } from 'ink';\nimport type { AppState } from '../types.js';\nimport { theme } from '../theme.js';\n\ninterface KeyHint {\n key: string;\n desc: string;\n}\n\nfunction getKeyHints(view: string, isSearchActive: boolean): KeyHint[] {\n if (isSearchActive) {\n return [\n { key: 'enter', desc: 'apply' },\n { key: 'esc', desc: 'cancel' },\n ];\n }\n if (view === 'task-list') {\n return [\n { key: 'enter', desc: 'view' },\n { key: 'c', desc: 'create' },\n { key: 'e', desc: 'edit' },\n { key: 'd', desc: 'del' },\n { key: 's', desc: 'status' },\n { key: '←', desc: 'reorder' },\n { key: '/', desc: 'search' },\n { key: 'p', desc: 'project' },\n { key: 'f', desc: 'status-f' },\n { key: 't', desc: 'type-f' },\n { key: '?', desc: 'help' },\n { key: 'q', desc: 'quit' },\n ];\n }\n if (view === 'task-detail') {\n return [\n { key: 'e', desc: 'edit' },\n { key: 's', desc: 'status' },\n { key: 'd', desc: 'del' },\n { key: 'm', desc: 'mermaid' },\n { key: 'esc', desc: 'back' },\n { key: '?', desc: 'help' },\n { key: 'q', desc: 'quit' },\n ];\n }\n return [\n { key: 'esc', desc: 'back' },\n { key: '?', desc: 'help' },\n { key: 'q', desc: 'quit' },\n ];\n}\n\ninterface Props {\n state: AppState;\n}\n\nexport function Header({ state }: Props) {\n const projectName = state.activeProject?.name ?? 'none';\n const taskCount = state.tasks.length;\n const hints = getKeyHints(state.activeView, state.isSearchActive);\n\n return (\n <Box flexDirection=\"column\">\n <Box gap={2}>\n <Text color={theme.logo} bold>\n TaskCLI\n </Text>\n <Text color={theme.logo}>Project:</Text>\n <Text color=\"white\" bold>\n {projectName}\n </Text>\n <Text dimColor>|</Text>\n <Text color={theme.logo}>Tasks:</Text>\n <Text color=\"white\" bold>\n {taskCount}\n </Text>\n </Box>\n <Box flexDirection=\"row\" flexWrap=\"wrap\" columnGap={1}>\n {hints.map((h) => (\n <Box key={h.key}>\n <Text color={theme.menu.key} bold>\n <{h.key}>\n </Text>\n <Text dimColor>{h.desc}</Text>\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { ViewType } from '../types.js';\nimport { theme } from '../theme.js';\n\nconst VIEW_LABELS: Record<string, string> = {\n 'task-list': 'tasks',\n 'task-detail': 'detail',\n 'task-create': 'create',\n 'task-edit': 'edit',\n 'project-selector': 'projects',\n help: 'help',\n};\n\ninterface Props {\n breadcrumbs: ViewType[];\n}\n\nexport function Crumbs({ breadcrumbs }: Props) {\n return (\n <Box flexDirection=\"row\" gap={0} width=\"100%\">\n {breadcrumbs.map((crumb, i) => {\n const isActive = i === breadcrumbs.length - 1;\n const label = ` ${VIEW_LABELS[crumb] ?? crumb} `;\n return (\n <Text\n key={`${crumb}-${i}`}\n color={theme.crumb.fg}\n backgroundColor={isActive ? theme.crumb.activeBg : theme.crumb.bg}\n bold={isActive}\n >\n {label}\n </Text>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { FlashLevel } from '../types.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n message: string;\n level: FlashLevel;\n}\n\nconst LEVEL_COLOR: Record<FlashLevel, string> = {\n info: theme.flash.info,\n warn: theme.flash.warn,\n error: theme.flash.error,\n};\n\nexport function FlashMessage({ message, level }: Props) {\n return (\n <Box justifyContent=\"center\" width=\"100%\">\n <Text color={LEVEL_COLOR[level]} bold={level === 'error'}>\n {message}\n </Text>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { theme } from '../theme.js';\nimport { STATUS_COLOR, TYPE_COLOR } from '../constants.js';\nimport type { TaskFilter } from '../../types/task.js';\n\nconst PAGE_SIZE = 20;\n\ninterface Props {\n tasks: Task[];\n selectedIndex: number;\n searchQuery: string;\n isSearchActive: boolean;\n isReordering: boolean;\n filter: TaskFilter;\n activeProjectName: string;\n /** IDs of non-terminal tasks that block the selected task */\n nonTerminalBlockerIds: Set<string>;\n /** IDs of non-terminal tasks that depend on the selected task */\n nonTerminalDependentIds: Set<string>;\n /** True when the selected task has at least one non-terminal blocker */\n isSelectedBlocked: boolean;\n isFocused?: boolean;\n}\n\n// Fixed column widths\nconst COL = {\n rank: 5,\n type: 12,\n status: 14,\n};\n\nexport function TaskList({\n tasks,\n selectedIndex,\n searchQuery,\n isSearchActive,\n isReordering,\n filter,\n activeProjectName,\n nonTerminalBlockerIds,\n nonTerminalDependentIds,\n isSelectedBlocked,\n isFocused = true,\n}: Props) {\n const currentPage = Math.floor(selectedIndex / PAGE_SIZE);\n const viewStart = currentPage * PAGE_SIZE;\n\n const visibleTasks = tasks.slice(viewStart, viewStart + PAGE_SIZE);\n\n // Title bar filters\n const filterParts: string[] = [];\n if (filter.status) filterParts.push(`status:${filter.status}`);\n if (filter.type) filterParts.push(`type:${filter.type}`);\n if (filter.search) filterParts.push(filter.search);\n const filterText = filterParts.length > 0 ? filterParts.join(' ') : '';\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"bold\"\n borderColor={isFocused ? theme.borderFocus : theme.border}\n >\n {/* Title bar */}\n <Box>\n <Text color={theme.title} bold>\n {' '}\n tasks\n </Text>\n <Text color={theme.fg}>(</Text>\n <Text color={theme.titleHighlight} bold>\n {activeProjectName}\n </Text>\n <Text color={theme.fg}>)</Text>\n <Text color={theme.titleCounter} bold>\n [{tasks.length}]\n </Text>\n {isReordering && (\n <Text color={theme.flash.warn} bold>\n {' '}\n REORDER\n </Text>\n )}\n {filterText && <Text color={theme.titleFilter}> /{filterText}</Text>}\n </Box>\n\n {/* Search prompt */}\n {isSearchActive && (\n <Box borderStyle=\"round\" borderColor={theme.prompt} paddingX={1}>\n <Text color={theme.prompt}>/</Text>\n <Text color={theme.prompt}>{searchQuery}</Text>\n <Text color={theme.promptSuggest}>_</Text>\n </Box>\n )}\n\n {/* Table header */}\n <Box>\n <Text color={theme.table.headerFg} bold>\n {' '}\n </Text>\n <Text color={theme.table.headerFg} bold>\n {'#'.padEnd(COL.rank)}\n </Text>\n <Text color={theme.table.headerFg} bold>\n {'TYPE'.padEnd(COL.type)}\n </Text>\n <Text color={theme.table.headerFg} bold>\n {'STATUS'.padEnd(COL.status)}\n </Text>\n <Text color={theme.table.headerFg} bold>\n NAME\n </Text>\n </Box>\n\n {/* Task rows */}\n {tasks.length === 0 ? (\n <Box paddingX={2} paddingY={1}>\n <Text color={theme.fg}>No tasks found. Press 'c' to create one.</Text>\n </Box>\n ) : (\n visibleTasks.map((task, i) => {\n const actualIndex = viewStart + i;\n const isSelected = actualIndex === selectedIndex;\n const isNonTerminalBlocker = nonTerminalBlockerIds.has(task.id);\n const isNonTerminalDependent = nonTerminalDependentIds.has(task.id);\n const rowColor = STATUS_COLOR[task.status] ?? theme.table.fg;\n const rowNum = `${actualIndex + 1}`;\n\n // Dep marker: ▲ = non-terminal blocker, ▼ = non-terminal dependent\n const depMarker = isNonTerminalBlocker ? '▲ ' : isNonTerminalDependent ? '▼ ' : ' ';\n\n if (isSelected) {\n // Blue if able to transition, red if blocked by a non-terminal task\n const cursorBg = isReordering\n ? theme.flash.warn\n : isSelectedBlocked\n ? theme.table.blockedCursorBg\n : theme.table.cursorBg;\n return (\n <Box key={task.id}>\n <Text backgroundColor={cursorBg} color={theme.table.cursorFg} bold>\n {isReordering ? '~ ' : '> '}\n {rowNum.padEnd(COL.rank)}\n {task.type.padEnd(COL.type)}\n {task.status.padEnd(COL.status)}\n {task.name}\n </Text>\n </Box>\n );\n }\n\n if (isNonTerminalBlocker || isNonTerminalDependent) {\n // Lighter blue background for non-terminal related tasks; rank order\n // implicitly conveys direction (higher rank = blocker, lower = dependent).\n return (\n <Box key={task.id}>\n <Text backgroundColor={theme.table.depHighlightBg} color={theme.table.fg} bold>\n {depMarker}\n {rowNum.padEnd(COL.rank)}\n {task.type.padEnd(COL.type)}\n {task.status.padEnd(COL.status)}\n {task.name}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={task.id}>\n <Text>{' '}</Text>\n <Text dimColor>{rowNum.padEnd(COL.rank)}</Text>\n <Text color={TYPE_COLOR[task.type] ?? rowColor}>{task.type.padEnd(COL.type)}</Text>\n <Text color={STATUS_COLOR[task.status] ?? rowColor}>\n {task.status.padEnd(COL.status)}\n </Text>\n <Text color={rowColor}>{task.name}</Text>\n </Box>\n );\n })\n )}\n\n <Box flexGrow={1} />\n\n {/* Page indicator */}\n {tasks.length > PAGE_SIZE && (\n <Box justifyContent=\"flex-end\" paddingRight={1}>\n <Text dimColor>\n [{viewStart + 1}-{Math.min(viewStart + PAGE_SIZE, tasks.length)}/{tasks.length}]\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { theme } from '../theme.js';\nimport { Markdown, MermaidHint } from './Markdown.js';\n\ninterface Props {\n task: Task;\n blockers?: Task[];\n dependents?: Task[];\n related?: Task[];\n duplicates?: Task[];\n isFocused?: boolean;\n}\n\nfunction Field({ label, value }: { label: string; value: string }) {\n return (\n <Box gap={0}>\n <Text color={theme.yaml.key} bold>\n {label}\n </Text>\n <Text color={theme.yaml.colon}>: </Text>\n <Text color={theme.yaml.value}>{value}</Text>\n </Box>\n );\n}\n\nexport function TaskDetail({\n task,\n blockers,\n dependents,\n related,\n duplicates,\n isFocused = true,\n}: Props) {\n const allText = `${task.description}\\n${task.technicalNotes}\\n${task.additionalRequirements}`;\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"bold\"\n borderColor={isFocused ? theme.borderFocus : theme.border}\n >\n {/* Title bar */}\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n detail\n </Text>\n <Text color={theme.fg}>(</Text>\n <Text color={theme.titleHighlight} bold>\n {task.name}\n </Text>\n <Text color={theme.fg}>)</Text>\n </Box>\n\n {/* Metadata in YAML style */}\n <Box flexDirection=\"column\" paddingX={1} paddingY={0}>\n <Field label=\"id\" value={task.id} />\n <Field label=\"type\" value={task.type} />\n <Field label=\"status\" value={task.status} />\n <Field label=\"created\" value={new Date(task.createdAt).toLocaleString()} />\n <Field label=\"updated\" value={new Date(task.updatedAt).toLocaleString()} />\n {task.parentId && <Field label=\"parent\" value={task.parentId} />}\n </Box>\n\n {/* Dependencies summary */}\n {((blockers && blockers.length > 0) ||\n (dependents && dependents.length > 0) ||\n (related && related.length > 0) ||\n (duplicates && duplicates.length > 0)) && (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color={theme.title} bold>\n --- dependencies ---\n </Text>\n {blockers && blockers.length > 0 && (\n <Box gap={0}>\n <Text color={theme.status.error} bold>\n blocked by:{' '}\n </Text>\n <Text color={theme.yaml.value}>{blockers.map((t) => t.id).join(', ')}</Text>\n </Box>\n )}\n {dependents && dependents.length > 0 && (\n <Box gap={0}>\n <Text color={theme.status.added} bold>\n blocks:{' '}\n </Text>\n <Text color={theme.yaml.value}>{dependents.map((t) => t.id).join(', ')}</Text>\n </Box>\n )}\n {related && related.length > 0 && (\n <Box gap={0}>\n <Text color={theme.status.new} bold>\n relates to:{' '}\n </Text>\n <Text color={theme.yaml.value}>{related.map((t) => t.id).join(', ')}</Text>\n </Box>\n )}\n {duplicates && duplicates.length > 0 && (\n <Box gap={0}>\n <Text color={theme.status.pending} bold>\n duplicates:{' '}\n </Text>\n <Text color={theme.yaml.value}>{duplicates.map((t) => t.id).join(', ')}</Text>\n </Box>\n )}\n <Text dimColor>press D to manage dependencies</Text>\n </Box>\n )}\n\n {/* Description */}\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color={theme.title} bold>\n --- description ---\n </Text>\n {task.description.trim() ? (\n <Markdown content={task.description} />\n ) : (\n <Text dimColor>No description</Text>\n )}\n </Box>\n\n {/* Technical Notes */}\n {task.technicalNotes.trim() && (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color={theme.title} bold>\n --- technical notes ---\n </Text>\n <Markdown content={task.technicalNotes} />\n </Box>\n )}\n\n {/* Additional Requirements */}\n {task.additionalRequirements.trim() && (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color={theme.title} bold>\n --- requirements ---\n </Text>\n <Markdown content={task.additionalRequirements} />\n </Box>\n )}\n\n <Box flexGrow={1} />\n\n {/* Mermaid diagram hint */}\n <Box paddingX={1}>\n <MermaidHint content={allText} />\n </Box>\n </Box>\n );\n}\n","import { Text, Box } from 'ink';\nimport { Marked, type Token, type Tokens } from 'marked';\nimport { markedTerminal } from 'marked-terminal';\nimport chalk from 'chalk';\nimport { theme } from '../theme.js';\nimport { openMermaidInBrowser } from '../mermaid.js';\n\n/** Extract mermaid code blocks from markdown content using the lexer (pure, no side effects). */\nexport function extractMermaidBlocks(content: string): string[] {\n const lexer = new Marked();\n const tokens = lexer.lexer(content);\n const blocks: string[] = [];\n\n function walk(items: Token[]): void {\n for (const token of items) {\n if (token.type === 'code' && (token as Tokens.Code).lang === 'mermaid') {\n blocks.push((token as Tokens.Code).text);\n }\n if ('tokens' in token && Array.isArray(token.tokens)) {\n walk(token.tokens);\n }\n }\n }\n\n walk(tokens);\n return blocks;\n}\n\nfunction createRenderer(): Marked {\n const mermaidExtension = {\n renderer: {\n code(token: Tokens.Code): string | false {\n if (token.lang !== 'mermaid') return false;\n\n const lines = token.text.split('\\n');\n const preview = lines.slice(0, 6);\n const maxLen = Math.max(...preview.map((l) => l.length), 30);\n const border = '─'.repeat(maxLen + 2);\n\n const framed = preview\n .map((l) => ` ${chalk.dim('│')} ${chalk.hex(theme.table.fg)(l)}`)\n .join('\\n');\n const truncated =\n lines.length > 6\n ? `\\n ${chalk.dim('│')} ${chalk.dim(`... ${lines.length - 6} more lines`)}`\n : '';\n\n return [\n '',\n ` ${chalk.hex(theme.title).bold('┌ Mermaid Diagram')} ${chalk.hex(theme.menu.key)('[press m to open in browser]')}`,\n ` ${chalk.dim(border)}`,\n framed,\n truncated,\n ` ${chalk.dim(border)}`,\n '',\n ].join('\\n');\n },\n },\n };\n\n const terminalExt = markedTerminal as unknown as (\n opts: Record<string, unknown>,\n ) => Parameters<Marked['use']>[0];\n\n return new Marked(\n terminalExt({\n showSectionPrefix: false,\n reflowText: true,\n tab: 2,\n }),\n mermaidExtension,\n );\n}\n\nconst marked = createRenderer();\n\ninterface Props {\n content: string;\n}\n\nexport function Markdown({ content }: Props) {\n if (!content.trim()) {\n return <Text dimColor>No content</Text>;\n }\n\n const rendered = marked.parse(content);\n if (typeof rendered !== 'string') {\n return <Text>{content}</Text>;\n }\n\n return <Text>{rendered.trimEnd()}</Text>;\n}\n\ninterface MermaidProps {\n content: string;\n}\n\nexport function MermaidHint({ content }: MermaidProps) {\n const blocks = extractMermaidBlocks(content);\n if (blocks.length === 0) return null;\n\n return (\n <Box>\n <Text color={theme.menu.key} bold>\n {'<m>'}{' '}\n </Text>\n <Text dimColor>\n Open {blocks.length} mermaid diagram{blocks.length > 1 ? 's' : ''} in browser\n </Text>\n </Box>\n );\n}\n\nexport function openAllMermaidDiagrams(content: string): number {\n const blocks = extractMermaidBlocks(content);\n for (const block of blocks) {\n openMermaidInBrowser(block);\n }\n return blocks.length;\n}\n","import { writeFileSync, mkdtempSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { exec } from 'node:child_process';\n\nexport function openMermaidInBrowser(code: string): void {\n const dir = mkdtempSync(join(tmpdir(), 'task-mermaid-'));\n const filepath = join(dir, 'diagram.html');\n\n const html = `<!DOCTYPE html>\n<html><head>\n<meta charset=\"utf-8\">\n<title>Mermaid Diagram</title>\n<style>\n body { background: #1a1a2e; display: flex; justify-content: center; padding: 2rem; }\n .mermaid { background: #16213e; padding: 2rem; border-radius: 8px; }\n</style>\n</head><body>\n<pre class=\"mermaid\">\n${code.replace(/</g, '<').replace(/>/g, '>')}\n</pre>\n<script type=\"module\">\nimport mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';\nmermaid.initialize({ startOnLoad: true, theme: 'dark' });\n</script>\n</body></html>`;\n\n writeFileSync(filepath, html, 'utf-8');\n\n // Open in default browser (cross-platform)\n const cmd =\n process.platform === 'darwin'\n ? `open \"${filepath}\"`\n : process.platform === 'win32'\n ? `start \"\" \"${filepath}\"`\n : `xdg-open \"${filepath}\"`;\n\n exec(cmd);\n}\n","import { useState, useCallback } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { TaskStatus, TaskType } from '../../types/enums.js';\nimport type { Task } from '../../types/task.js';\nimport type { DependencyEntry } from '../../types/task.js';\nimport { theme } from '../theme.js';\nimport { STATUS_VALUES, TYPE_VALUES, DEP_TYPE_LABEL } from '../constants.js';\nimport { openInEditor } from '../editor.js';\nimport { TaskPicker } from './TaskPicker.js';\nimport type { PickedDependency } from './TaskPicker.js';\n\ninterface Props {\n editingTask: Task | null;\n /** All project tasks, used by the dependency picker */\n allTasks: Task[];\n /** Pre-populated dependencies when editing an existing task */\n initialDeps?: PickedDependency[];\n onSave: (data: {\n name: string;\n description: string;\n type: string;\n status: string;\n technicalNotes: string;\n additionalRequirements: string;\n dependsOn?: DependencyEntry[];\n }) => void;\n onCancel: () => void;\n}\n\ntype FieldType = 'inline' | 'select' | 'editor' | 'picker';\n\ninterface Field {\n label: string;\n key: string;\n type: FieldType;\n options?: string[];\n editorFilename?: string;\n}\n\nconst FIELDS: Field[] = [\n { label: 'Name', key: 'name', type: 'inline' },\n { label: 'Type', key: 'type', type: 'select', options: TYPE_VALUES },\n { label: 'Status', key: 'status', type: 'select', options: STATUS_VALUES },\n { label: 'Depends On', key: 'dependsOn', type: 'picker' },\n { label: 'Description', key: 'description', type: 'editor', editorFilename: 'description.md' },\n {\n label: 'Tech Notes',\n key: 'technicalNotes',\n type: 'editor',\n editorFilename: 'technical-notes.md',\n },\n {\n label: 'Requirements',\n key: 'additionalRequirements',\n type: 'editor',\n editorFilename: 'requirements.md',\n },\n];\n\nexport function TaskForm({ editingTask, allTasks, initialDeps, onSave, onCancel }: Props) {\n const [focusIndex, setFocusIndex] = useState(0);\n const [values, setValues] = useState<Record<string, string>>({\n name: editingTask?.name ?? '',\n type: editingTask?.type ?? TaskType.Story,\n status: editingTask?.status ?? TaskStatus.Backlog,\n description: editingTask?.description ?? '',\n technicalNotes: editingTask?.technicalNotes ?? '',\n additionalRequirements: editingTask?.additionalRequirements ?? '',\n });\n const [editorActive, setEditorActive] = useState(false);\n const [pickerActive, setPickerActive] = useState(false);\n const [pickedDeps, setPickedDeps] = useState(initialDeps ?? []);\n\n const currentField = FIELDS[focusIndex];\n\n const launchEditor = useCallback(\n (field: Field) => {\n setEditorActive(true);\n setTimeout(() => {\n const content = values[field.key] ?? '';\n const result = openInEditor(content, field.editorFilename ?? `${field.key}.md`);\n if (result !== null) {\n setValues((v) => ({ ...v, [field.key]: result }));\n }\n setEditorActive(false);\n }, 50);\n },\n [values],\n );\n\n const handlePickerConfirm = useCallback((selected: PickedDependency[]) => {\n setPickedDeps(selected);\n setPickerActive(false);\n }, []);\n\n const handlePickerCancel = useCallback(() => {\n setPickerActive(false);\n }, []);\n\n useInput(\n (input, key) => {\n if (editorActive || pickerActive) return;\n\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (!currentField) return;\n\n if (key.tab) {\n if (key.shift) {\n setFocusIndex((i) => Math.max(0, i - 1));\n } else {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n }\n return;\n }\n\n if (input === 's' && key.ctrl) {\n const nameVal = values['name'];\n if (typeof nameVal === 'string' && nameVal.trim()) {\n onSave({\n name: nameVal,\n description: values['description'] ?? '',\n type: values['type'] ?? TaskType.Story,\n status: values['status'] ?? TaskStatus.Backlog,\n technicalNotes: values['technicalNotes'] ?? '',\n additionalRequirements: values['additionalRequirements'] ?? '',\n dependsOn: pickedDeps.map((d) => ({ id: d.id, type: d.type })),\n });\n }\n return;\n }\n\n if (currentField.type === 'inline') {\n const currentValue = values[currentField.key] ?? '';\n if (key.backspace || key.delete) {\n setValues((v) => ({ ...v, [currentField.key]: currentValue.slice(0, -1) }));\n } else if (key.return) {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n } else if (input && !key.ctrl && !key.meta) {\n setValues((v) => ({ ...v, [currentField.key]: currentValue + input }));\n }\n }\n\n if (currentField.type === 'picker') {\n if (key.return) {\n setPickerActive(true);\n } else if (key.downArrow) {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n } else if (key.upArrow) {\n setFocusIndex((i) => Math.max(0, i - 1));\n }\n }\n\n if (currentField.type === 'editor') {\n if (key.return) {\n launchEditor(currentField);\n } else if (key.downArrow) {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n } else if (key.upArrow) {\n setFocusIndex((i) => Math.max(0, i - 1));\n }\n }\n\n if (currentField.type === 'select') {\n const options = currentField.options ?? [];\n const currentValue = values[currentField.key] ?? '';\n const currentIndex = options.indexOf(currentValue);\n if (key.rightArrow || key.return || input === ' ') {\n const nextIndex = (currentIndex + 1) % options.length;\n setValues((v) => ({ ...v, [currentField.key]: options[nextIndex] ?? '' }));\n } else if (key.leftArrow) {\n const prevIndex = (currentIndex - 1 + options.length) % options.length;\n setValues((v) => ({ ...v, [currentField.key]: options[prevIndex] ?? '' }));\n }\n }\n },\n { isActive: !editorActive && !pickerActive },\n );\n\n // When picker is open, render it instead of the form\n if (pickerActive) {\n const pickerExclude: { excludeIds?: Set<string> } = editingTask\n ? { excludeIds: new Set([editingTask.id]) }\n : {};\n return (\n <TaskPicker\n tasks={allTasks}\n {...pickerExclude}\n initialSelection={pickedDeps}\n onConfirm={handlePickerConfirm}\n onCancel={handlePickerCancel}\n />\n );\n }\n\n const isEdit = editingTask !== null;\n\n // Build dependency display summary\n const depSummary =\n pickedDeps.length > 0\n ? pickedDeps.map((d) => `${d.id} (${DEP_TYPE_LABEL[d.type] ?? d.type})`).join(', ')\n : '';\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} borderStyle=\"bold\" borderColor={theme.borderFocus}>\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n {isEdit ? 'edit' : 'create'}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={1} paddingY={0}>\n {FIELDS.map((field, i) => {\n const isFocused = i === focusIndex;\n const value = field.key === 'dependsOn' ? depSummary : (values[field.key] ?? '');\n const displayValue = value;\n\n return (\n <Box key={field.key} gap={1}>\n <Text color={isFocused ? theme.dialog.label : theme.yaml.key} bold={isFocused}>\n {isFocused ? '>' : ' '} {field.label.padEnd(14)}\n </Text>\n\n {field.type === 'inline' && (\n <Text color={isFocused ? theme.yaml.value : theme.table.fg}>\n {displayValue}\n {isFocused ? <Text color={theme.titleHighlight}>_</Text> : ''}\n </Text>\n )}\n\n {field.type === 'picker' && (\n <Text>\n {displayValue ? (\n <Text color={theme.status.added}>\n {displayValue.length > 60 ? displayValue.slice(0, 60) + '...' : displayValue}\n </Text>\n ) : (\n <Text dimColor>{isFocused ? 'press enter to select' : 'none'}</Text>\n )}\n {isFocused && <Text color={theme.menu.key}> [enter: open picker]</Text>}\n </Text>\n )}\n\n {field.type === 'editor' && (\n <Text>\n {displayValue ? (\n <Text color={theme.status.added}>\n {displayValue.split('\\n')[0]?.slice(0, 50)}\n {displayValue.length > 50 || displayValue.includes('\\n') ? '...' : ''}\n </Text>\n ) : (\n <Text dimColor>{isFocused ? 'press enter' : 'empty'}</Text>\n )}\n {isFocused && <Text color={theme.menu.key}> [enter: $EDITOR]</Text>}\n </Text>\n )}\n\n {field.type === 'select' && (\n <Text color={isFocused ? theme.yaml.value : theme.table.fg}>\n {isFocused ? '< ' : ' '}\n {displayValue}\n {isFocused ? ' >' : ''}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n <Box flexGrow={1} />\n\n <Box paddingX={1}>\n <Text dimColor>tab: next | shift+tab: prev | ctrl+s: save | esc: cancel</Text>\n </Box>\n {editorActive && (\n <Box paddingX={1}>\n <Text color={theme.flash.warn} bold>\n Editor open... save and close to return\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n","import { writeFileSync, readFileSync, unlinkSync, mkdtempSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { spawnSync } from 'node:child_process';\n\nfunction getEditor(): string {\n return process.env['EDITOR'] ?? process.env['VISUAL'] ?? 'vi';\n}\n\nexport function openInEditor(content: string, filename: string): string | null {\n const dir = mkdtempSync(join(tmpdir(), 'task-'));\n const filepath = join(dir, filename);\n\n writeFileSync(filepath, content, 'utf-8');\n\n const editor = getEditor();\n const result = spawnSync(editor, [filepath], {\n stdio: 'inherit',\n shell: true,\n });\n\n if (result.status !== 0) {\n try {\n unlinkSync(filepath);\n } catch {\n // ignore cleanup errors\n }\n return null;\n }\n\n try {\n const edited = readFileSync(filepath, 'utf-8');\n unlinkSync(filepath);\n return edited;\n } catch {\n return null;\n }\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { DependencyType, UIDependencyType } from '../../types/enums.js';\nimport { theme } from '../theme.js';\nimport { DEP_TYPE_LABEL } from '../constants.js';\n\nconst DEP_TYPE_VALUES = Object.values(UIDependencyType);\n\nconst DEP_TYPE_COLOR: Record<string, string> = {\n [DependencyType.Blocks]: theme.status.error,\n [DependencyType.RelatesTo]: theme.status.new,\n [DependencyType.Duplicates]: theme.status.pending,\n [UIDependencyType.BlockedBy]: theme.status.modified,\n};\n\nexport interface PickedDependency {\n id: string;\n name: string;\n type: string;\n}\n\ninterface Props {\n tasks: Task[];\n /** Task IDs to exclude from the picker (e.g., the task being edited) */\n excludeIds?: Set<string>;\n initialSelection?: PickedDependency[];\n onConfirm: (selected: PickedDependency[]) => void;\n onCancel: () => void;\n}\n\nexport function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }: Props) {\n const { stdout } = useStdout();\n const termHeight = stdout.rows > 0 ? stdout.rows : 24;\n const maxVisible = Math.max(3, termHeight - 12);\n\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [cursorIndex, setCursorIndex] = useState(0);\n const [selected, setSelected] = useState<Map<string, PickedDependency>>(() => {\n const map = new Map<string, PickedDependency>();\n if (initialSelection) {\n for (const dep of initialSelection) {\n map.set(dep.id, dep);\n }\n }\n return map;\n });\n\n // Filter tasks by search query and exclusions\n const available = tasks.filter((t) => {\n if (excludeIds?.has(t.id)) return false;\n if (!searchQuery.trim()) return true;\n const q = searchQuery.toLowerCase();\n return (\n t.id.toLowerCase().includes(q) ||\n t.name.toLowerCase().includes(q) ||\n t.description.toLowerCase().includes(q)\n );\n });\n\n // Scrolling window\n let viewStart = 0;\n if (cursorIndex >= viewStart + maxVisible) {\n viewStart = cursorIndex - maxVisible + 1;\n }\n if (cursorIndex < viewStart) {\n viewStart = cursorIndex;\n }\n const visible = available.slice(viewStart, viewStart + maxVisible);\n\n useInput((input, key) => {\n // Search mode\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n return;\n }\n if (key.return) {\n setIsSearching(false);\n setCursorIndex(0);\n return;\n }\n if (key.backspace || key.delete) {\n setSearchQuery((q) => q.slice(0, -1));\n setCursorIndex(0);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setSearchQuery((q) => q + input);\n setCursorIndex(0);\n return;\n }\n return;\n }\n\n // Navigation\n if (key.upArrow || input === 'k') {\n setCursorIndex((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow || input === 'j') {\n setCursorIndex((i) => Math.min(available.length - 1, i + 1));\n return;\n }\n\n // Space: select (with type cycle). First press selects as 'blocks',\n // subsequent presses cycle through: blocks -> relates-to -> duplicates -> deselect.\n if (input === ' ' || input === 't') {\n const task = available[cursorIndex];\n if (!task) return;\n setSelected((prev) => {\n const next = new Map(prev);\n const entry = prev.get(task.id);\n if (!entry) {\n // First select: default to blocks\n next.set(task.id, { id: task.id, name: task.name, type: DependencyType.Blocks });\n } else {\n // Cycle type, then deselect after last type\n const idx = DEP_TYPE_VALUES.indexOf(entry.type as DependencyType);\n if (idx < DEP_TYPE_VALUES.length - 1) {\n const nextType = DEP_TYPE_VALUES[idx + 1] ?? DependencyType.Blocks;\n next.set(task.id, { ...entry, type: nextType });\n } else {\n // Past last type -> deselect\n next.delete(task.id);\n }\n }\n return next;\n });\n return;\n }\n\n // x: deselect the item under cursor\n if (input === 'x') {\n const task = available[cursorIndex];\n if (!task) return;\n setSelected((prev) => {\n const next = new Map(prev);\n next.delete(task.id);\n return next;\n });\n return;\n }\n\n // Search\n if (input === '/') {\n setIsSearching(true);\n setSearchQuery('');\n return;\n }\n\n // Confirm\n if (key.return) {\n onConfirm(Array.from(selected.values()));\n return;\n }\n\n // Cancel\n if (key.escape || input === 'q') {\n onCancel();\n return;\n }\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"bold\" borderColor={theme.borderFocus} flexGrow={1}>\n {/* Title */}\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n select dependencies\n </Text>\n <Text color={theme.titleCounter} bold>\n {' '}\n [{selected.size} selected]\n </Text>\n </Box>\n\n {/* Search bar */}\n {isSearching ? (\n <Box borderStyle=\"round\" borderColor={theme.prompt} paddingX={1}>\n <Text color={theme.prompt}>/</Text>\n <Text color={theme.prompt}>{searchQuery}</Text>\n <Text color={theme.promptSuggest}>_</Text>\n </Box>\n ) : searchQuery ? (\n <Box paddingX={1}>\n <Text color={theme.titleFilter}>/{searchQuery}</Text>\n </Box>\n ) : null}\n\n {/* Header */}\n <Box paddingX={1}>\n <Text color={theme.table.headerFg} bold>\n {' '}\n {'SEL'.padEnd(5)}\n {'ID'.padEnd(14)}\n {'REL TYPE'.padEnd(12)}\n {'STATUS'.padEnd(14)}\n {'NAME'}\n </Text>\n </Box>\n\n {/* Task rows */}\n {available.length === 0 ? (\n <Box paddingX={2} paddingY={1}>\n <Text dimColor>No tasks match the filter</Text>\n </Box>\n ) : (\n visible.map((task, i) => {\n const actualIndex = viewStart + i;\n const isCursor = actualIndex === cursorIndex;\n const entry = selected.get(task.id);\n const isChecked = !!entry;\n const checkMark = isChecked ? '[x]' : '[ ]';\n const depType = entry ? (DEP_TYPE_LABEL[entry.type] ?? entry.type) : '';\n const depColor = entry ? (DEP_TYPE_COLOR[entry.type] ?? theme.table.fg) : theme.table.fg;\n\n return (\n <Box key={task.id} paddingX={1}>\n {isCursor ? (\n <Text backgroundColor={theme.table.cursorBg} color={theme.table.cursorFg} bold>\n {'> '}\n {checkMark.padEnd(5)}\n {task.id.padEnd(14)}\n {depType.padEnd(12)}\n {task.status.padEnd(14)}\n {task.name}\n </Text>\n ) : (\n <>\n <Text>{' '}</Text>\n <Text color={isChecked ? theme.status.added : theme.table.fg}>\n {checkMark.padEnd(5)}\n </Text>\n <Text color={theme.yaml.value}>{task.id.padEnd(14)}</Text>\n <Text color={depColor}>{depType.padEnd(12)}</Text>\n <Text color={theme.status.completed}>{task.status.padEnd(14)}</Text>\n <Text color={theme.table.fg}>{task.name}</Text>\n </>\n )}\n </Box>\n );\n })\n )}\n\n <Box flexGrow={1} />\n\n {/* Scroll indicator */}\n {available.length > maxVisible && (\n <Box justifyContent=\"flex-end\" paddingRight={1}>\n <Text dimColor>\n [{viewStart + 1}-{Math.min(viewStart + maxVisible, available.length)}/{available.length}\n ]\n </Text>\n </Box>\n )}\n\n {/* Selected summary */}\n {selected.size > 0 && (\n <Box paddingX={1} flexDirection=\"column\">\n <Text color={theme.table.headerFg} bold>\n Selected:\n </Text>\n <Box>\n <Text>\n {Array.from(selected.values())\n .map((d) => `${d.id} (${DEP_TYPE_LABEL[d.type] ?? d.type})`)\n .join(', ')}\n </Text>\n </Box>\n </Box>\n )}\n\n {/* Hints */}\n <Box paddingX={1}>\n <Text dimColor>\n space/t: select & cycle type (blocks {'->'} relates-to {'->'} duplicates {'->'} blocked-by{' '}\n {'->'} off) | x: deselect | /: search | enter: confirm | esc: cancel\n </Text>\n </Box>\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { Project } from '../../types/project.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n projects: Project[];\n activeProject: Project | null;\n onSelect: (project: Project) => void;\n onCreate: () => void;\n onSetDefault: (project: Project) => void;\n onCancel: () => void;\n}\n\nexport function ProjectSelector({\n projects,\n activeProject,\n onSelect,\n onCreate,\n onSetDefault,\n onCancel,\n}: Props) {\n const [selectedIndex, setSelectedIndex] = useState(() => {\n if (!activeProject) return 0;\n const idx = projects.findIndex((p) => p.id === activeProject.id);\n return idx >= 0 ? idx : 0;\n });\n\n useInput((input, key) => {\n if (key.escape || input === 'q') {\n onCancel();\n return;\n }\n if (key.return) {\n const project = projects[selectedIndex];\n if (project) {\n onSelect(project);\n }\n return;\n }\n if (input === 'c') {\n onCreate();\n return;\n }\n if (input === 'd') {\n const project = projects[selectedIndex];\n if (project) {\n onSetDefault(project);\n }\n return;\n }\n if (key.upArrow || input === 'k') {\n setSelectedIndex((i) => Math.max(0, i - 1));\n }\n if (key.downArrow || input === 'j') {\n setSelectedIndex((i) => Math.min(projects.length - 1, i + 1));\n }\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} borderStyle=\"bold\" borderColor={theme.borderFocus}>\n {/* Title bar */}\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n projects\n </Text>\n <Text color={theme.titleCounter} bold>\n [{projects.length}]\n </Text>\n </Box>\n\n {/* Table header */}\n <Box paddingX={1}>\n <Text color={theme.table.headerFg} bold>\n {' NAME'.padEnd(30)}\n </Text>\n <Text color={theme.table.headerFg} bold>\n DESCRIPTION\n </Text>\n </Box>\n\n {projects.length === 0 ? (\n <Box paddingX={1} paddingY={1}>\n <Text color={theme.fg}>No projects. Press 'c' to create one.</Text>\n </Box>\n ) : (\n projects.map((project, i) => {\n const isSelected = i === selectedIndex;\n const isActive = project.id === activeProject?.id;\n // * = active project, D = default project, combines to *D when both\n const activeMarker = isActive ? '*' : ' ';\n const defaultMarker = project.isDefault ? 'D' : ' ';\n const marker = `${activeMarker}${defaultMarker}`;\n\n if (isSelected) {\n return (\n <Box key={project.id} paddingX={1}>\n <Text backgroundColor={theme.table.cursorBg} color={theme.table.cursorFg} bold>\n {marker} {project.name.padEnd(27)}\n {project.description}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={project.id} paddingX={1}>\n <Text color={isActive ? theme.status.modified : theme.table.fg}>\n {marker} {project.name.padEnd(27)}\n </Text>\n <Text dimColor>{project.description}</Text>\n </Box>\n );\n })\n )}\n\n <Box flexGrow={1} />\n\n <Box paddingX={1}>\n <Text dimColor>enter: select | d: set default | c: create | esc: back</Text>\n </Box>\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { theme } from '../theme.js';\n\ninterface Props {\n onSave: (data: { name: string; key: string; description: string; isDefault: boolean }) => void;\n onCancel: () => void;\n}\n\ntype FieldKey = 'name' | 'key' | 'description' | 'isDefault';\n\ninterface Field {\n label: string;\n key: FieldKey;\n type: 'inline' | 'toggle';\n}\n\nconst FIELDS: Field[] = [\n { label: 'Name', key: 'name', type: 'inline' },\n { label: 'Key', key: 'key', type: 'inline' },\n { label: 'Description', key: 'description', type: 'inline' },\n { label: 'Default', key: 'isDefault', type: 'toggle' },\n];\n\nexport function ProjectForm({ onSave, onCancel }: Props) {\n const [focusIndex, setFocusIndex] = useState(0);\n const [values, setValues] = useState<Record<string, string>>({\n name: '',\n key: '',\n description: '',\n isDefault: 'no',\n });\n\n const currentField = FIELDS[focusIndex];\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (!currentField) return;\n\n if (key.tab) {\n if (key.shift) {\n setFocusIndex((i) => Math.max(0, i - 1));\n } else {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n }\n return;\n }\n\n if (input === 's' && key.ctrl) {\n const nameVal = values['name'];\n if (typeof nameVal === 'string' && nameVal.trim()) {\n onSave({\n name: nameVal,\n key: values['key'] ?? '',\n description: values['description'] ?? '',\n isDefault: values['isDefault'] === 'yes',\n });\n }\n return;\n }\n\n if (currentField.type === 'inline') {\n const currentValue = values[currentField.key] ?? '';\n if (key.backspace || key.delete) {\n setValues((v) => ({ ...v, [currentField.key]: currentValue.slice(0, -1) }));\n } else if (key.return) {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n } else if (input && !key.ctrl && !key.meta) {\n setValues((v) => ({ ...v, [currentField.key]: currentValue + input }));\n }\n }\n\n if (currentField.type === 'toggle') {\n if (key.return || key.rightArrow || key.leftArrow || input === ' ') {\n setValues((v) => ({\n ...v,\n [currentField.key]: v[currentField.key] === 'yes' ? 'no' : 'yes',\n }));\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} borderStyle=\"bold\" borderColor={theme.borderFocus}>\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n new project\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={1} paddingY={0}>\n {FIELDS.map((field, i) => {\n const isFocused = i === focusIndex;\n const value = values[field.key] ?? '';\n\n return (\n <Box key={field.key} gap={1}>\n <Text color={isFocused ? theme.dialog.label : theme.yaml.key} bold={isFocused}>\n {isFocused ? '>' : ' '} {field.label.padEnd(14)}\n </Text>\n\n {field.type === 'inline' && (\n <Text color={isFocused ? theme.yaml.value : theme.table.fg}>\n {value}\n {isFocused ? <Text color={theme.titleHighlight}>_</Text> : ''}\n {field.key === 'key' && !value && (\n <Text dimColor>{isFocused ? ' (auto from name)' : ''}</Text>\n )}\n </Text>\n )}\n\n {field.type === 'toggle' && (\n <Text color={isFocused ? theme.yaml.value : theme.table.fg}>\n {isFocused ? '< ' : ' '}\n {value}\n {isFocused ? ' >' : ''}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n <Box flexGrow={1} />\n\n <Box paddingX={1}>\n <Text dimColor>tab: next | shift+tab: prev | ctrl+s: save | esc: cancel</Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\n\nconst SECTIONS = [\n {\n title: 'NAVIGATION',\n keys: [\n ['j/k', 'Up/Down'],\n ['g/G', 'Top/Bottom'],\n ['enter', 'View'],\n ['esc', 'Back'],\n ],\n },\n {\n title: 'ACTIONS',\n keys: [\n ['c', 'Create'],\n ['e', 'Edit'],\n ['d', 'Delete'],\n ['s', 'Status cycle'],\n ['D', 'Dependencies'],\n ],\n },\n {\n title: 'REORDER',\n keys: [\n ['←', 'Enter reorder'],\n ['↑↓', 'Move task'],\n ['→', 'Save position'],\n ['esc/←', 'Cancel'],\n ],\n },\n {\n title: 'FILTER',\n keys: [\n ['/', 'Search'],\n ['f', 'Status filter'],\n ['t', 'Type filter'],\n ['0', 'Clear filters'],\n ],\n },\n {\n title: 'DEPS VIEW',\n keys: [\n ['a', 'Add blocker'],\n ['x', 'Remove dep'],\n ['enter', 'Go to task'],\n ['esc', 'Back'],\n ],\n },\n {\n title: 'GENERAL',\n keys: [\n ['p', 'Projects'],\n ['?', 'Help'],\n ['q', 'Quit'],\n ],\n },\n];\n\nexport function HelpOverlay() {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"bold\"\n borderColor={theme.borderFocus}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.title} bold>\n {' '}\n Help\n </Text>\n <Text> </Text>\n <Box flexDirection=\"row\" gap={4}>\n {SECTIONS.map((section) => (\n <Box key={section.title} flexDirection=\"column\">\n <Text color={theme.table.headerFg} bold>\n {section.title}\n </Text>\n {section.keys.map(([key, desc]) => (\n <Box key={key} gap={1}>\n <Text color={theme.menu.key} bold>\n {'<'}\n {(key ?? '').padEnd(5)}\n {'>'}\n </Text>\n <Text dimColor>{desc}</Text>\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n <Text> </Text>\n <Text dimColor>Press any key to close</Text>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n task: Task;\n}\n\nexport function ConfirmDialog({ task }: Props) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"bold\"\n borderColor={theme.status.error}\n paddingX={3}\n paddingY={1}\n alignSelf=\"center\"\n >\n <Text color={theme.dialog.label} bold>\n {'<Delete>'}\n </Text>\n <Text> </Text>\n <Text color={theme.dialog.fg}>Delete task "{task.name}"?</Text>\n <Text> </Text>\n <Box gap={3}>\n <Box>\n <Text\n backgroundColor={theme.dialog.buttonFocusBg}\n color={theme.dialog.buttonFocusFg}\n bold\n >\n {' y: OK '}\n </Text>\n </Box>\n <Box>\n <Text backgroundColor={theme.dialog.buttonBg} color={theme.dialog.buttonFg}>\n {' n: Cancel '}\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { theme } from '../theme.js';\nimport { STATUS_COLOR } from '../constants.js';\n\ninterface Props {\n task: Task;\n blockers: Task[];\n dependents: Task[];\n related: Task[];\n duplicates: Task[];\n selectedIndex: number;\n isAddingDep: boolean;\n addDepInput: string;\n}\n\nfunction TaskRow({\n task,\n globalIndex,\n selectedIndex,\n}: {\n task: Task;\n globalIndex: number;\n selectedIndex: number;\n}) {\n const isSelected = globalIndex === selectedIndex;\n const statusColor = STATUS_COLOR[task.status] ?? theme.table.fg;\n return (\n <Box key={task.id}>\n {isSelected ? (\n <Text backgroundColor={theme.table.cursorBg} color={theme.table.cursorFg} bold>\n {'> '}\n {task.id.padEnd(12)}\n {task.status.padEnd(14)}\n {task.name}\n </Text>\n ) : (\n <>\n <Text>{' '}</Text>\n <Text color={theme.yaml.value}>{task.id.padEnd(12)}</Text>\n <Text color={statusColor}>{task.status.padEnd(14)}</Text>\n <Text color={theme.table.fg}>{task.name}</Text>\n </>\n )}\n </Box>\n );\n}\n\nexport function DependencyList({\n task,\n blockers,\n dependents,\n related,\n duplicates,\n selectedIndex,\n isAddingDep,\n addDepInput,\n}: Props) {\n let offset = 0;\n const blockersOffset = offset;\n offset += blockers.length;\n const dependentsOffset = offset;\n offset += dependents.length;\n const relatedOffset = offset;\n offset += related.length;\n const duplicatesOffset = offset;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} borderStyle=\"bold\" borderColor={theme.borderFocus}>\n {/* Title */}\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n dependencies\n </Text>\n <Text color={theme.fg}>(</Text>\n <Text color={theme.titleHighlight} bold>\n {task.name}\n </Text>\n <Text color={theme.fg}>)</Text>\n </Box>\n\n {/* Blockers section */}\n <Box flexDirection=\"column\" paddingX={1} paddingTop={1}>\n <Text color={theme.table.headerFg} bold>\n BLOCKED BY ({blockers.length})\n </Text>\n {blockers.length === 0 ? (\n <Text dimColor> No blockers</Text>\n ) : (\n blockers.map((t, i) => (\n <TaskRow\n key={t.id}\n task={t}\n globalIndex={blockersOffset + i}\n selectedIndex={selectedIndex}\n />\n ))\n )}\n </Box>\n\n {/* Dependents section */}\n <Box flexDirection=\"column\" paddingX={1} paddingTop={1}>\n <Text color={theme.table.headerFg} bold>\n BLOCKS ({dependents.length})\n </Text>\n {dependents.length === 0 ? (\n <Text dimColor> No dependents</Text>\n ) : (\n dependents.map((t, i) => (\n <TaskRow\n key={t.id}\n task={t}\n globalIndex={dependentsOffset + i}\n selectedIndex={selectedIndex}\n />\n ))\n )}\n </Box>\n\n {/* Related section */}\n <Box flexDirection=\"column\" paddingX={1} paddingTop={1}>\n <Text color={theme.table.headerFg} bold>\n RELATES TO ({related.length})\n </Text>\n {related.length === 0 ? (\n <Text dimColor> No related tasks</Text>\n ) : (\n related.map((t, i) => (\n <TaskRow\n key={t.id}\n task={t}\n globalIndex={relatedOffset + i}\n selectedIndex={selectedIndex}\n />\n ))\n )}\n </Box>\n\n {/* Duplicates section */}\n <Box flexDirection=\"column\" paddingX={1} paddingTop={1}>\n <Text color={theme.table.headerFg} bold>\n DUPLICATES ({duplicates.length})\n </Text>\n {duplicates.length === 0 ? (\n <Text dimColor> No duplicate tasks</Text>\n ) : (\n duplicates.map((t, i) => (\n <TaskRow\n key={t.id}\n task={t}\n globalIndex={duplicatesOffset + i}\n selectedIndex={selectedIndex}\n />\n ))\n )}\n </Box>\n\n <Box flexGrow={1} />\n\n {/* Add dependency prompt */}\n {isAddingDep && (\n <Box borderStyle=\"round\" borderColor={theme.prompt} paddingX={1}>\n <Text color={theme.prompt}>depends on (id or id:type): </Text>\n <Text color={theme.prompt}>{addDepInput}</Text>\n <Text color={theme.promptSuggest}>_</Text>\n </Box>\n )}\n\n {/* Hints */}\n <Box paddingX={1}>\n <Text dimColor>\n a: add dep (id or id:relates-to) | x: remove selected | enter: go to task | esc: back\n </Text>\n </Box>\n </Box>\n );\n}\n"],"mappings":"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","names":["useCallback","Box","Text","useInput","Box","Text","jsx","Box","Text","Box","Text","jsx","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","Text","Box","jsx","jsxs","Text","Box","jsx","jsxs","Box","Text","useState","Box","Text","useInput","writeFileSync","mkdtempSync","join","tmpdir","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","useState","useInput","Box","Text","useState","Box","Text","useInput","jsx","jsxs","useState","useInput","Box","Text","useState","Box","Text","useInput","jsx","jsxs","FIELDS","useState","useInput","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","Fragment","jsx","jsxs","Box","Text","jsx","jsxs","useCallback","useInput","Box","Text","jsx"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tomkapa/tayto",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI tool for task management - for solo devs and AI agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"tayto": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsup",
|
|
14
|
+
"dev": "tsup --watch",
|
|
15
|
+
"lint": "eslint src/ --ext .ts,.tsx",
|
|
16
|
+
"fmt": "prettier --write \"src/**/*.{ts,tsx}\"",
|
|
17
|
+
"check": "prettier --check \"src/**/*.{ts,tsx}\" && eslint src/ --ext .ts,.tsx",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:watch": "vitest"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=25"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@opentelemetry/api": "^1.9.1",
|
|
27
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.214.0",
|
|
28
|
+
"@opentelemetry/sdk-node": "^0.214.0",
|
|
29
|
+
"@opentelemetry/sdk-trace-base": "^2.6.1",
|
|
30
|
+
"better-sqlite3": "^12.8.0",
|
|
31
|
+
"chalk": "^5.6.2",
|
|
32
|
+
"cli-highlight": "^2.1.11",
|
|
33
|
+
"commander": "^14.0.3",
|
|
34
|
+
"ink": "^6.8.0",
|
|
35
|
+
"marked": "^15.0.12",
|
|
36
|
+
"marked-terminal": "^7.3.0",
|
|
37
|
+
"react": "^19.2.4",
|
|
38
|
+
"ulid": "^3.0.2",
|
|
39
|
+
"zod": "^4.3.6"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@eslint/js": "^10.0.1",
|
|
43
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
44
|
+
"@types/node": "^25.5.1",
|
|
45
|
+
"@types/react": "^19.2.14",
|
|
46
|
+
"eslint": "^10.1.0",
|
|
47
|
+
"ink-testing-library": "^4.0.0",
|
|
48
|
+
"prettier": "^3.8.1",
|
|
49
|
+
"tsup": "^8.5.1",
|
|
50
|
+
"typescript": "^6.0.2",
|
|
51
|
+
"typescript-eslint": "^8.58.0",
|
|
52
|
+
"vitest": "^4.1.2"
|
|
53
|
+
}
|
|
54
|
+
}
|