@tomkapa/tayto 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,7 @@ import { render } from "ink";
15
15
 
16
16
  // src/tui/components/App.tsx
17
17
  import { useReducer, useEffect as useEffect2, useCallback as useCallback2, useMemo as useMemo2, useState as useState7 } from "react";
18
- import { Box as Box17, Text as Text17, useInput as useInput7, useApp, useStdout as useStdout4 } from "ink";
18
+ import { Box as Box18, Text as Text18, useInput as useInput7, useApp, useStdout as useStdout4 } from "ink";
19
19
 
20
20
  // src/tui/types.ts
21
21
  var ViewType = {
@@ -31,112 +31,94 @@ var ViewType = {
31
31
  Help: "help"
32
32
  };
33
33
 
34
+ // src/tui/assets/logo-data.ts
35
+ var PALETTE = {
36
+ red: "#C82D28",
37
+ redDark: "#A02320",
38
+ grey: "#9B9BA5",
39
+ greyDark: "#73737D",
40
+ skin: "#D7A578",
41
+ skinDark: "#B9875F",
42
+ blue: "#2D4BAA",
43
+ blueDark: "#1E3782",
44
+ brown: "#82502D",
45
+ brownDark: "#5F371E",
46
+ black: "#19191E"
47
+ };
48
+ var LOGO_WIDTH = 7;
49
+ var LOGO_HEIGHT = 9;
50
+ var LOGO_PIXELS = [
51
+ [null, null, "red", "red", "red", null, null],
52
+ [null, "grey", "red", "redDark", "red", "grey", null],
53
+ [null, "grey", "grey", "grey", "grey", "grey", null],
54
+ [null, "skin", "black", "skin", "black", "skin", null],
55
+ [null, "skin", "skin", "skin", "skin", "skin", null],
56
+ ["skin", "skin", "blue", "blue", "blue", "skin", "skin"],
57
+ [null, null, "blue", "blueDark", "blue", null, null],
58
+ [null, null, "skin", null, "skin", null, null],
59
+ [null, "brown", "brown", null, "brown", "brown", null]
60
+ ];
61
+
34
62
  // src/tui/theme.ts
35
63
  var theme = {
36
- // Body
37
- fg: "#1E90FF",
38
- // dodgerblue
64
+ fg: PALETTE.grey,
39
65
  bg: "black",
40
- logo: "#FFA500",
41
- // orange
42
- // Table
66
+ logo: PALETTE.red,
43
67
  table: {
44
- fg: "#00FFFF",
45
- // aqua
68
+ fg: "#C4C4CF",
46
69
  cursorFg: "black",
47
- cursorBg: "#00FFFF",
48
- // aqua
49
- headerFg: "white",
50
- markColor: "#98FB98",
51
- // palegreen
52
- depHighlightBg: "#1A5276",
53
- // dark steel blue – non-terminal dep rows
54
- blockedCursorBg: "#C0392B"
55
- // strong red – selected row blocked by non-terminal dep
70
+ cursorBg: PALETTE.grey,
71
+ headerFg: "#D5D5DF",
72
+ markColor: PALETTE.skin,
73
+ depHighlightBg: PALETTE.blueDark,
74
+ blockedCursorBg: PALETTE.redDark
56
75
  },
57
- // Status colors (row-level)
58
76
  status: {
59
77
  new: "#87CEFA",
60
- // lightskyblue
61
- modified: "#ADFF2F",
62
- // greenyellow
63
- added: "#1E90FF",
64
- // dodgerblue
65
- error: "#FF4500",
66
- // orangered
67
- pending: "#FF8C00",
68
- // darkorange
69
- highlight: "#00FFFF",
70
- // aqua
71
- kill: "#9370DB",
72
- // mediumpurple
73
- completed: "#778899"
74
- // lightslategray
78
+ modified: "#C4C4CF",
79
+ added: "#4682B4",
80
+ error: PALETTE.red,
81
+ pending: PALETTE.skin,
82
+ highlight: PALETTE.grey,
83
+ kill: "#5A5A64",
84
+ completed: PALETTE.greyDark
75
85
  },
76
- // Frame / borders
77
- border: "#1E90FF",
78
- // dodgerblue
79
- borderFocus: "#00FFFF",
80
- // aqua
81
- // Title
82
- title: "#00FFFF",
83
- // aqua
84
- titleHighlight: "#FF00FF",
85
- // fuchsia
86
- titleCounter: "#FFEFD5",
87
- // papayawhip
88
- titleFilter: "#2E8B57",
89
- // seagreen
90
- // Prompt
91
- prompt: "#5F9EA0",
92
- // cadetblue
93
- promptSuggest: "#1E90FF",
94
- // dodgerblue
95
- // Dialog
86
+ border: "#5A5A64",
87
+ borderFocus: PALETTE.grey,
88
+ title: PALETTE.grey,
89
+ titleHighlight: PALETTE.red,
90
+ titleCounter: PALETTE.skin,
91
+ titleFilter: PALETTE.greyDark,
92
+ prompt: PALETTE.greyDark,
93
+ promptSuggest: PALETTE.grey,
96
94
  dialog: {
97
- fg: "#1E90FF",
98
- // dodgerblue
95
+ fg: PALETTE.grey,
99
96
  buttonFg: "black",
100
- buttonBg: "#1E90FF",
97
+ buttonBg: PALETTE.grey,
101
98
  buttonFocusFg: "white",
102
- buttonFocusBg: "#FF00FF",
103
- // fuchsia
104
- label: "#FF00FF",
105
- // fuchsia
106
- field: "#1E90FF"
99
+ buttonFocusBg: PALETTE.red,
100
+ label: PALETTE.red,
101
+ field: PALETTE.grey
107
102
  },
108
- // Detail/YAML
109
103
  yaml: {
110
- key: "#4682B4",
111
- // steelblue
112
- colon: "white",
113
- value: "#FFEFD5"
114
- // papayawhip
104
+ key: PALETTE.greyDark,
105
+ colon: PALETTE.grey,
106
+ value: "#D5D5DF"
115
107
  },
116
- // Crumbs
117
108
  crumb: {
118
109
  fg: "black",
119
- bg: "#4682B4",
120
- // steelblue
121
- activeBg: "#FFA500"
122
- // orange
110
+ bg: "#5A5A64",
111
+ activeBg: PALETTE.grey
123
112
  },
124
- // Flash
125
113
  flash: {
126
- info: "#FFDEAD",
127
- // navajowhite
128
- warn: "#FFA500",
129
- // orange
130
- error: "#FF4500"
131
- // orangered
114
+ info: "#C4C4CF",
115
+ warn: PALETTE.skin,
116
+ error: PALETTE.red
132
117
  },
133
- // Menu / key hints
134
118
  menu: {
135
- key: "#1E90FF",
136
- // dodgerblue
137
- numKey: "#FF00FF",
138
- // fuchsia
139
- desc: "white"
119
+ key: PALETTE.grey,
120
+ numKey: PALETTE.red,
121
+ desc: PALETTE.greyDark
140
122
  }
141
123
  };
142
124
 
@@ -406,8 +388,43 @@ function appReducer(state, action) {
406
388
  }
407
389
 
408
390
  // src/tui/components/Header.tsx
391
+ import { Box as Box2, Text as Text2 } from "ink";
392
+
393
+ // src/tui/components/Logo.tsx
394
+ import React from "react";
409
395
  import { Box, Text } from "ink";
410
- import { jsx, jsxs } from "react/jsx-runtime";
396
+ import { jsx } from "react/jsx-runtime";
397
+ var Logo = React.memo(function Logo2() {
398
+ const lines = [];
399
+ for (let y = 0; y < LOGO_HEIGHT; y += 2) {
400
+ const chars = [];
401
+ for (let x = 0; x < LOGO_WIDTH; x++) {
402
+ const top = LOGO_PIXELS[y]?.[x] ?? null;
403
+ const bot = LOGO_PIXELS[y + 1]?.[x] ?? null;
404
+ const key = `${y}-${x}`;
405
+ if (top && bot) {
406
+ chars.push(
407
+ /* @__PURE__ */ jsx(Text, { color: PALETTE[top], backgroundColor: PALETTE[bot], children: "\u2580" }, key)
408
+ );
409
+ } else if (top) {
410
+ chars.push(
411
+ /* @__PURE__ */ jsx(Text, { color: PALETTE[top], children: "\u2580" }, key)
412
+ );
413
+ } else if (bot) {
414
+ chars.push(
415
+ /* @__PURE__ */ jsx(Text, { color: PALETTE[bot], children: "\u2584" }, key)
416
+ );
417
+ } else {
418
+ chars.push(/* @__PURE__ */ jsx(Text, { children: " " }, key));
419
+ }
420
+ }
421
+ lines.push(/* @__PURE__ */ jsx(Box, { children: chars }, `row-${y}`));
422
+ }
423
+ return /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: lines });
424
+ });
425
+
426
+ // src/tui/components/Header.tsx
427
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
411
428
  function getKeyHints(view, isSearchActive, focusedPanel) {
412
429
  if (isSearchActive) {
413
430
  return [
@@ -463,33 +480,47 @@ function getKeyHints(view, isSearchActive, focusedPanel) {
463
480
  { key: "q", desc: "quit" }
464
481
  ];
465
482
  }
483
+ function chunkHints(hints, cols) {
484
+ const perCol = Math.ceil(hints.length / cols);
485
+ const result = [];
486
+ for (let i = 0; i < hints.length; i += perCol) {
487
+ result.push(hints.slice(i, i + perCol));
488
+ }
489
+ return result;
490
+ }
466
491
  function Header({ state }) {
467
492
  const projectName = state.activeProject?.name ?? "none";
468
493
  const taskCount = state.tasks.length;
469
494
  const hints = getKeyHints(state.activeView, state.isSearchActive, state.focusedPanel);
470
- return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
471
- /* @__PURE__ */ jsxs(Box, { gap: 2, children: [
472
- /* @__PURE__ */ jsx(Text, { color: theme.logo, bold: true, children: "Tayto" }),
473
- /* @__PURE__ */ jsx(Text, { color: theme.logo, children: "Project:" }),
474
- /* @__PURE__ */ jsx(Text, { color: "white", bold: true, children: projectName }),
475
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: "|" }),
476
- /* @__PURE__ */ jsx(Text, { color: theme.logo, children: "Tasks:" }),
477
- /* @__PURE__ */ jsx(Text, { color: "white", bold: true, children: taskCount })
495
+ const hintCols = hints.length <= 7 ? 2 : hints.length <= 12 ? 3 : 4;
496
+ const columns = chunkHints(hints, hintCols);
497
+ return /* @__PURE__ */ jsxs(Box2, { flexDirection: "row", gap: 1, children: [
498
+ /* @__PURE__ */ jsx2(Box2, { flexShrink: 0, children: /* @__PURE__ */ jsx2(Logo, {}) }),
499
+ /* @__PURE__ */ jsxs(Box2, { flexDirection: "column", justifyContent: "center", flexShrink: 0, paddingLeft: 1, children: [
500
+ /* @__PURE__ */ jsx2(Text2, { color: theme.logo, bold: true, children: "tayto" }),
501
+ /* @__PURE__ */ jsxs(Box2, { gap: 1, children: [
502
+ /* @__PURE__ */ jsx2(Text2, { color: theme.fg, children: "Project:" }),
503
+ /* @__PURE__ */ jsx2(Text2, { color: theme.titleCounter, bold: true, children: projectName })
504
+ ] }),
505
+ /* @__PURE__ */ jsxs(Box2, { gap: 1, children: [
506
+ /* @__PURE__ */ jsx2(Text2, { color: theme.fg, children: "Tasks:" }),
507
+ /* @__PURE__ */ jsx2(Text2, { color: theme.titleCounter, bold: true, children: taskCount })
508
+ ] })
478
509
  ] }),
479
- /* @__PURE__ */ jsx(Box, { flexDirection: "row", flexWrap: "wrap", columnGap: 1, children: hints.map((h) => /* @__PURE__ */ jsxs(Box, { children: [
480
- /* @__PURE__ */ jsxs(Text, { color: theme.menu.key, bold: true, children: [
510
+ /* @__PURE__ */ jsx2(Box2, { flexGrow: 1, justifyContent: "flex-end", children: /* @__PURE__ */ jsx2(Box2, { flexDirection: "row", gap: 2, children: columns.map((col, ci) => /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", children: col.map((h) => /* @__PURE__ */ jsxs(Box2, { children: [
511
+ /* @__PURE__ */ jsxs(Text2, { color: theme.menu.key, bold: true, children: [
481
512
  "<",
482
513
  h.key,
483
514
  ">"
484
515
  ] }),
485
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: h.desc })
486
- ] }, h.key)) })
516
+ /* @__PURE__ */ jsx2(Text2, { color: theme.menu.desc, children: h.desc })
517
+ ] }, h.key)) }, ci)) }) })
487
518
  ] });
488
519
  }
489
520
 
490
521
  // src/tui/components/Crumbs.tsx
491
- import { Box as Box2, Text as Text2 } from "ink";
492
- import { jsx as jsx2 } from "react/jsx-runtime";
522
+ import { Box as Box3, Text as Text3 } from "ink";
523
+ import { jsx as jsx3 } from "react/jsx-runtime";
493
524
  var VIEW_LABELS = {
494
525
  "task-list": "tasks",
495
526
  "task-detail": "detail",
@@ -499,11 +530,11 @@ var VIEW_LABELS = {
499
530
  help: "help"
500
531
  };
501
532
  function Crumbs({ breadcrumbs }) {
502
- return /* @__PURE__ */ jsx2(Box2, { flexDirection: "row", gap: 0, width: "100%", children: breadcrumbs.map((crumb, i) => {
533
+ return /* @__PURE__ */ jsx3(Box3, { flexDirection: "row", gap: 0, width: "100%", children: breadcrumbs.map((crumb, i) => {
503
534
  const isActive = i === breadcrumbs.length - 1;
504
535
  const label = ` ${VIEW_LABELS[crumb] ?? crumb} `;
505
- return /* @__PURE__ */ jsx2(
506
- Text2,
536
+ return /* @__PURE__ */ jsx3(
537
+ Text3,
507
538
  {
508
539
  color: theme.crumb.fg,
509
540
  backgroundColor: isActive ? theme.crumb.activeBg : theme.crumb.bg,
@@ -516,20 +547,20 @@ function Crumbs({ breadcrumbs }) {
516
547
  }
517
548
 
518
549
  // src/tui/components/FlashMessage.tsx
519
- import { Box as Box3, Text as Text3 } from "ink";
520
- import { jsx as jsx3 } from "react/jsx-runtime";
550
+ import { Box as Box4, Text as Text4 } from "ink";
551
+ import { jsx as jsx4 } from "react/jsx-runtime";
521
552
  var LEVEL_COLOR = {
522
553
  info: theme.flash.info,
523
554
  warn: theme.flash.warn,
524
555
  error: theme.flash.error
525
556
  };
526
557
  function FlashMessage({ message, level }) {
527
- return /* @__PURE__ */ jsx3(Box3, { justifyContent: "center", width: "100%", children: /* @__PURE__ */ jsx3(Text3, { color: LEVEL_COLOR[level], bold: level === "error", children: message }) });
558
+ return /* @__PURE__ */ jsx4(Box4, { justifyContent: "center", width: "100%", children: /* @__PURE__ */ jsx4(Text4, { color: LEVEL_COLOR[level], bold: level === "error", children: message }) });
528
559
  }
529
560
 
530
561
  // src/tui/components/TaskList.tsx
531
- import { Box as Box4, Text as Text4 } from "ink";
532
- import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
562
+ import { Box as Box5, Text as Text5 } from "ink";
563
+ import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
533
564
  var COL = {
534
565
  rank: 5,
535
566
  type: 12,
@@ -558,49 +589,49 @@ function TaskList({
558
589
  if (filter.search) filterParts.push(filter.search);
559
590
  const filterText = filterParts.length > 0 ? filterParts.join(" ") : "";
560
591
  return /* @__PURE__ */ jsxs2(
561
- Box4,
592
+ Box5,
562
593
  {
563
594
  flexDirection: "column",
564
595
  flexGrow: 1,
565
596
  borderStyle: "bold",
566
597
  borderColor: isFocused ? theme.borderFocus : theme.border,
567
598
  children: [
568
- /* @__PURE__ */ jsxs2(Box4, { children: [
569
- /* @__PURE__ */ jsxs2(Text4, { color: theme.title, bold: true, children: [
599
+ /* @__PURE__ */ jsxs2(Box5, { children: [
600
+ /* @__PURE__ */ jsxs2(Text5, { color: theme.title, bold: true, children: [
570
601
  " ",
571
602
  "tasks"
572
603
  ] }),
573
- /* @__PURE__ */ jsx4(Text4, { color: theme.fg, children: "(" }),
574
- /* @__PURE__ */ jsx4(Text4, { color: theme.titleHighlight, bold: true, children: activeProjectName }),
575
- /* @__PURE__ */ jsx4(Text4, { color: theme.fg, children: ")" }),
576
- /* @__PURE__ */ jsxs2(Text4, { color: theme.titleCounter, bold: true, children: [
604
+ /* @__PURE__ */ jsx5(Text5, { color: theme.fg, children: "(" }),
605
+ /* @__PURE__ */ jsx5(Text5, { color: theme.titleHighlight, bold: true, children: activeProjectName }),
606
+ /* @__PURE__ */ jsx5(Text5, { color: theme.fg, children: ")" }),
607
+ /* @__PURE__ */ jsxs2(Text5, { color: theme.titleCounter, bold: true, children: [
577
608
  "[",
578
609
  tasks.length,
579
610
  "]"
580
611
  ] }),
581
- isReordering && /* @__PURE__ */ jsxs2(Text4, { color: theme.flash.warn, bold: true, children: [
612
+ isReordering && /* @__PURE__ */ jsxs2(Text5, { color: theme.flash.warn, bold: true, children: [
582
613
  " ",
583
614
  "REORDER"
584
615
  ] }),
585
- epicFilterActive && /* @__PURE__ */ jsx4(Text4, { color: theme.titleHighlight, children: " [epic]" }),
586
- filterText && /* @__PURE__ */ jsxs2(Text4, { color: theme.titleFilter, children: [
616
+ epicFilterActive && /* @__PURE__ */ jsx5(Text5, { color: theme.titleHighlight, children: " [epic]" }),
617
+ filterText && /* @__PURE__ */ jsxs2(Text5, { color: theme.titleFilter, children: [
587
618
  " /",
588
619
  filterText
589
620
  ] })
590
621
  ] }),
591
- isSearchActive && /* @__PURE__ */ jsxs2(Box4, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
592
- /* @__PURE__ */ jsx4(Text4, { color: theme.prompt, children: "/" }),
593
- /* @__PURE__ */ jsx4(Text4, { color: theme.prompt, children: searchQuery }),
594
- /* @__PURE__ */ jsx4(Text4, { color: theme.promptSuggest, children: "_" })
622
+ isSearchActive && /* @__PURE__ */ jsxs2(Box5, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
623
+ /* @__PURE__ */ jsx5(Text5, { color: theme.prompt, children: "/" }),
624
+ /* @__PURE__ */ jsx5(Text5, { color: theme.prompt, children: searchQuery }),
625
+ /* @__PURE__ */ jsx5(Text5, { color: theme.promptSuggest, children: "_" })
595
626
  ] }),
596
- /* @__PURE__ */ jsxs2(Box4, { children: [
597
- /* @__PURE__ */ jsx4(Text4, { color: theme.table.headerFg, bold: true, children: " " }),
598
- /* @__PURE__ */ jsx4(Text4, { color: theme.table.headerFg, bold: true, children: "#".padEnd(COL.rank) }),
599
- /* @__PURE__ */ jsx4(Text4, { color: theme.table.headerFg, bold: true, children: "TYPE".padEnd(COL.type) }),
600
- /* @__PURE__ */ jsx4(Text4, { color: theme.table.headerFg, bold: true, children: "STATUS".padEnd(COL.status) }),
601
- /* @__PURE__ */ jsx4(Text4, { color: theme.table.headerFg, bold: true, children: "NAME" })
627
+ /* @__PURE__ */ jsxs2(Box5, { children: [
628
+ /* @__PURE__ */ jsx5(Text5, { color: theme.table.headerFg, bold: true, children: " " }),
629
+ /* @__PURE__ */ jsx5(Text5, { color: theme.table.headerFg, bold: true, children: "#".padEnd(COL.rank) }),
630
+ /* @__PURE__ */ jsx5(Text5, { color: theme.table.headerFg, bold: true, children: "TYPE".padEnd(COL.type) }),
631
+ /* @__PURE__ */ jsx5(Text5, { color: theme.table.headerFg, bold: true, children: "STATUS".padEnd(COL.status) }),
632
+ /* @__PURE__ */ jsx5(Text5, { color: theme.table.headerFg, bold: true, children: "NAME" })
602
633
  ] }),
603
- /* @__PURE__ */ jsx4(Box4, { flexDirection: "column", flexGrow: 1, overflowY: "hidden", children: tasks.length === 0 ? /* @__PURE__ */ jsx4(Box4, { paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsx4(Text4, { color: theme.fg, children: "No tasks found. Press 'c' to create one." }) }) : visibleTasks.map((task, i) => {
634
+ /* @__PURE__ */ jsx5(Box5, { flexDirection: "column", flexGrow: 1, overflowY: "hidden", children: tasks.length === 0 ? /* @__PURE__ */ jsx5(Box5, { paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsx5(Text5, { color: theme.fg, children: "No tasks found. Press 'c' to create one." }) }) : visibleTasks.map((task, i) => {
604
635
  const actualIndex = viewStart + i;
605
636
  const isSelected = actualIndex === selectedIndex;
606
637
  const isNonTerminalBlocker = nonTerminalBlockerIds.has(task.id);
@@ -610,7 +641,7 @@ function TaskList({
610
641
  const depMarker = isNonTerminalBlocker ? "\u25B2 " : isNonTerminalDependent ? "\u25BC " : " ";
611
642
  if (isSelected) {
612
643
  const cursorBg = isReordering ? theme.flash.warn : isSelectedBlocked ? theme.table.blockedCursorBg : theme.table.cursorBg;
613
- return /* @__PURE__ */ jsx4(Box4, { children: /* @__PURE__ */ jsxs2(Text4, { backgroundColor: cursorBg, color: theme.table.cursorFg, bold: true, children: [
644
+ return /* @__PURE__ */ jsx5(Box5, { children: /* @__PURE__ */ jsxs2(Text5, { backgroundColor: cursorBg, color: theme.table.cursorFg, bold: true, children: [
614
645
  isReordering ? "~ " : "> ",
615
646
  rowNum.padEnd(COL.rank),
616
647
  task.type.padEnd(COL.type),
@@ -619,7 +650,7 @@ function TaskList({
619
650
  ] }) }, task.id);
620
651
  }
621
652
  if (isNonTerminalBlocker || isNonTerminalDependent) {
622
- return /* @__PURE__ */ jsx4(Box4, { children: /* @__PURE__ */ jsxs2(Text4, { backgroundColor: theme.table.depHighlightBg, color: theme.table.fg, bold: true, children: [
653
+ return /* @__PURE__ */ jsx5(Box5, { children: /* @__PURE__ */ jsxs2(Text5, { backgroundColor: theme.table.depHighlightBg, color: theme.table.fg, bold: true, children: [
623
654
  depMarker,
624
655
  rowNum.padEnd(COL.rank),
625
656
  task.type.padEnd(COL.type),
@@ -627,15 +658,15 @@ function TaskList({
627
658
  task.name
628
659
  ] }) }, task.id);
629
660
  }
630
- return /* @__PURE__ */ jsxs2(Box4, { children: [
631
- /* @__PURE__ */ jsx4(Text4, { children: " " }),
632
- /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: rowNum.padEnd(COL.rank) }),
633
- /* @__PURE__ */ jsx4(Text4, { color: TYPE_COLOR[task.type] ?? rowColor, children: task.type.padEnd(COL.type) }),
634
- /* @__PURE__ */ jsx4(Text4, { color: STATUS_COLOR[task.status] ?? rowColor, children: task.status.padEnd(COL.status) }),
635
- /* @__PURE__ */ jsx4(Text4, { color: rowColor, children: task.name })
661
+ return /* @__PURE__ */ jsxs2(Box5, { children: [
662
+ /* @__PURE__ */ jsx5(Text5, { children: " " }),
663
+ /* @__PURE__ */ jsx5(Text5, { dimColor: true, children: rowNum.padEnd(COL.rank) }),
664
+ /* @__PURE__ */ jsx5(Text5, { color: TYPE_COLOR[task.type] ?? rowColor, children: task.type.padEnd(COL.type) }),
665
+ /* @__PURE__ */ jsx5(Text5, { color: STATUS_COLOR[task.status] ?? rowColor, children: task.status.padEnd(COL.status) }),
666
+ /* @__PURE__ */ jsx5(Text5, { color: rowColor, children: task.name })
636
667
  ] }, task.id);
637
668
  }) }),
638
- tasks.length > PAGE_SIZE && /* @__PURE__ */ jsx4(Box4, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs2(Text4, { dimColor: true, children: [
669
+ tasks.length > PAGE_SIZE && /* @__PURE__ */ jsx5(Box5, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs2(Text5, { dimColor: true, children: [
639
670
  "[",
640
671
  viewStart + 1,
641
672
  "-",
@@ -651,11 +682,11 @@ function TaskList({
651
682
 
652
683
  // src/tui/components/TaskDetail.tsx
653
684
  import { useMemo } from "react";
654
- import { Box as Box6, Text as Text6, useStdout } from "ink";
685
+ import { Box as Box7, Text as Text7, useStdout } from "ink";
655
686
  import chalk2 from "chalk";
656
687
 
657
688
  // src/tui/components/Markdown.tsx
658
- import { Text as Text5, Box as Box5 } from "ink";
689
+ import { Text as Text6, Box as Box6 } from "ink";
659
690
  import { Marked } from "marked";
660
691
  import { markedTerminal } from "marked-terminal";
661
692
  import chalk from "chalk";
@@ -691,7 +722,7 @@ mermaid.initialize({ startOnLoad: true, theme: 'dark' });
691
722
  }
692
723
 
693
724
  // src/tui/components/Markdown.tsx
694
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
725
+ import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
695
726
  function extractMermaidBlocks(content) {
696
727
  const lexer = new Marked();
697
728
  const tokens = lexer.lexer(content);
@@ -752,12 +783,12 @@ function renderMarkdown(content) {
752
783
  function MermaidHint({ content }) {
753
784
  const blocks = extractMermaidBlocks(content);
754
785
  if (blocks.length === 0) return null;
755
- return /* @__PURE__ */ jsxs3(Box5, { children: [
756
- /* @__PURE__ */ jsxs3(Text5, { color: theme.menu.key, bold: true, children: [
786
+ return /* @__PURE__ */ jsxs3(Box6, { children: [
787
+ /* @__PURE__ */ jsxs3(Text6, { color: theme.menu.key, bold: true, children: [
757
788
  "<m>",
758
789
  " "
759
790
  ] }),
760
- /* @__PURE__ */ jsxs3(Text5, { dimColor: true, children: [
791
+ /* @__PURE__ */ jsxs3(Text6, { dimColor: true, children: [
761
792
  "Open ",
762
793
  blocks.length,
763
794
  " mermaid diagram",
@@ -775,7 +806,7 @@ function openAllMermaidDiagrams(content) {
775
806
  }
776
807
 
777
808
  // src/tui/components/TaskDetail.tsx
778
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
809
+ import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
779
810
  var PAD = " ";
780
811
  function field(label, value) {
781
812
  return PAD + chalk2.hex(theme.yaml.key).bold(label) + chalk2.hex(theme.yaml.colon)(": ") + chalk2.hex(theme.yaml.value)(value);
@@ -858,29 +889,29 @@ ${task.additionalRequirements}`;
858
889
  const viewportHeight = Math.max(1, (stdout.rows > 0 ? stdout.rows : 24) - CHROME_LINES);
859
890
  const visibleLines = contentLines.slice(scrollOffset, scrollOffset + viewportHeight);
860
891
  return /* @__PURE__ */ jsxs4(
861
- Box6,
892
+ Box7,
862
893
  {
863
894
  flexDirection: "column",
864
895
  flexGrow: 1,
865
896
  borderStyle: "bold",
866
897
  borderColor: isFocused ? theme.borderFocus : theme.border,
867
898
  children: [
868
- /* @__PURE__ */ jsxs4(Box6, { gap: 0, children: [
869
- /* @__PURE__ */ jsxs4(Text6, { color: theme.title, bold: true, children: [
899
+ /* @__PURE__ */ jsxs4(Box7, { gap: 0, children: [
900
+ /* @__PURE__ */ jsxs4(Text7, { color: theme.title, bold: true, children: [
870
901
  " ",
871
902
  "detail"
872
903
  ] }),
873
- /* @__PURE__ */ jsx6(Text6, { color: theme.fg, children: "(" }),
874
- /* @__PURE__ */ jsx6(Text6, { color: theme.titleHighlight, bold: true, children: task.name }),
875
- /* @__PURE__ */ jsx6(Text6, { color: theme.fg, children: ")" }),
876
- scrollOffset > 0 && /* @__PURE__ */ jsxs4(Text6, { dimColor: true, children: [
904
+ /* @__PURE__ */ jsx7(Text7, { color: theme.fg, children: "(" }),
905
+ /* @__PURE__ */ jsx7(Text7, { color: theme.titleHighlight, bold: true, children: task.name }),
906
+ /* @__PURE__ */ jsx7(Text7, { color: theme.fg, children: ")" }),
907
+ scrollOffset > 0 && /* @__PURE__ */ jsxs4(Text7, { dimColor: true, children: [
877
908
  " \u2191",
878
909
  scrollOffset
879
910
  ] })
880
911
  ] }),
881
- /* @__PURE__ */ jsx6(Text6, { children: visibleLines.join("\n") }),
882
- /* @__PURE__ */ jsx6(Box6, { flexGrow: 1 }),
883
- /* @__PURE__ */ jsx6(Box6, { paddingX: 1, children: /* @__PURE__ */ jsx6(MermaidHint, { content: allText }) })
912
+ /* @__PURE__ */ jsx7(Text7, { children: visibleLines.join("\n") }),
913
+ /* @__PURE__ */ jsx7(Box7, { flexGrow: 1 }),
914
+ /* @__PURE__ */ jsx7(Box7, { paddingX: 1, children: /* @__PURE__ */ jsx7(MermaidHint, { content: allText }) })
884
915
  ]
885
916
  }
886
917
  );
@@ -888,7 +919,7 @@ ${task.additionalRequirements}`;
888
919
 
889
920
  // src/tui/components/TaskForm.tsx
890
921
  import { useState as useState2, useCallback } from "react";
891
- import { Box as Box8, Text as Text8, useInput as useInput2 } from "ink";
922
+ import { Box as Box9, Text as Text9, useInput as useInput2 } from "ink";
892
923
 
893
924
  // src/tui/editor.ts
894
925
  import { writeFileSync as writeFileSync2, readFileSync, unlinkSync, mkdtempSync as mkdtempSync2 } from "fs";
@@ -925,8 +956,8 @@ function openInEditor(content, filename) {
925
956
 
926
957
  // src/tui/components/TaskPicker.tsx
927
958
  import { useState } from "react";
928
- import { Box as Box7, Text as Text7, useInput, useStdout as useStdout2 } from "ink";
929
- import { Fragment, jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
959
+ import { Box as Box8, Text as Text8, useInput, useStdout as useStdout2 } from "ink";
960
+ import { Fragment, jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
930
961
  var DEP_TYPE_VALUES = Object.values(UIDependencyType);
931
962
  var DEP_TYPE_COLOR = {
932
963
  [DependencyType.Blocks]: theme.status.error,
@@ -1040,28 +1071,28 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
1040
1071
  return;
1041
1072
  }
1042
1073
  });
1043
- return /* @__PURE__ */ jsxs5(Box7, { flexDirection: "column", borderStyle: "bold", borderColor: theme.borderFocus, flexGrow: 1, children: [
1044
- /* @__PURE__ */ jsxs5(Box7, { gap: 0, children: [
1045
- /* @__PURE__ */ jsxs5(Text7, { color: theme.title, bold: true, children: [
1074
+ return /* @__PURE__ */ jsxs5(Box8, { flexDirection: "column", borderStyle: "bold", borderColor: theme.borderFocus, flexGrow: 1, children: [
1075
+ /* @__PURE__ */ jsxs5(Box8, { gap: 0, children: [
1076
+ /* @__PURE__ */ jsxs5(Text8, { color: theme.title, bold: true, children: [
1046
1077
  " ",
1047
1078
  "select dependencies"
1048
1079
  ] }),
1049
- /* @__PURE__ */ jsxs5(Text7, { color: theme.titleCounter, bold: true, children: [
1080
+ /* @__PURE__ */ jsxs5(Text8, { color: theme.titleCounter, bold: true, children: [
1050
1081
  " ",
1051
1082
  "[",
1052
1083
  selected.size,
1053
1084
  " selected]"
1054
1085
  ] })
1055
1086
  ] }),
1056
- isSearching ? /* @__PURE__ */ jsxs5(Box7, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
1057
- /* @__PURE__ */ jsx7(Text7, { color: theme.prompt, children: "/" }),
1058
- /* @__PURE__ */ jsx7(Text7, { color: theme.prompt, children: searchQuery }),
1059
- /* @__PURE__ */ jsx7(Text7, { color: theme.promptSuggest, children: "_" })
1060
- ] }) : searchQuery ? /* @__PURE__ */ jsx7(Box7, { paddingX: 1, children: /* @__PURE__ */ jsxs5(Text7, { color: theme.titleFilter, children: [
1087
+ isSearching ? /* @__PURE__ */ jsxs5(Box8, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
1088
+ /* @__PURE__ */ jsx8(Text8, { color: theme.prompt, children: "/" }),
1089
+ /* @__PURE__ */ jsx8(Text8, { color: theme.prompt, children: searchQuery }),
1090
+ /* @__PURE__ */ jsx8(Text8, { color: theme.promptSuggest, children: "_" })
1091
+ ] }) : searchQuery ? /* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: /* @__PURE__ */ jsxs5(Text8, { color: theme.titleFilter, children: [
1061
1092
  "/",
1062
1093
  searchQuery
1063
1094
  ] }) }) : null,
1064
- /* @__PURE__ */ jsx7(Box7, { paddingX: 1, children: /* @__PURE__ */ jsxs5(Text7, { color: theme.table.headerFg, bold: true, children: [
1095
+ /* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: /* @__PURE__ */ jsxs5(Text8, { color: theme.table.headerFg, bold: true, children: [
1065
1096
  " ",
1066
1097
  "SEL".padEnd(5),
1067
1098
  "ID".padEnd(14),
@@ -1069,7 +1100,7 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
1069
1100
  "STATUS".padEnd(14),
1070
1101
  "NAME"
1071
1102
  ] }) }),
1072
- available.length === 0 ? /* @__PURE__ */ jsx7(Box7, { paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "No tasks match the filter" }) }) : visible.map((task, i) => {
1103
+ available.length === 0 ? /* @__PURE__ */ jsx8(Box8, { paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsx8(Text8, { dimColor: true, children: "No tasks match the filter" }) }) : visible.map((task, i) => {
1073
1104
  const actualIndex = viewStart + i;
1074
1105
  const isCursor = actualIndex === cursorIndex;
1075
1106
  const entry = selected.get(task.id);
@@ -1077,7 +1108,7 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
1077
1108
  const checkMark = isChecked ? "[x]" : "[ ]";
1078
1109
  const depType = entry ? DEP_TYPE_LABEL[entry.type] ?? entry.type : "";
1079
1110
  const depColor = entry ? DEP_TYPE_COLOR[entry.type] ?? theme.table.fg : theme.table.fg;
1080
- return /* @__PURE__ */ jsx7(Box7, { paddingX: 1, children: isCursor ? /* @__PURE__ */ jsxs5(Text7, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
1111
+ return /* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: isCursor ? /* @__PURE__ */ jsxs5(Text8, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
1081
1112
  "> ",
1082
1113
  checkMark.padEnd(5),
1083
1114
  task.id.padEnd(14),
@@ -1085,16 +1116,16 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
1085
1116
  task.status.padEnd(14),
1086
1117
  task.name
1087
1118
  ] }) : /* @__PURE__ */ jsxs5(Fragment, { children: [
1088
- /* @__PURE__ */ jsx7(Text7, { children: " " }),
1089
- /* @__PURE__ */ jsx7(Text7, { color: isChecked ? theme.status.added : theme.table.fg, children: checkMark.padEnd(5) }),
1090
- /* @__PURE__ */ jsx7(Text7, { color: theme.yaml.value, children: task.id.padEnd(14) }),
1091
- /* @__PURE__ */ jsx7(Text7, { color: depColor, children: depType.padEnd(12) }),
1092
- /* @__PURE__ */ jsx7(Text7, { color: theme.status.completed, children: task.status.padEnd(14) }),
1093
- /* @__PURE__ */ jsx7(Text7, { color: theme.table.fg, children: task.name })
1119
+ /* @__PURE__ */ jsx8(Text8, { children: " " }),
1120
+ /* @__PURE__ */ jsx8(Text8, { color: isChecked ? theme.status.added : theme.table.fg, children: checkMark.padEnd(5) }),
1121
+ /* @__PURE__ */ jsx8(Text8, { color: theme.yaml.value, children: task.id.padEnd(14) }),
1122
+ /* @__PURE__ */ jsx8(Text8, { color: depColor, children: depType.padEnd(12) }),
1123
+ /* @__PURE__ */ jsx8(Text8, { color: theme.status.completed, children: task.status.padEnd(14) }),
1124
+ /* @__PURE__ */ jsx8(Text8, { color: theme.table.fg, children: task.name })
1094
1125
  ] }) }, task.id);
1095
1126
  }),
1096
- /* @__PURE__ */ jsx7(Box7, { flexGrow: 1 }),
1097
- available.length > maxVisible && /* @__PURE__ */ jsx7(Box7, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs5(Text7, { dimColor: true, children: [
1127
+ /* @__PURE__ */ jsx8(Box8, { flexGrow: 1 }),
1128
+ available.length > maxVisible && /* @__PURE__ */ jsx8(Box8, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs5(Text8, { dimColor: true, children: [
1098
1129
  "[",
1099
1130
  viewStart + 1,
1100
1131
  "-",
@@ -1103,11 +1134,11 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
1103
1134
  available.length,
1104
1135
  "]"
1105
1136
  ] }) }),
1106
- selected.size > 0 && /* @__PURE__ */ jsxs5(Box7, { paddingX: 1, flexDirection: "column", children: [
1107
- /* @__PURE__ */ jsx7(Text7, { color: theme.table.headerFg, bold: true, children: "Selected:" }),
1108
- /* @__PURE__ */ jsx7(Box7, { children: /* @__PURE__ */ jsx7(Text7, { children: Array.from(selected.values()).map((d) => `${d.id} (${DEP_TYPE_LABEL[d.type] ?? d.type})`).join(", ") }) })
1137
+ selected.size > 0 && /* @__PURE__ */ jsxs5(Box8, { paddingX: 1, flexDirection: "column", children: [
1138
+ /* @__PURE__ */ jsx8(Text8, { color: theme.table.headerFg, bold: true, children: "Selected:" }),
1139
+ /* @__PURE__ */ jsx8(Box8, { children: /* @__PURE__ */ jsx8(Text8, { children: Array.from(selected.values()).map((d) => `${d.id} (${DEP_TYPE_LABEL[d.type] ?? d.type})`).join(", ") }) })
1109
1140
  ] }),
1110
- /* @__PURE__ */ jsx7(Box7, { paddingX: 1, children: /* @__PURE__ */ jsxs5(Text7, { dimColor: true, children: [
1141
+ /* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: /* @__PURE__ */ jsxs5(Text8, { dimColor: true, children: [
1111
1142
  "space/t: select & cycle type (blocks ",
1112
1143
  "->",
1113
1144
  " relates-to ",
@@ -1123,7 +1154,7 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
1123
1154
  }
1124
1155
 
1125
1156
  // src/tui/components/TaskForm.tsx
1126
- import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
1157
+ import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
1127
1158
  var FIELDS = [
1128
1159
  { label: "Name", key: "name", type: "inline" },
1129
1160
  { label: "Type", key: "type", type: "select", options: TYPE_VALUES },
@@ -1254,7 +1285,7 @@ function TaskForm({ editingTask, allTasks, initialDeps, onSave, onCancel }) {
1254
1285
  );
1255
1286
  if (pickerActive) {
1256
1287
  const pickerExclude = editingTask ? { excludeIds: /* @__PURE__ */ new Set([editingTask.id]) } : {};
1257
- return /* @__PURE__ */ jsx8(
1288
+ return /* @__PURE__ */ jsx9(
1258
1289
  TaskPicker,
1259
1290
  {
1260
1291
  tasks: allTasks,
@@ -1267,53 +1298,53 @@ function TaskForm({ editingTask, allTasks, initialDeps, onSave, onCancel }) {
1267
1298
  }
1268
1299
  const isEdit = editingTask !== null;
1269
1300
  const depSummary = pickedDeps.length > 0 ? pickedDeps.map((d) => `${d.id} (${DEP_TYPE_LABEL[d.type] ?? d.type})`).join(", ") : "";
1270
- return /* @__PURE__ */ jsxs6(Box8, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
1271
- /* @__PURE__ */ jsx8(Box8, { gap: 0, children: /* @__PURE__ */ jsxs6(Text8, { color: theme.title, bold: true, children: [
1301
+ return /* @__PURE__ */ jsxs6(Box9, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
1302
+ /* @__PURE__ */ jsx9(Box9, { gap: 0, children: /* @__PURE__ */ jsxs6(Text9, { color: theme.title, bold: true, children: [
1272
1303
  " ",
1273
1304
  isEdit ? "edit" : "create"
1274
1305
  ] }) }),
1275
- /* @__PURE__ */ jsx8(Box8, { flexDirection: "column", paddingX: 1, paddingY: 0, children: FIELDS.map((field2, i) => {
1306
+ /* @__PURE__ */ jsx9(Box9, { flexDirection: "column", paddingX: 1, paddingY: 0, children: FIELDS.map((field2, i) => {
1276
1307
  const isFocused = i === focusIndex;
1277
1308
  const value = field2.key === "dependsOn" ? depSummary : values[field2.key] ?? "";
1278
1309
  const displayValue = value;
1279
- return /* @__PURE__ */ jsxs6(Box8, { gap: 1, children: [
1280
- /* @__PURE__ */ jsxs6(Text8, { color: isFocused ? theme.dialog.label : theme.yaml.key, bold: isFocused, children: [
1310
+ return /* @__PURE__ */ jsxs6(Box9, { gap: 1, children: [
1311
+ /* @__PURE__ */ jsxs6(Text9, { color: isFocused ? theme.dialog.label : theme.yaml.key, bold: isFocused, children: [
1281
1312
  isFocused ? ">" : " ",
1282
1313
  " ",
1283
1314
  field2.label.padEnd(14)
1284
1315
  ] }),
1285
- field2.type === "inline" && /* @__PURE__ */ jsxs6(Text8, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
1316
+ field2.type === "inline" && /* @__PURE__ */ jsxs6(Text9, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
1286
1317
  displayValue,
1287
- isFocused ? /* @__PURE__ */ jsx8(Text8, { color: theme.titleHighlight, children: "_" }) : ""
1318
+ isFocused ? /* @__PURE__ */ jsx9(Text9, { color: theme.titleHighlight, children: "_" }) : ""
1288
1319
  ] }),
1289
- field2.type === "picker" && /* @__PURE__ */ jsxs6(Text8, { children: [
1290
- displayValue ? /* @__PURE__ */ jsx8(Text8, { color: theme.status.added, children: displayValue.length > 60 ? displayValue.slice(0, 60) + "..." : displayValue }) : /* @__PURE__ */ jsx8(Text8, { dimColor: true, children: isFocused ? "press enter to select" : "none" }),
1291
- isFocused && /* @__PURE__ */ jsx8(Text8, { color: theme.menu.key, children: " [enter: open picker]" })
1320
+ field2.type === "picker" && /* @__PURE__ */ jsxs6(Text9, { children: [
1321
+ displayValue ? /* @__PURE__ */ jsx9(Text9, { color: theme.status.added, children: displayValue.length > 60 ? displayValue.slice(0, 60) + "..." : displayValue }) : /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: isFocused ? "press enter to select" : "none" }),
1322
+ isFocused && /* @__PURE__ */ jsx9(Text9, { color: theme.menu.key, children: " [enter: open picker]" })
1292
1323
  ] }),
1293
- field2.type === "editor" && /* @__PURE__ */ jsxs6(Text8, { children: [
1294
- displayValue ? /* @__PURE__ */ jsxs6(Text8, { color: theme.status.added, children: [
1324
+ field2.type === "editor" && /* @__PURE__ */ jsxs6(Text9, { children: [
1325
+ displayValue ? /* @__PURE__ */ jsxs6(Text9, { color: theme.status.added, children: [
1295
1326
  displayValue.split("\n")[0]?.slice(0, 50),
1296
1327
  displayValue.length > 50 || displayValue.includes("\n") ? "..." : ""
1297
- ] }) : /* @__PURE__ */ jsx8(Text8, { dimColor: true, children: isFocused ? "press enter" : "empty" }),
1298
- isFocused && /* @__PURE__ */ jsx8(Text8, { color: theme.menu.key, children: " [enter: $EDITOR]" })
1328
+ ] }) : /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: isFocused ? "press enter" : "empty" }),
1329
+ isFocused && /* @__PURE__ */ jsx9(Text9, { color: theme.menu.key, children: " [enter: $EDITOR]" })
1299
1330
  ] }),
1300
- field2.type === "select" && /* @__PURE__ */ jsxs6(Text8, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
1331
+ field2.type === "select" && /* @__PURE__ */ jsxs6(Text9, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
1301
1332
  isFocused ? "< " : " ",
1302
1333
  displayValue,
1303
1334
  isFocused ? " >" : ""
1304
1335
  ] })
1305
1336
  ] }, field2.key);
1306
1337
  }) }),
1307
- /* @__PURE__ */ jsx8(Box8, { flexGrow: 1 }),
1308
- /* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: /* @__PURE__ */ jsx8(Text8, { dimColor: true, children: "tab: next | shift+tab: prev | ctrl+s: save | esc: cancel" }) }),
1309
- editorActive && /* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: /* @__PURE__ */ jsx8(Text8, { color: theme.flash.warn, bold: true, children: "Editor open... save and close to return" }) })
1338
+ /* @__PURE__ */ jsx9(Box9, { flexGrow: 1 }),
1339
+ /* @__PURE__ */ jsx9(Box9, { paddingX: 1, children: /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: "tab: next | shift+tab: prev | ctrl+s: save | esc: cancel" }) }),
1340
+ editorActive && /* @__PURE__ */ jsx9(Box9, { paddingX: 1, children: /* @__PURE__ */ jsx9(Text9, { color: theme.flash.warn, bold: true, children: "Editor open... save and close to return" }) })
1310
1341
  ] });
1311
1342
  }
1312
1343
 
1313
1344
  // src/tui/components/ProjectSelector.tsx
1314
1345
  import { useState as useState3 } from "react";
1315
- import { Box as Box9, Text as Text9, useInput as useInput3 } from "ink";
1316
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
1346
+ import { Box as Box10, Text as Text10, useInput as useInput3 } from "ink";
1347
+ import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
1317
1348
  function ProjectSelector({
1318
1349
  projects,
1319
1350
  activeProject,
@@ -1365,24 +1396,24 @@ function ProjectSelector({
1365
1396
  setSelectedIndex((i) => Math.min(projects.length - 1, i + 1));
1366
1397
  }
1367
1398
  });
1368
- return /* @__PURE__ */ jsxs7(Box9, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
1369
- /* @__PURE__ */ jsxs7(Box9, { gap: 0, children: [
1370
- /* @__PURE__ */ jsxs7(Text9, { color: theme.title, bold: true, children: [
1399
+ return /* @__PURE__ */ jsxs7(Box10, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
1400
+ /* @__PURE__ */ jsxs7(Box10, { gap: 0, children: [
1401
+ /* @__PURE__ */ jsxs7(Text10, { color: theme.title, bold: true, children: [
1371
1402
  " ",
1372
1403
  "projects"
1373
1404
  ] }),
1374
- /* @__PURE__ */ jsxs7(Text9, { color: theme.titleCounter, bold: true, children: [
1405
+ /* @__PURE__ */ jsxs7(Text10, { color: theme.titleCounter, bold: true, children: [
1375
1406
  "[",
1376
1407
  projects.length,
1377
1408
  "]"
1378
1409
  ] })
1379
1410
  ] }),
1380
- /* @__PURE__ */ jsxs7(Box9, { paddingX: 1, children: [
1381
- /* @__PURE__ */ jsx9(Text9, { color: theme.table.headerFg, bold: true, children: " NAME".padEnd(30) }),
1382
- /* @__PURE__ */ jsx9(Text9, { color: theme.table.headerFg, bold: true, children: "GIT REMOTE".padEnd(40) }),
1383
- /* @__PURE__ */ jsx9(Text9, { color: theme.table.headerFg, bold: true, children: "DESCRIPTION" })
1411
+ /* @__PURE__ */ jsxs7(Box10, { paddingX: 1, children: [
1412
+ /* @__PURE__ */ jsx10(Text10, { color: theme.table.headerFg, bold: true, children: " NAME".padEnd(30) }),
1413
+ /* @__PURE__ */ jsx10(Text10, { color: theme.table.headerFg, bold: true, children: "GIT REMOTE".padEnd(40) }),
1414
+ /* @__PURE__ */ jsx10(Text10, { color: theme.table.headerFg, bold: true, children: "DESCRIPTION" })
1384
1415
  ] }),
1385
- projects.length === 0 ? /* @__PURE__ */ jsx9(Box9, { paddingX: 1, paddingY: 1, children: /* @__PURE__ */ jsx9(Text9, { color: theme.fg, children: "No projects. Press 'c' to create one." }) }) : projects.map((project, i) => {
1416
+ projects.length === 0 ? /* @__PURE__ */ jsx10(Box10, { paddingX: 1, paddingY: 1, children: /* @__PURE__ */ jsx10(Text10, { color: theme.fg, children: "No projects. Press 'c' to create one." }) }) : projects.map((project, i) => {
1386
1417
  const isSelected = i === selectedIndex;
1387
1418
  const isActive = project.id === activeProject?.id;
1388
1419
  const activeMarker = isActive ? "*" : " ";
@@ -1390,7 +1421,7 @@ function ProjectSelector({
1390
1421
  const marker = `${activeMarker}${defaultMarker}`;
1391
1422
  const remoteDisplay = (project.gitRemote ?? "").slice(0, 38).padEnd(40);
1392
1423
  if (isSelected) {
1393
- return /* @__PURE__ */ jsx9(Box9, { paddingX: 1, children: /* @__PURE__ */ jsxs7(Text9, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
1424
+ return /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsxs7(Text10, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
1394
1425
  marker,
1395
1426
  " ",
1396
1427
  project.name.padEnd(27),
@@ -1398,25 +1429,25 @@ function ProjectSelector({
1398
1429
  project.description
1399
1430
  ] }) }, project.id);
1400
1431
  }
1401
- return /* @__PURE__ */ jsxs7(Box9, { paddingX: 1, children: [
1402
- /* @__PURE__ */ jsxs7(Text9, { color: isActive ? theme.status.modified : theme.table.fg, children: [
1432
+ return /* @__PURE__ */ jsxs7(Box10, { paddingX: 1, children: [
1433
+ /* @__PURE__ */ jsxs7(Text10, { color: isActive ? theme.status.modified : theme.table.fg, children: [
1403
1434
  marker,
1404
1435
  " ",
1405
1436
  project.name.padEnd(27)
1406
1437
  ] }),
1407
- /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: remoteDisplay }),
1408
- /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: project.description })
1438
+ /* @__PURE__ */ jsx10(Text10, { dimColor: true, children: remoteDisplay }),
1439
+ /* @__PURE__ */ jsx10(Text10, { dimColor: true, children: project.description })
1409
1440
  ] }, project.id);
1410
1441
  }),
1411
- /* @__PURE__ */ jsx9(Box9, { flexGrow: 1 }),
1412
- /* @__PURE__ */ jsx9(Box9, { paddingX: 1, children: /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: "enter: select | d: set default | l: link git | c: create | esc: back" }) })
1442
+ /* @__PURE__ */ jsx10(Box10, { flexGrow: 1 }),
1443
+ /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx10(Text10, { dimColor: true, children: "enter: select | d: set default | l: link git | c: create | esc: back" }) })
1413
1444
  ] });
1414
1445
  }
1415
1446
 
1416
1447
  // src/tui/components/ProjectForm.tsx
1417
1448
  import { useState as useState4 } from "react";
1418
- import { Box as Box10, Text as Text10, useInput as useInput4 } from "ink";
1419
- import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
1449
+ import { Box as Box11, Text as Text11, useInput as useInput4 } from "ink";
1450
+ import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
1420
1451
  var FIELDS2 = [
1421
1452
  { label: "Name", key: "name", type: "inline" },
1422
1453
  { label: "Key", key: "key", type: "inline" },
@@ -1477,41 +1508,41 @@ function ProjectForm({ onSave, onCancel }) {
1477
1508
  }
1478
1509
  }
1479
1510
  });
1480
- return /* @__PURE__ */ jsxs8(Box10, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
1481
- /* @__PURE__ */ jsx10(Box10, { gap: 0, children: /* @__PURE__ */ jsxs8(Text10, { color: theme.title, bold: true, children: [
1511
+ return /* @__PURE__ */ jsxs8(Box11, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
1512
+ /* @__PURE__ */ jsx11(Box11, { gap: 0, children: /* @__PURE__ */ jsxs8(Text11, { color: theme.title, bold: true, children: [
1482
1513
  " ",
1483
1514
  "new project"
1484
1515
  ] }) }),
1485
- /* @__PURE__ */ jsx10(Box10, { flexDirection: "column", paddingX: 1, paddingY: 0, children: FIELDS2.map((field2, i) => {
1516
+ /* @__PURE__ */ jsx11(Box11, { flexDirection: "column", paddingX: 1, paddingY: 0, children: FIELDS2.map((field2, i) => {
1486
1517
  const isFocused = i === focusIndex;
1487
1518
  const value = values[field2.key] ?? "";
1488
- return /* @__PURE__ */ jsxs8(Box10, { gap: 1, children: [
1489
- /* @__PURE__ */ jsxs8(Text10, { color: isFocused ? theme.dialog.label : theme.yaml.key, bold: isFocused, children: [
1519
+ return /* @__PURE__ */ jsxs8(Box11, { gap: 1, children: [
1520
+ /* @__PURE__ */ jsxs8(Text11, { color: isFocused ? theme.dialog.label : theme.yaml.key, bold: isFocused, children: [
1490
1521
  isFocused ? ">" : " ",
1491
1522
  " ",
1492
1523
  field2.label.padEnd(14)
1493
1524
  ] }),
1494
- field2.type === "inline" && /* @__PURE__ */ jsxs8(Text10, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
1525
+ field2.type === "inline" && /* @__PURE__ */ jsxs8(Text11, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
1495
1526
  value,
1496
- isFocused ? /* @__PURE__ */ jsx10(Text10, { color: theme.titleHighlight, children: "_" }) : "",
1497
- field2.key === "key" && !value && /* @__PURE__ */ jsx10(Text10, { dimColor: true, children: isFocused ? " (auto from name)" : "" })
1527
+ isFocused ? /* @__PURE__ */ jsx11(Text11, { color: theme.titleHighlight, children: "_" }) : "",
1528
+ field2.key === "key" && !value && /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: isFocused ? " (auto from name)" : "" })
1498
1529
  ] }),
1499
- field2.type === "toggle" && /* @__PURE__ */ jsxs8(Text10, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
1530
+ field2.type === "toggle" && /* @__PURE__ */ jsxs8(Text11, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
1500
1531
  isFocused ? "< " : " ",
1501
1532
  value,
1502
1533
  isFocused ? " >" : ""
1503
1534
  ] })
1504
1535
  ] }, field2.key);
1505
1536
  }) }),
1506
- /* @__PURE__ */ jsx10(Box10, { flexGrow: 1 }),
1507
- /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx10(Text10, { dimColor: true, children: "tab: next | shift+tab: prev | ctrl+s: save | esc: cancel" }) })
1537
+ /* @__PURE__ */ jsx11(Box11, { flexGrow: 1 }),
1538
+ /* @__PURE__ */ jsx11(Box11, { paddingX: 1, children: /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "tab: next | shift+tab: prev | ctrl+s: save | esc: cancel" }) })
1508
1539
  ] });
1509
1540
  }
1510
1541
 
1511
1542
  // src/tui/components/ProjectLinkForm.tsx
1512
1543
  import { useState as useState5 } from "react";
1513
- import { Box as Box11, Text as Text11, useInput as useInput5 } from "ink";
1514
- import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
1544
+ import { Box as Box12, Text as Text12, useInput as useInput5 } from "ink";
1545
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
1515
1546
  function ProjectLinkForm({ project, onSave, onUnlink, onDetect, onCancel }) {
1516
1547
  const [remoteUrl, setRemoteUrl] = useState5(project.gitRemote ?? "");
1517
1548
  useInput5((input, key) => {
@@ -1547,24 +1578,24 @@ function ProjectLinkForm({ project, onSave, onUnlink, onDetect, onCancel }) {
1547
1578
  setRemoteUrl((v) => v + input);
1548
1579
  }
1549
1580
  });
1550
- return /* @__PURE__ */ jsxs9(Box11, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
1551
- /* @__PURE__ */ jsxs9(Box11, { gap: 0, children: [
1552
- /* @__PURE__ */ jsxs9(Text11, { color: theme.title, bold: true, children: [
1581
+ return /* @__PURE__ */ jsxs9(Box12, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
1582
+ /* @__PURE__ */ jsxs9(Box12, { gap: 0, children: [
1583
+ /* @__PURE__ */ jsxs9(Text12, { color: theme.title, bold: true, children: [
1553
1584
  " ",
1554
1585
  "link git remote"
1555
1586
  ] }),
1556
- /* @__PURE__ */ jsxs9(Text11, { color: theme.titleCounter, bold: true, children: [
1587
+ /* @__PURE__ */ jsxs9(Text12, { color: theme.titleCounter, bold: true, children: [
1557
1588
  " ",
1558
1589
  "[",
1559
1590
  project.name,
1560
1591
  "]"
1561
1592
  ] })
1562
1593
  ] }),
1563
- /* @__PURE__ */ jsxs9(Box11, { flexDirection: "column", paddingX: 1, paddingY: 1, children: [
1564
- /* @__PURE__ */ jsxs9(Box11, { gap: 1, children: [
1565
- /* @__PURE__ */ jsx11(Text11, { color: theme.dialog.label, bold: true, children: "Current:" }),
1566
- /* @__PURE__ */ jsx11(
1567
- Text11,
1594
+ /* @__PURE__ */ jsxs9(Box12, { flexDirection: "column", paddingX: 1, paddingY: 1, children: [
1595
+ /* @__PURE__ */ jsxs9(Box12, { gap: 1, children: [
1596
+ /* @__PURE__ */ jsx12(Text12, { color: theme.dialog.label, bold: true, children: "Current:" }),
1597
+ /* @__PURE__ */ jsx12(
1598
+ Text12,
1568
1599
  {
1569
1600
  color: project.gitRemote ? theme.yaml.value : theme.table.fg,
1570
1601
  dimColor: !project.gitRemote,
@@ -1572,22 +1603,22 @@ function ProjectLinkForm({ project, onSave, onUnlink, onDetect, onCancel }) {
1572
1603
  }
1573
1604
  )
1574
1605
  ] }),
1575
- /* @__PURE__ */ jsxs9(Box11, { gap: 1, marginTop: 1, children: [
1576
- /* @__PURE__ */ jsx11(Text11, { color: theme.dialog.label, bold: true, children: "Remote URL: " }),
1577
- /* @__PURE__ */ jsxs9(Text11, { color: theme.yaml.value, children: [
1606
+ /* @__PURE__ */ jsxs9(Box12, { gap: 1, marginTop: 1, children: [
1607
+ /* @__PURE__ */ jsx12(Text12, { color: theme.dialog.label, bold: true, children: "Remote URL: " }),
1608
+ /* @__PURE__ */ jsxs9(Text12, { color: theme.yaml.value, children: [
1578
1609
  remoteUrl,
1579
- /* @__PURE__ */ jsx11(Text11, { color: theme.titleHighlight, children: "_" })
1610
+ /* @__PURE__ */ jsx12(Text12, { color: theme.titleHighlight, children: "_" })
1580
1611
  ] })
1581
1612
  ] })
1582
1613
  ] }),
1583
- /* @__PURE__ */ jsx11(Box11, { flexGrow: 1 }),
1584
- /* @__PURE__ */ jsx11(Box11, { paddingX: 1, children: /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "ctrl+s: save | ctrl+d: detect from cwd | ctrl+u: unlink | esc: cancel" }) })
1614
+ /* @__PURE__ */ jsx12(Box12, { flexGrow: 1 }),
1615
+ /* @__PURE__ */ jsx12(Box12, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text12, { dimColor: true, children: "ctrl+s: save | ctrl+d: detect from cwd | ctrl+u: unlink | esc: cancel" }) })
1585
1616
  ] });
1586
1617
  }
1587
1618
 
1588
1619
  // src/tui/components/HelpOverlay.tsx
1589
- import { Box as Box12, Text as Text12 } from "ink";
1590
- import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
1620
+ import { Box as Box13, Text as Text13 } from "ink";
1621
+ import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
1591
1622
  var SECTIONS = [
1592
1623
  {
1593
1624
  title: "NAVIGATION",
@@ -1650,7 +1681,7 @@ var SECTIONS = [
1650
1681
  ];
1651
1682
  function HelpOverlay() {
1652
1683
  return /* @__PURE__ */ jsxs10(
1653
- Box12,
1684
+ Box13,
1654
1685
  {
1655
1686
  flexDirection: "column",
1656
1687
  borderStyle: "bold",
@@ -1658,35 +1689,35 @@ function HelpOverlay() {
1658
1689
  paddingX: 2,
1659
1690
  paddingY: 1,
1660
1691
  children: [
1661
- /* @__PURE__ */ jsxs10(Text12, { color: theme.title, bold: true, children: [
1692
+ /* @__PURE__ */ jsxs10(Text13, { color: theme.title, bold: true, children: [
1662
1693
  " ",
1663
1694
  "Help"
1664
1695
  ] }),
1665
- /* @__PURE__ */ jsx12(Text12, { children: " " }),
1666
- /* @__PURE__ */ jsx12(Box12, { flexDirection: "row", gap: 4, children: SECTIONS.map((section) => /* @__PURE__ */ jsxs10(Box12, { flexDirection: "column", children: [
1667
- /* @__PURE__ */ jsx12(Text12, { color: theme.table.headerFg, bold: true, children: section.title }),
1668
- section.keys.map(([key, desc]) => /* @__PURE__ */ jsxs10(Box12, { gap: 1, children: [
1669
- /* @__PURE__ */ jsxs10(Text12, { color: theme.menu.key, bold: true, children: [
1696
+ /* @__PURE__ */ jsx13(Text13, { children: " " }),
1697
+ /* @__PURE__ */ jsx13(Box13, { flexDirection: "row", gap: 4, children: SECTIONS.map((section) => /* @__PURE__ */ jsxs10(Box13, { flexDirection: "column", children: [
1698
+ /* @__PURE__ */ jsx13(Text13, { color: theme.table.headerFg, bold: true, children: section.title }),
1699
+ section.keys.map(([key, desc]) => /* @__PURE__ */ jsxs10(Box13, { gap: 1, children: [
1700
+ /* @__PURE__ */ jsxs10(Text13, { color: theme.menu.key, bold: true, children: [
1670
1701
  "<",
1671
1702
  (key ?? "").padEnd(5),
1672
1703
  ">"
1673
1704
  ] }),
1674
- /* @__PURE__ */ jsx12(Text12, { dimColor: true, children: desc })
1705
+ /* @__PURE__ */ jsx13(Text13, { dimColor: true, children: desc })
1675
1706
  ] }, key))
1676
1707
  ] }, section.title)) }),
1677
- /* @__PURE__ */ jsx12(Text12, { children: " " }),
1678
- /* @__PURE__ */ jsx12(Text12, { dimColor: true, children: "Press any key to close" })
1708
+ /* @__PURE__ */ jsx13(Text13, { children: " " }),
1709
+ /* @__PURE__ */ jsx13(Text13, { dimColor: true, children: "Press any key to close" })
1679
1710
  ]
1680
1711
  }
1681
1712
  );
1682
1713
  }
1683
1714
 
1684
1715
  // src/tui/components/ConfirmDialog.tsx
1685
- import { Box as Box13, Text as Text13 } from "ink";
1686
- import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1716
+ import { Box as Box14, Text as Text14 } from "ink";
1717
+ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
1687
1718
  function ConfirmDialog({ task }) {
1688
1719
  return /* @__PURE__ */ jsxs11(
1689
- Box13,
1720
+ Box14,
1690
1721
  {
1691
1722
  flexDirection: "column",
1692
1723
  borderStyle: "bold",
@@ -1695,17 +1726,17 @@ function ConfirmDialog({ task }) {
1695
1726
  paddingY: 1,
1696
1727
  alignSelf: "center",
1697
1728
  children: [
1698
- /* @__PURE__ */ jsx13(Text13, { color: theme.dialog.label, bold: true, children: "<Delete>" }),
1699
- /* @__PURE__ */ jsx13(Text13, { children: " " }),
1700
- /* @__PURE__ */ jsxs11(Text13, { color: theme.dialog.fg, children: [
1729
+ /* @__PURE__ */ jsx14(Text14, { color: theme.dialog.label, bold: true, children: "<Delete>" }),
1730
+ /* @__PURE__ */ jsx14(Text14, { children: " " }),
1731
+ /* @__PURE__ */ jsxs11(Text14, { color: theme.dialog.fg, children: [
1701
1732
  'Delete task "',
1702
1733
  task.name,
1703
1734
  '"?'
1704
1735
  ] }),
1705
- /* @__PURE__ */ jsx13(Text13, { children: " " }),
1706
- /* @__PURE__ */ jsxs11(Box13, { gap: 3, children: [
1707
- /* @__PURE__ */ jsx13(Box13, { children: /* @__PURE__ */ jsx13(
1708
- Text13,
1736
+ /* @__PURE__ */ jsx14(Text14, { children: " " }),
1737
+ /* @__PURE__ */ jsxs11(Box14, { gap: 3, children: [
1738
+ /* @__PURE__ */ jsx14(Box14, { children: /* @__PURE__ */ jsx14(
1739
+ Text14,
1709
1740
  {
1710
1741
  backgroundColor: theme.dialog.buttonFocusBg,
1711
1742
  color: theme.dialog.buttonFocusFg,
@@ -1713,7 +1744,7 @@ function ConfirmDialog({ task }) {
1713
1744
  children: " y: OK "
1714
1745
  }
1715
1746
  ) }),
1716
- /* @__PURE__ */ jsx13(Box13, { children: /* @__PURE__ */ jsx13(Text13, { backgroundColor: theme.dialog.buttonBg, color: theme.dialog.buttonFg, children: " n: Cancel " }) })
1747
+ /* @__PURE__ */ jsx14(Box14, { children: /* @__PURE__ */ jsx14(Text14, { backgroundColor: theme.dialog.buttonBg, color: theme.dialog.buttonFg, children: " n: Cancel " }) })
1717
1748
  ] })
1718
1749
  ]
1719
1750
  }
@@ -1721,8 +1752,8 @@ function ConfirmDialog({ task }) {
1721
1752
  }
1722
1753
 
1723
1754
  // src/tui/components/DependencyList.tsx
1724
- import { Box as Box14, Text as Text14 } from "ink";
1725
- import { Fragment as Fragment2, jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1755
+ import { Box as Box15, Text as Text15 } from "ink";
1756
+ import { Fragment as Fragment2, jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
1726
1757
  function TaskRow({
1727
1758
  task,
1728
1759
  globalIndex,
@@ -1730,16 +1761,16 @@ function TaskRow({
1730
1761
  }) {
1731
1762
  const isSelected = globalIndex === selectedIndex;
1732
1763
  const statusColor = STATUS_COLOR[task.status] ?? theme.table.fg;
1733
- return /* @__PURE__ */ jsx14(Box14, { children: isSelected ? /* @__PURE__ */ jsxs12(Text14, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
1764
+ return /* @__PURE__ */ jsx15(Box15, { children: isSelected ? /* @__PURE__ */ jsxs12(Text15, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
1734
1765
  "> ",
1735
1766
  task.id.padEnd(12),
1736
1767
  task.status.padEnd(14),
1737
1768
  task.name
1738
1769
  ] }) : /* @__PURE__ */ jsxs12(Fragment2, { children: [
1739
- /* @__PURE__ */ jsx14(Text14, { children: " " }),
1740
- /* @__PURE__ */ jsx14(Text14, { color: theme.yaml.value, children: task.id.padEnd(12) }),
1741
- /* @__PURE__ */ jsx14(Text14, { color: statusColor, children: task.status.padEnd(14) }),
1742
- /* @__PURE__ */ jsx14(Text14, { color: theme.table.fg, children: task.name })
1770
+ /* @__PURE__ */ jsx15(Text15, { children: " " }),
1771
+ /* @__PURE__ */ jsx15(Text15, { color: theme.yaml.value, children: task.id.padEnd(12) }),
1772
+ /* @__PURE__ */ jsx15(Text15, { color: statusColor, children: task.status.padEnd(14) }),
1773
+ /* @__PURE__ */ jsx15(Text15, { color: theme.table.fg, children: task.name })
1743
1774
  ] }) }, task.id);
1744
1775
  }
1745
1776
  function DependencyList({
@@ -1760,23 +1791,23 @@ function DependencyList({
1760
1791
  const relatedOffset = offset;
1761
1792
  offset += related.length;
1762
1793
  const duplicatesOffset = offset;
1763
- return /* @__PURE__ */ jsxs12(Box14, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
1764
- /* @__PURE__ */ jsxs12(Box14, { gap: 0, children: [
1765
- /* @__PURE__ */ jsxs12(Text14, { color: theme.title, bold: true, children: [
1794
+ return /* @__PURE__ */ jsxs12(Box15, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
1795
+ /* @__PURE__ */ jsxs12(Box15, { gap: 0, children: [
1796
+ /* @__PURE__ */ jsxs12(Text15, { color: theme.title, bold: true, children: [
1766
1797
  " ",
1767
1798
  "dependencies"
1768
1799
  ] }),
1769
- /* @__PURE__ */ jsx14(Text14, { color: theme.fg, children: "(" }),
1770
- /* @__PURE__ */ jsx14(Text14, { color: theme.titleHighlight, bold: true, children: task.name }),
1771
- /* @__PURE__ */ jsx14(Text14, { color: theme.fg, children: ")" })
1800
+ /* @__PURE__ */ jsx15(Text15, { color: theme.fg, children: "(" }),
1801
+ /* @__PURE__ */ jsx15(Text15, { color: theme.titleHighlight, bold: true, children: task.name }),
1802
+ /* @__PURE__ */ jsx15(Text15, { color: theme.fg, children: ")" })
1772
1803
  ] }),
1773
- /* @__PURE__ */ jsxs12(Box14, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
1774
- /* @__PURE__ */ jsxs12(Text14, { color: theme.table.headerFg, bold: true, children: [
1804
+ /* @__PURE__ */ jsxs12(Box15, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
1805
+ /* @__PURE__ */ jsxs12(Text15, { color: theme.table.headerFg, bold: true, children: [
1775
1806
  "BLOCKED BY (",
1776
1807
  blockers.length,
1777
1808
  ")"
1778
1809
  ] }),
1779
- blockers.length === 0 ? /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: " No blockers" }) : blockers.map((t, i) => /* @__PURE__ */ jsx14(
1810
+ blockers.length === 0 ? /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: " No blockers" }) : blockers.map((t, i) => /* @__PURE__ */ jsx15(
1780
1811
  TaskRow,
1781
1812
  {
1782
1813
  task: t,
@@ -1786,13 +1817,13 @@ function DependencyList({
1786
1817
  t.id
1787
1818
  ))
1788
1819
  ] }),
1789
- /* @__PURE__ */ jsxs12(Box14, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
1790
- /* @__PURE__ */ jsxs12(Text14, { color: theme.table.headerFg, bold: true, children: [
1820
+ /* @__PURE__ */ jsxs12(Box15, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
1821
+ /* @__PURE__ */ jsxs12(Text15, { color: theme.table.headerFg, bold: true, children: [
1791
1822
  "BLOCKS (",
1792
1823
  dependents.length,
1793
1824
  ")"
1794
1825
  ] }),
1795
- dependents.length === 0 ? /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: " No dependents" }) : dependents.map((t, i) => /* @__PURE__ */ jsx14(
1826
+ dependents.length === 0 ? /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: " No dependents" }) : dependents.map((t, i) => /* @__PURE__ */ jsx15(
1796
1827
  TaskRow,
1797
1828
  {
1798
1829
  task: t,
@@ -1802,13 +1833,13 @@ function DependencyList({
1802
1833
  t.id
1803
1834
  ))
1804
1835
  ] }),
1805
- /* @__PURE__ */ jsxs12(Box14, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
1806
- /* @__PURE__ */ jsxs12(Text14, { color: theme.table.headerFg, bold: true, children: [
1836
+ /* @__PURE__ */ jsxs12(Box15, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
1837
+ /* @__PURE__ */ jsxs12(Text15, { color: theme.table.headerFg, bold: true, children: [
1807
1838
  "RELATES TO (",
1808
1839
  related.length,
1809
1840
  ")"
1810
1841
  ] }),
1811
- related.length === 0 ? /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: " No related tasks" }) : related.map((t, i) => /* @__PURE__ */ jsx14(
1842
+ related.length === 0 ? /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: " No related tasks" }) : related.map((t, i) => /* @__PURE__ */ jsx15(
1812
1843
  TaskRow,
1813
1844
  {
1814
1845
  task: t,
@@ -1818,13 +1849,13 @@ function DependencyList({
1818
1849
  t.id
1819
1850
  ))
1820
1851
  ] }),
1821
- /* @__PURE__ */ jsxs12(Box14, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
1822
- /* @__PURE__ */ jsxs12(Text14, { color: theme.table.headerFg, bold: true, children: [
1852
+ /* @__PURE__ */ jsxs12(Box15, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
1853
+ /* @__PURE__ */ jsxs12(Text15, { color: theme.table.headerFg, bold: true, children: [
1823
1854
  "DUPLICATES (",
1824
1855
  duplicates.length,
1825
1856
  ")"
1826
1857
  ] }),
1827
- duplicates.length === 0 ? /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: " No duplicate tasks" }) : duplicates.map((t, i) => /* @__PURE__ */ jsx14(
1858
+ duplicates.length === 0 ? /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: " No duplicate tasks" }) : duplicates.map((t, i) => /* @__PURE__ */ jsx15(
1828
1859
  TaskRow,
1829
1860
  {
1830
1861
  task: t,
@@ -1834,19 +1865,19 @@ function DependencyList({
1834
1865
  t.id
1835
1866
  ))
1836
1867
  ] }),
1837
- /* @__PURE__ */ jsx14(Box14, { flexGrow: 1 }),
1838
- isAddingDep && /* @__PURE__ */ jsxs12(Box14, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
1839
- /* @__PURE__ */ jsx14(Text14, { color: theme.prompt, children: "depends on (id or id:type): " }),
1840
- /* @__PURE__ */ jsx14(Text14, { color: theme.prompt, children: addDepInput }),
1841
- /* @__PURE__ */ jsx14(Text14, { color: theme.promptSuggest, children: "_" })
1868
+ /* @__PURE__ */ jsx15(Box15, { flexGrow: 1 }),
1869
+ isAddingDep && /* @__PURE__ */ jsxs12(Box15, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
1870
+ /* @__PURE__ */ jsx15(Text15, { color: theme.prompt, children: "depends on (id or id:type): " }),
1871
+ /* @__PURE__ */ jsx15(Text15, { color: theme.prompt, children: addDepInput }),
1872
+ /* @__PURE__ */ jsx15(Text15, { color: theme.promptSuggest, children: "_" })
1842
1873
  ] }),
1843
- /* @__PURE__ */ jsx14(Box14, { paddingX: 1, children: /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: "a: add dep (id or id:relates-to) | x: remove selected | enter: go to task | esc: back" }) })
1874
+ /* @__PURE__ */ jsx15(Box15, { paddingX: 1, children: /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "a: add dep (id or id:relates-to) | x: remove selected | enter: go to task | esc: back" }) })
1844
1875
  ] });
1845
1876
  }
1846
1877
 
1847
1878
  // src/tui/components/EpicPanel.tsx
1848
- import { Box as Box15, Text as Text15 } from "ink";
1849
- import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1879
+ import { Box as Box16, Text as Text16 } from "ink";
1880
+ import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
1850
1881
  var PAGE_SIZE2 = 20;
1851
1882
  function EpicPanel({
1852
1883
  epics,
@@ -1860,33 +1891,33 @@ function EpicPanel({
1860
1891
  const viewStart = currentPage * PAGE_SIZE2;
1861
1892
  const visibleEpics = epics.slice(viewStart, viewStart + PAGE_SIZE2);
1862
1893
  return /* @__PURE__ */ jsxs13(
1863
- Box15,
1894
+ Box16,
1864
1895
  {
1865
1896
  flexDirection: "column",
1866
1897
  width: 48,
1867
1898
  borderStyle: "bold",
1868
1899
  borderColor: isFocused ? theme.borderFocus : theme.border,
1869
1900
  children: [
1870
- /* @__PURE__ */ jsxs13(Box15, { children: [
1871
- /* @__PURE__ */ jsxs13(Text15, { color: theme.title, bold: true, children: [
1901
+ /* @__PURE__ */ jsxs13(Box16, { children: [
1902
+ /* @__PURE__ */ jsxs13(Text16, { color: theme.title, bold: true, children: [
1872
1903
  " ",
1873
1904
  "epics"
1874
1905
  ] }),
1875
- /* @__PURE__ */ jsxs13(Text15, { color: theme.titleCounter, bold: true, children: [
1906
+ /* @__PURE__ */ jsxs13(Text16, { color: theme.titleCounter, bold: true, children: [
1876
1907
  "[",
1877
1908
  epics.length,
1878
1909
  "]"
1879
1910
  ] }),
1880
- isReordering && /* @__PURE__ */ jsxs13(Text15, { color: theme.flash.warn, bold: true, children: [
1911
+ isReordering && /* @__PURE__ */ jsxs13(Text16, { color: theme.flash.warn, bold: true, children: [
1881
1912
  " ",
1882
1913
  "REORDER"
1883
1914
  ] }),
1884
- filterActive && /* @__PURE__ */ jsxs13(Text15, { color: theme.titleFilter, children: [
1915
+ filterActive && /* @__PURE__ */ jsxs13(Text16, { color: theme.titleFilter, children: [
1885
1916
  " *",
1886
1917
  selectedEpicIds.size
1887
1918
  ] })
1888
1919
  ] }),
1889
- /* @__PURE__ */ jsx15(Box15, { flexDirection: "column", flexGrow: 1, overflowY: "hidden", children: epics.length === 0 ? /* @__PURE__ */ jsx15(Box15, { paddingX: 1, children: /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "No epics" }) }) : visibleEpics.map((epic, i) => {
1920
+ /* @__PURE__ */ jsx16(Box16, { flexDirection: "column", flexGrow: 1, overflowY: "hidden", children: epics.length === 0 ? /* @__PURE__ */ jsx16(Box16, { paddingX: 1, children: /* @__PURE__ */ jsx16(Text16, { dimColor: true, children: "No epics" }) }) : visibleEpics.map((epic, i) => {
1890
1921
  const actualIndex = viewStart + i;
1891
1922
  const isSelected = actualIndex === selectedIndex && isFocused;
1892
1923
  const isChecked = selectedEpicIds.has(epic.id);
@@ -1894,21 +1925,21 @@ function EpicPanel({
1894
1925
  const statusColor = STATUS_COLOR[epic.status] ?? theme.table.fg;
1895
1926
  if (isSelected) {
1896
1927
  const cursorBg = isReordering ? theme.flash.warn : theme.table.cursorBg;
1897
- return /* @__PURE__ */ jsx15(Box15, { children: /* @__PURE__ */ jsxs13(Text15, { backgroundColor: cursorBg, color: theme.table.cursorFg, bold: true, children: [
1928
+ return /* @__PURE__ */ jsx16(Box16, { children: /* @__PURE__ */ jsxs13(Text16, { backgroundColor: cursorBg, color: theme.table.cursorFg, bold: true, children: [
1898
1929
  isReordering ? "~ " : " ",
1899
1930
  marker,
1900
1931
  " ",
1901
1932
  epic.name
1902
1933
  ] }) }, epic.id);
1903
1934
  }
1904
- return /* @__PURE__ */ jsx15(Box15, { children: /* @__PURE__ */ jsxs13(Text15, { color: isChecked ? theme.titleHighlight : statusColor, children: [
1935
+ return /* @__PURE__ */ jsx16(Box16, { children: /* @__PURE__ */ jsxs13(Text16, { color: isChecked ? theme.titleHighlight : statusColor, children: [
1905
1936
  " ",
1906
1937
  marker,
1907
1938
  " ",
1908
1939
  epic.name
1909
1940
  ] }) }, epic.id);
1910
1941
  }) }),
1911
- epics.length > PAGE_SIZE2 && /* @__PURE__ */ jsx15(Box15, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs13(Text15, { dimColor: true, children: [
1942
+ epics.length > PAGE_SIZE2 && /* @__PURE__ */ jsx16(Box16, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs13(Text16, { dimColor: true, children: [
1912
1943
  "[",
1913
1944
  viewStart + 1,
1914
1945
  "-",
@@ -1924,8 +1955,8 @@ function EpicPanel({
1924
1955
 
1925
1956
  // src/tui/components/EpicPicker.tsx
1926
1957
  import { useState as useState6 } from "react";
1927
- import { Box as Box16, Text as Text16, useInput as useInput6, useStdout as useStdout3 } from "ink";
1928
- import { Fragment as Fragment3, jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
1958
+ import { Box as Box17, Text as Text17, useInput as useInput6, useStdout as useStdout3 } from "ink";
1959
+ import { Fragment as Fragment3, jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
1929
1960
  function EpicPicker({ epics, currentEpicId, onSelect, onCancel }) {
1930
1961
  const { stdout } = useStdout3();
1931
1962
  const termHeight = stdout.rows > 0 ? stdout.rows : 24;
@@ -1998,53 +2029,53 @@ function EpicPicker({ epics, currentEpicId, onSelect, onCancel }) {
1998
2029
  return;
1999
2030
  }
2000
2031
  });
2001
- return /* @__PURE__ */ jsxs14(Box16, { flexDirection: "column", borderStyle: "bold", borderColor: theme.borderFocus, flexGrow: 1, children: [
2002
- /* @__PURE__ */ jsxs14(Box16, { gap: 0, children: [
2003
- /* @__PURE__ */ jsxs14(Text16, { color: theme.title, bold: true, children: [
2032
+ return /* @__PURE__ */ jsxs14(Box17, { flexDirection: "column", borderStyle: "bold", borderColor: theme.borderFocus, flexGrow: 1, children: [
2033
+ /* @__PURE__ */ jsxs14(Box17, { gap: 0, children: [
2034
+ /* @__PURE__ */ jsxs14(Text17, { color: theme.title, bold: true, children: [
2004
2035
  " ",
2005
2036
  "assign to epic"
2006
2037
  ] }),
2007
- /* @__PURE__ */ jsxs14(Text16, { color: theme.titleCounter, bold: true, children: [
2038
+ /* @__PURE__ */ jsxs14(Text17, { color: theme.titleCounter, bold: true, children: [
2008
2039
  " ",
2009
2040
  "[",
2010
2041
  epics.length,
2011
2042
  "]"
2012
2043
  ] })
2013
2044
  ] }),
2014
- isSearching ? /* @__PURE__ */ jsxs14(Box16, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
2015
- /* @__PURE__ */ jsx16(Text16, { color: theme.prompt, children: "/" }),
2016
- /* @__PURE__ */ jsx16(Text16, { color: theme.prompt, children: searchQuery }),
2017
- /* @__PURE__ */ jsx16(Text16, { color: theme.promptSuggest, children: "_" })
2018
- ] }) : searchQuery ? /* @__PURE__ */ jsx16(Box16, { paddingX: 1, children: /* @__PURE__ */ jsxs14(Text16, { color: theme.titleFilter, children: [
2045
+ isSearching ? /* @__PURE__ */ jsxs14(Box17, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
2046
+ /* @__PURE__ */ jsx17(Text17, { color: theme.prompt, children: "/" }),
2047
+ /* @__PURE__ */ jsx17(Text17, { color: theme.prompt, children: searchQuery }),
2048
+ /* @__PURE__ */ jsx17(Text17, { color: theme.promptSuggest, children: "_" })
2049
+ ] }) : searchQuery ? /* @__PURE__ */ jsx17(Box17, { paddingX: 1, children: /* @__PURE__ */ jsxs14(Text17, { color: theme.titleFilter, children: [
2019
2050
  "/",
2020
2051
  searchQuery
2021
2052
  ] }) }) : null,
2022
- /* @__PURE__ */ jsx16(Box16, { paddingX: 1, children: /* @__PURE__ */ jsxs14(Text16, { color: theme.table.headerFg, bold: true, children: [
2053
+ /* @__PURE__ */ jsx17(Box17, { paddingX: 1, children: /* @__PURE__ */ jsxs14(Text17, { color: theme.table.headerFg, bold: true, children: [
2023
2054
  " ",
2024
2055
  "ID".padEnd(14),
2025
2056
  "STATUS".padEnd(14),
2026
2057
  "NAME"
2027
2058
  ] }) }),
2028
- filtered.length === 0 ? /* @__PURE__ */ jsx16(Box16, { paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsx16(Text16, { dimColor: true, children: "No epics match the filter" }) }) : visible.map((epic, i) => {
2059
+ filtered.length === 0 ? /* @__PURE__ */ jsx17(Box17, { paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsx17(Text17, { dimColor: true, children: "No epics match the filter" }) }) : visible.map((epic, i) => {
2029
2060
  const actualIndex = viewStart + i;
2030
2061
  const isCursor = actualIndex === cursorIndex;
2031
2062
  const isCurrent = epic.id === currentEpicId;
2032
2063
  const marker = isCurrent ? "* " : " ";
2033
2064
  const statusColor = STATUS_COLOR[epic.status] ?? theme.table.fg;
2034
- return /* @__PURE__ */ jsx16(Box16, { paddingX: 1, children: isCursor ? /* @__PURE__ */ jsxs14(Text16, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
2065
+ return /* @__PURE__ */ jsx17(Box17, { paddingX: 1, children: isCursor ? /* @__PURE__ */ jsxs14(Text17, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
2035
2066
  "> ",
2036
2067
  epic.id.padEnd(14),
2037
2068
  epic.status.padEnd(14),
2038
2069
  epic.name
2039
2070
  ] }) : /* @__PURE__ */ jsxs14(Fragment3, { children: [
2040
- /* @__PURE__ */ jsx16(Text16, { color: isCurrent ? theme.titleHighlight : theme.table.fg, children: marker }),
2041
- /* @__PURE__ */ jsx16(Text16, { color: theme.yaml.value, children: epic.id.padEnd(14) }),
2042
- /* @__PURE__ */ jsx16(Text16, { color: statusColor, children: epic.status.padEnd(14) }),
2043
- /* @__PURE__ */ jsx16(Text16, { color: isCurrent ? theme.titleHighlight : theme.table.fg, children: epic.name })
2071
+ /* @__PURE__ */ jsx17(Text17, { color: isCurrent ? theme.titleHighlight : theme.table.fg, children: marker }),
2072
+ /* @__PURE__ */ jsx17(Text17, { color: theme.yaml.value, children: epic.id.padEnd(14) }),
2073
+ /* @__PURE__ */ jsx17(Text17, { color: statusColor, children: epic.status.padEnd(14) }),
2074
+ /* @__PURE__ */ jsx17(Text17, { color: isCurrent ? theme.titleHighlight : theme.table.fg, children: epic.name })
2044
2075
  ] }) }, epic.id);
2045
2076
  }),
2046
- /* @__PURE__ */ jsx16(Box16, { flexGrow: 1 }),
2047
- filtered.length > maxVisible && /* @__PURE__ */ jsx16(Box16, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs14(Text16, { dimColor: true, children: [
2077
+ /* @__PURE__ */ jsx17(Box17, { flexGrow: 1 }),
2078
+ filtered.length > maxVisible && /* @__PURE__ */ jsx17(Box17, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs14(Text17, { dimColor: true, children: [
2048
2079
  "[",
2049
2080
  viewStart + 1,
2050
2081
  "-",
@@ -2053,7 +2084,7 @@ function EpicPicker({ epics, currentEpicId, onSelect, onCancel }) {
2053
2084
  filtered.length,
2054
2085
  "]"
2055
2086
  ] }) }),
2056
- /* @__PURE__ */ jsx16(Box16, { paddingX: 1, children: /* @__PURE__ */ jsx16(Text16, { dimColor: true, children: "enter: assign | x: unassign | /: search | esc: cancel" }) })
2087
+ /* @__PURE__ */ jsx17(Box17, { paddingX: 1, children: /* @__PURE__ */ jsx17(Text17, { dimColor: true, children: "enter: assign | x: unassign | /: search | esc: cancel" }) })
2057
2088
  ] });
2058
2089
  }
2059
2090
 
@@ -2093,7 +2124,7 @@ function useAutoRefetch(dbPath, onRefetch) {
2093
2124
  }
2094
2125
 
2095
2126
  // src/tui/components/App.tsx
2096
- import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
2127
+ import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
2097
2128
  var STATUS_CYCLE = [
2098
2129
  TaskStatus.Backlog,
2099
2130
  TaskStatus.Todo,
@@ -3013,12 +3044,12 @@ ${state.selectedTask.additionalRequirements}`;
3013
3044
  loadDeps(previewTaskId);
3014
3045
  }
3015
3046
  }, [state.activeView, previewTaskId, loadDeps]);
3016
- return /* @__PURE__ */ jsxs15(Box17, { flexDirection: "column", height: stdout.rows, children: [
3017
- /* @__PURE__ */ jsx17(Header, { state }),
3018
- /* @__PURE__ */ jsxs15(Box17, { flexDirection: "column", flexGrow: 1, overflowY: "hidden", children: [
3019
- state.confirmDelete && /* @__PURE__ */ jsx17(ConfirmDialog, { task: state.confirmDelete }),
3020
- !state.confirmDelete && state.activeView === ViewType.TaskList && /* @__PURE__ */ jsxs15(Box17, { flexDirection: "row", flexGrow: 1, children: [
3021
- /* @__PURE__ */ jsx17(
3047
+ return /* @__PURE__ */ jsxs15(Box18, { flexDirection: "column", height: stdout.rows, children: [
3048
+ /* @__PURE__ */ jsx18(Header, { state }),
3049
+ /* @__PURE__ */ jsxs15(Box18, { flexDirection: "column", flexGrow: 1, overflowY: "hidden", children: [
3050
+ state.confirmDelete && /* @__PURE__ */ jsx18(ConfirmDialog, { task: state.confirmDelete }),
3051
+ !state.confirmDelete && state.activeView === ViewType.TaskList && /* @__PURE__ */ jsxs15(Box18, { flexDirection: "row", flexGrow: 1, children: [
3052
+ /* @__PURE__ */ jsx18(
3022
3053
  EpicPanel,
3023
3054
  {
3024
3055
  epics: state.epics,
@@ -3028,7 +3059,7 @@ ${state.selectedTask.additionalRequirements}`;
3028
3059
  isReordering: state.isEpicReordering
3029
3060
  }
3030
3061
  ),
3031
- /* @__PURE__ */ jsx17(Box17, { width: taskListWidth, children: /* @__PURE__ */ jsx17(
3062
+ /* @__PURE__ */ jsx18(Box18, { width: taskListWidth, children: /* @__PURE__ */ jsx18(
3032
3063
  TaskList,
3033
3064
  {
3034
3065
  tasks: state.tasks,
@@ -3049,7 +3080,7 @@ ${state.selectedTask.additionalRequirements}`;
3049
3080
  epicFilterActive: state.selectedEpicIds.size > 0
3050
3081
  }
3051
3082
  ) }),
3052
- /* @__PURE__ */ jsx17(Box17, { width: taskDetailWidth, children: previewTask ? /* @__PURE__ */ jsx17(
3083
+ /* @__PURE__ */ jsx18(Box18, { width: taskDetailWidth, children: previewTask ? /* @__PURE__ */ jsx18(
3053
3084
  TaskDetail,
3054
3085
  {
3055
3086
  task: previewTask,
@@ -3061,23 +3092,23 @@ ${state.selectedTask.additionalRequirements}`;
3061
3092
  scrollOffset: state.detailScrollOffset
3062
3093
  }
3063
3094
  ) : /* @__PURE__ */ jsxs15(
3064
- Box17,
3095
+ Box18,
3065
3096
  {
3066
3097
  flexDirection: "column",
3067
3098
  flexGrow: 1,
3068
3099
  borderStyle: "bold",
3069
3100
  borderColor: theme.border,
3070
3101
  children: [
3071
- /* @__PURE__ */ jsx17(Box17, { children: /* @__PURE__ */ jsxs15(Text17, { color: theme.title, bold: true, children: [
3102
+ /* @__PURE__ */ jsx18(Box18, { children: /* @__PURE__ */ jsxs15(Text18, { color: theme.title, bold: true, children: [
3072
3103
  " ",
3073
3104
  "detail"
3074
3105
  ] }) }),
3075
- /* @__PURE__ */ jsx17(Box17, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsx17(Text17, { dimColor: true, children: "No task selected" }) })
3106
+ /* @__PURE__ */ jsx18(Box18, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsx18(Text18, { dimColor: true, children: "No task selected" }) })
3076
3107
  ]
3077
3108
  }
3078
3109
  ) })
3079
3110
  ] }),
3080
- !state.confirmDelete && state.activeView === ViewType.TaskDetail && state.selectedTask && /* @__PURE__ */ jsx17(
3111
+ !state.confirmDelete && state.activeView === ViewType.TaskDetail && state.selectedTask && /* @__PURE__ */ jsx18(
3081
3112
  TaskDetail,
3082
3113
  {
3083
3114
  task: state.selectedTask,
@@ -3088,7 +3119,7 @@ ${state.selectedTask.additionalRequirements}`;
3088
3119
  scrollOffset: state.detailScrollOffset
3089
3120
  }
3090
3121
  ),
3091
- !state.confirmDelete && state.activeView === ViewType.DependencyList && state.selectedTask && /* @__PURE__ */ jsx17(
3122
+ !state.confirmDelete && state.activeView === ViewType.DependencyList && state.selectedTask && /* @__PURE__ */ jsx18(
3092
3123
  DependencyList,
3093
3124
  {
3094
3125
  task: state.selectedTask,
@@ -3101,7 +3132,7 @@ ${state.selectedTask.additionalRequirements}`;
3101
3132
  addDepInput: state.addDepInput
3102
3133
  }
3103
3134
  ),
3104
- !state.confirmDelete && (state.activeView === ViewType.TaskCreate || state.activeView === ViewType.TaskEdit) && /* @__PURE__ */ jsx17(
3135
+ !state.confirmDelete && (state.activeView === ViewType.TaskCreate || state.activeView === ViewType.TaskEdit) && /* @__PURE__ */ jsx18(
3105
3136
  TaskForm,
3106
3137
  {
3107
3138
  editingTask: state.activeView === ViewType.TaskEdit ? state.selectedTask : null,
@@ -3111,7 +3142,7 @@ ${state.selectedTask.additionalRequirements}`;
3111
3142
  onCancel: handleFormCancel
3112
3143
  }
3113
3144
  ),
3114
- !state.confirmDelete && state.activeView === ViewType.EpicPicker && state.selectedTask && /* @__PURE__ */ jsx17(
3145
+ !state.confirmDelete && state.activeView === ViewType.EpicPicker && state.selectedTask && /* @__PURE__ */ jsx18(
3115
3146
  EpicPicker,
3116
3147
  {
3117
3148
  epics: state.epics,
@@ -3120,7 +3151,7 @@ ${state.selectedTask.additionalRequirements}`;
3120
3151
  onCancel: handleEpicPickerCancel
3121
3152
  }
3122
3153
  ),
3123
- !state.confirmDelete && state.activeView === ViewType.ProjectSelector && /* @__PURE__ */ jsx17(
3154
+ !state.confirmDelete && state.activeView === ViewType.ProjectSelector && /* @__PURE__ */ jsx18(
3124
3155
  ProjectSelector,
3125
3156
  {
3126
3157
  projects: state.projects,
@@ -3132,8 +3163,8 @@ ${state.selectedTask.additionalRequirements}`;
3132
3163
  onCancel: handleProjectCancel
3133
3164
  }
3134
3165
  ),
3135
- !state.confirmDelete && state.activeView === ViewType.ProjectCreate && /* @__PURE__ */ jsx17(ProjectForm, { onSave: handleProjectFormSave, onCancel: handleProjectFormCancel }),
3136
- !state.confirmDelete && state.activeView === ViewType.ProjectLink && state.linkingProject && /* @__PURE__ */ jsx17(
3166
+ !state.confirmDelete && state.activeView === ViewType.ProjectCreate && /* @__PURE__ */ jsx18(ProjectForm, { onSave: handleProjectFormSave, onCancel: handleProjectFormCancel }),
3167
+ !state.confirmDelete && state.activeView === ViewType.ProjectLink && state.linkingProject && /* @__PURE__ */ jsx18(
3137
3168
  ProjectLinkForm,
3138
3169
  {
3139
3170
  project: state.linkingProject,
@@ -3143,17 +3174,17 @@ ${state.selectedTask.additionalRequirements}`;
3143
3174
  onCancel: handleLinkCancel
3144
3175
  }
3145
3176
  ),
3146
- !state.confirmDelete && state.activeView === ViewType.Help && /* @__PURE__ */ jsx17(HelpOverlay, {})
3177
+ !state.confirmDelete && state.activeView === ViewType.Help && /* @__PURE__ */ jsx18(HelpOverlay, {})
3147
3178
  ] }),
3148
- /* @__PURE__ */ jsx17(Crumbs, { breadcrumbs: state.breadcrumbs }),
3149
- state.flash && /* @__PURE__ */ jsx17(FlashMessage, { message: state.flash.message, level: state.flash.level })
3179
+ /* @__PURE__ */ jsx18(Crumbs, { breadcrumbs: state.breadcrumbs }),
3180
+ state.flash && /* @__PURE__ */ jsx18(FlashMessage, { message: state.flash.message, level: state.flash.level })
3150
3181
  ] });
3151
3182
  }
3152
3183
 
3153
3184
  // src/tui/index.tsx
3154
- import { jsx as jsx18 } from "react/jsx-runtime";
3185
+ import { jsx as jsx19 } from "react/jsx-runtime";
3155
3186
  async function launchTUI(container, initialProject) {
3156
- const instance = render(/* @__PURE__ */ jsx18(App, { container, initialProject }), {
3187
+ const instance = render(/* @__PURE__ */ jsx19(App, { container, initialProject }), {
3157
3188
  exitOnCtrlC: true
3158
3189
  });
3159
3190
  await instance.waitUntilExit();
@@ -3161,4 +3192,4 @@ async function launchTUI(container, initialProject) {
3161
3192
  export {
3162
3193
  launchTUI
3163
3194
  };
3164
- //# sourceMappingURL=tui-IXZGQMWN.js.map
3195
+ //# sourceMappingURL=tui-24ZW56Q6.js.map