brainfile 0.18.1 → 0.20.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.
Files changed (275) hide show
  1. package/README.md +18 -24
  2. package/dist/__tests__/helpers/mcp-wire.d.ts +45 -0
  3. package/dist/__tests__/helpers/mcp-wire.d.ts.map +1 -0
  4. package/dist/__tests__/helpers/mcp-wire.js +133 -0
  5. package/dist/__tests__/helpers/mcp-wire.js.map +1 -0
  6. package/dist/__tests__/helpers/mcp.d.ts +34 -0
  7. package/dist/__tests__/helpers/mcp.d.ts.map +1 -0
  8. package/dist/__tests__/helpers/mcp.js +37 -0
  9. package/dist/__tests__/helpers/mcp.js.map +1 -0
  10. package/dist/chunk-I5SJHUZK.mjs +52 -0
  11. package/dist/chunk-UOCQBEEW.mjs +12583 -0
  12. package/dist/cli.js +8 -479
  13. package/dist/cli.mjs +41334 -0
  14. package/dist/commands/add.d.ts.map +1 -1
  15. package/dist/commands/add.js +28 -37
  16. package/dist/commands/add.js.map +1 -1
  17. package/dist/commands/adr.d.ts +1 -9
  18. package/dist/commands/adr.d.ts.map +1 -1
  19. package/dist/commands/adr.js +11 -88
  20. package/dist/commands/adr.js.map +1 -1
  21. package/dist/commands/archive.d.ts +2 -4
  22. package/dist/commands/archive.d.ts.map +1 -1
  23. package/dist/commands/archive.js +55 -212
  24. package/dist/commands/archive.js.map +1 -1
  25. package/dist/commands/brief.d.ts +31 -0
  26. package/dist/commands/brief.d.ts.map +1 -0
  27. package/dist/commands/brief.js +151 -0
  28. package/dist/commands/brief.js.map +1 -0
  29. package/dist/commands/complete.d.ts +0 -4
  30. package/dist/commands/complete.d.ts.map +1 -1
  31. package/dist/commands/complete.js +14 -168
  32. package/dist/commands/complete.js.map +1 -1
  33. package/dist/commands/contract.d.ts.map +1 -1
  34. package/dist/commands/contract.js +66 -331
  35. package/dist/commands/contract.js.map +1 -1
  36. package/dist/commands/delete.d.ts.map +1 -1
  37. package/dist/commands/delete.js +13 -55
  38. package/dist/commands/delete.js.map +1 -1
  39. package/dist/commands/init.d.ts.map +1 -1
  40. package/dist/commands/init.js +3 -2
  41. package/dist/commands/init.js.map +1 -1
  42. package/dist/commands/list.d.ts.map +1 -1
  43. package/dist/commands/list.js +3 -54
  44. package/dist/commands/list.js.map +1 -1
  45. package/dist/commands/log.js +33 -26
  46. package/dist/commands/log.js.map +1 -1
  47. package/dist/commands/mcp.d.ts +9 -0
  48. package/dist/commands/mcp.d.ts.map +1 -1
  49. package/dist/commands/mcp.js +34 -18
  50. package/dist/commands/mcp.js.map +1 -1
  51. package/dist/commands/migrate.d.ts.map +1 -1
  52. package/dist/commands/migrate.js +14 -15
  53. package/dist/commands/migrate.js.map +1 -1
  54. package/dist/commands/move.d.ts.map +1 -1
  55. package/dist/commands/move.js +31 -126
  56. package/dist/commands/move.js.map +1 -1
  57. package/dist/commands/patch.d.ts.map +1 -1
  58. package/dist/commands/patch.js +22 -92
  59. package/dist/commands/patch.js.map +1 -1
  60. package/dist/commands/plan.d.ts +61 -0
  61. package/dist/commands/plan.d.ts.map +1 -0
  62. package/dist/commands/plan.js +205 -0
  63. package/dist/commands/plan.js.map +1 -0
  64. package/dist/commands/search.d.ts.map +1 -1
  65. package/dist/commands/search.js +20 -146
  66. package/dist/commands/search.js.map +1 -1
  67. package/dist/commands/show.d.ts.map +1 -1
  68. package/dist/commands/show.js +5 -126
  69. package/dist/commands/show.js.map +1 -1
  70. package/dist/commands/subtask.d.ts.map +1 -1
  71. package/dist/commands/subtask.js +19 -135
  72. package/dist/commands/subtask.js.map +1 -1
  73. package/dist/commands/types.d.ts +2 -2
  74. package/dist/commands/types.d.ts.map +1 -1
  75. package/dist/commands/types.js +8 -30
  76. package/dist/commands/types.js.map +1 -1
  77. package/dist/devtools-NE5M3KPM.mjs +92 -0
  78. package/dist/lib/contractRunner.d.ts.map +1 -1
  79. package/dist/lib/contractRunner.js +19 -205
  80. package/dist/lib/contractRunner.js.map +1 -1
  81. package/dist/mcp/helpers.d.ts +11 -16
  82. package/dist/mcp/helpers.d.ts.map +1 -1
  83. package/dist/mcp/helpers.js +9 -46
  84. package/dist/mcp/helpers.js.map +1 -1
  85. package/dist/mcp/schemas.d.ts +297 -0
  86. package/dist/mcp/schemas.d.ts.map +1 -0
  87. package/dist/mcp/schemas.js +328 -0
  88. package/dist/mcp/schemas.js.map +1 -0
  89. package/dist/mcp/tools/brief_tool.d.ts +14 -0
  90. package/dist/mcp/tools/brief_tool.d.ts.map +1 -0
  91. package/dist/mcp/tools/brief_tool.js +58 -0
  92. package/dist/mcp/tools/brief_tool.js.map +1 -0
  93. package/dist/mcp/tools/contract_tool.d.ts +1 -1
  94. package/dist/mcp/tools/contract_tool.d.ts.map +1 -1
  95. package/dist/mcp/tools/contract_tool.js +58 -186
  96. package/dist/mcp/tools/contract_tool.js.map +1 -1
  97. package/dist/mcp/tools/get_task_tool.d.ts +1 -1
  98. package/dist/mcp/tools/get_task_tool.d.ts.map +1 -1
  99. package/dist/mcp/tools/get_task_tool.js +18 -32
  100. package/dist/mcp/tools/get_task_tool.js.map +1 -1
  101. package/dist/mcp/tools/list_tasks_tool.d.ts +1 -1
  102. package/dist/mcp/tools/list_tasks_tool.d.ts.map +1 -1
  103. package/dist/mcp/tools/list_tasks_tool.js +14 -45
  104. package/dist/mcp/tools/list_tasks_tool.js.map +1 -1
  105. package/dist/mcp/tools/search_tool.d.ts +1 -1
  106. package/dist/mcp/tools/search_tool.d.ts.map +1 -1
  107. package/dist/mcp/tools/search_tool.js +33 -101
  108. package/dist/mcp/tools/search_tool.js.map +1 -1
  109. package/dist/mcp/tools/subtask_tool.d.ts +1 -1
  110. package/dist/mcp/tools/subtask_tool.d.ts.map +1 -1
  111. package/dist/mcp/tools/subtask_tool.js +95 -236
  112. package/dist/mcp/tools/subtask_tool.js.map +1 -1
  113. package/dist/mcp/tools/task_add_tool.d.ts +1 -1
  114. package/dist/mcp/tools/task_add_tool.d.ts.map +1 -1
  115. package/dist/mcp/tools/task_add_tool.js +63 -154
  116. package/dist/mcp/tools/task_add_tool.js.map +1 -1
  117. package/dist/mcp/tools/task_complete_tool.d.ts +1 -1
  118. package/dist/mcp/tools/task_complete_tool.d.ts.map +1 -1
  119. package/dist/mcp/tools/task_complete_tool.js +59 -127
  120. package/dist/mcp/tools/task_complete_tool.js.map +1 -1
  121. package/dist/mcp/tools/task_delete_tool.d.ts +1 -1
  122. package/dist/mcp/tools/task_delete_tool.d.ts.map +1 -1
  123. package/dist/mcp/tools/task_delete_tool.js +19 -33
  124. package/dist/mcp/tools/task_delete_tool.js.map +1 -1
  125. package/dist/mcp/tools/task_move_tool.d.ts +1 -1
  126. package/dist/mcp/tools/task_move_tool.d.ts.map +1 -1
  127. package/dist/mcp/tools/task_move_tool.js +53 -150
  128. package/dist/mcp/tools/task_move_tool.js.map +1 -1
  129. package/dist/mcp/tools/task_patch_tool.d.ts +1 -1
  130. package/dist/mcp/tools/task_patch_tool.d.ts.map +1 -1
  131. package/dist/mcp/tools/task_patch_tool.js +49 -113
  132. package/dist/mcp/tools/task_patch_tool.js.map +1 -1
  133. package/dist/open-ZGSQIGEH.mjs +542 -0
  134. package/dist/schemas/board.json +1 -1
  135. package/dist/tui/theme.d.ts +74 -95
  136. package/dist/tui/theme.d.ts.map +1 -1
  137. package/dist/tui/theme.js +113 -110
  138. package/dist/tui/theme.js.map +1 -1
  139. package/dist/tui-H3RI22S4.mjs +23374 -0
  140. package/dist/utils/cli-error.d.ts +20 -0
  141. package/dist/utils/cli-error.d.ts.map +1 -1
  142. package/dist/utils/cli-error.js +36 -0
  143. package/dist/utils/cli-error.js.map +1 -1
  144. package/dist/utils/dot-brainfile.d.ts +0 -4
  145. package/dist/utils/dot-brainfile.d.ts.map +1 -1
  146. package/dist/utils/dot-brainfile.js +0 -17
  147. package/dist/utils/dot-brainfile.js.map +1 -1
  148. package/dist/utils/errorHandler.d.ts +7 -11
  149. package/dist/utils/errorHandler.d.ts.map +1 -1
  150. package/dist/utils/errorHandler.js +8 -19
  151. package/dist/utils/errorHandler.js.map +1 -1
  152. package/package.json +24 -16
  153. package/dist/cli.d.ts +0 -3
  154. package/dist/cli.d.ts.map +0 -1
  155. package/dist/cli.js.map +0 -1
  156. package/dist/commands/rules.d.ts +0 -68
  157. package/dist/commands/rules.d.ts.map +0 -1
  158. package/dist/commands/rules.js +0 -322
  159. package/dist/commands/rules.js.map +0 -1
  160. package/dist/commands/tui.d.ts +0 -6
  161. package/dist/commands/tui.d.ts.map +0 -1
  162. package/dist/commands/tui.js +0 -79
  163. package/dist/commands/tui.js.map +0 -1
  164. package/dist/tui/BrainfileTUI.d.ts +0 -4
  165. package/dist/tui/BrainfileTUI.d.ts.map +0 -1
  166. package/dist/tui/BrainfileTUI.js +0 -272
  167. package/dist/tui/BrainfileTUI.js.map +0 -1
  168. package/dist/tui/actions.d.ts +0 -84
  169. package/dist/tui/actions.d.ts.map +0 -1
  170. package/dist/tui/actions.js +0 -1251
  171. package/dist/tui/actions.js.map +0 -1
  172. package/dist/tui/components/ColumnTabs.d.ts +0 -9
  173. package/dist/tui/components/ColumnTabs.d.ts.map +0 -1
  174. package/dist/tui/components/ColumnTabs.js +0 -34
  175. package/dist/tui/components/ColumnTabs.js.map +0 -1
  176. package/dist/tui/components/Header.d.ts +0 -15
  177. package/dist/tui/components/Header.d.ts.map +0 -1
  178. package/dist/tui/components/Header.js +0 -48
  179. package/dist/tui/components/Header.js.map +0 -1
  180. package/dist/tui/components/HelpOverlay.d.ts +0 -9
  181. package/dist/tui/components/HelpOverlay.d.ts.map +0 -1
  182. package/dist/tui/components/HelpOverlay.js +0 -116
  183. package/dist/tui/components/HelpOverlay.js.map +0 -1
  184. package/dist/tui/components/LogsPanel.d.ts +0 -16
  185. package/dist/tui/components/LogsPanel.d.ts.map +0 -1
  186. package/dist/tui/components/LogsPanel.js +0 -115
  187. package/dist/tui/components/LogsPanel.js.map +0 -1
  188. package/dist/tui/components/MainPanelTabs.d.ts +0 -10
  189. package/dist/tui/components/MainPanelTabs.d.ts.map +0 -1
  190. package/dist/tui/components/MainPanelTabs.js +0 -56
  191. package/dist/tui/components/MainPanelTabs.js.map +0 -1
  192. package/dist/tui/components/ManualBorder.d.ts +0 -42
  193. package/dist/tui/components/ManualBorder.d.ts.map +0 -1
  194. package/dist/tui/components/ManualBorder.js +0 -56
  195. package/dist/tui/components/ManualBorder.js.map +0 -1
  196. package/dist/tui/components/Overlays.d.ts +0 -41
  197. package/dist/tui/components/Overlays.d.ts.map +0 -1
  198. package/dist/tui/components/Overlays.js +0 -127
  199. package/dist/tui/components/Overlays.js.map +0 -1
  200. package/dist/tui/components/ProgressBar.d.ts +0 -8
  201. package/dist/tui/components/ProgressBar.d.ts.map +0 -1
  202. package/dist/tui/components/ProgressBar.js +0 -35
  203. package/dist/tui/components/ProgressBar.js.map +0 -1
  204. package/dist/tui/components/RulesPanel.d.ts +0 -25
  205. package/dist/tui/components/RulesPanel.d.ts.map +0 -1
  206. package/dist/tui/components/RulesPanel.js +0 -139
  207. package/dist/tui/components/RulesPanel.js.map +0 -1
  208. package/dist/tui/components/SearchBar.d.ts +0 -8
  209. package/dist/tui/components/SearchBar.d.ts.map +0 -1
  210. package/dist/tui/components/SearchBar.js +0 -38
  211. package/dist/tui/components/SearchBar.js.map +0 -1
  212. package/dist/tui/components/StackedTaskList.d.ts +0 -27
  213. package/dist/tui/components/StackedTaskList.d.ts.map +0 -1
  214. package/dist/tui/components/StackedTaskList.js +0 -120
  215. package/dist/tui/components/StackedTaskList.js.map +0 -1
  216. package/dist/tui/components/StatusBar.d.ts +0 -14
  217. package/dist/tui/components/StatusBar.d.ts.map +0 -1
  218. package/dist/tui/components/StatusBar.js +0 -42
  219. package/dist/tui/components/StatusBar.js.map +0 -1
  220. package/dist/tui/components/TaskCard.d.ts +0 -25
  221. package/dist/tui/components/TaskCard.d.ts.map +0 -1
  222. package/dist/tui/components/TaskCard.js +0 -221
  223. package/dist/tui/components/TaskCard.js.map +0 -1
  224. package/dist/tui/components/TaskCardMeasure.d.ts +0 -31
  225. package/dist/tui/components/TaskCardMeasure.d.ts.map +0 -1
  226. package/dist/tui/components/TaskCardMeasure.js +0 -133
  227. package/dist/tui/components/TaskCardMeasure.js.map +0 -1
  228. package/dist/tui/components/TaskDetail.d.ts +0 -13
  229. package/dist/tui/components/TaskDetail.d.ts.map +0 -1
  230. package/dist/tui/components/TaskDetail.js +0 -64
  231. package/dist/tui/components/TaskDetail.js.map +0 -1
  232. package/dist/tui/components/TaskList.d.ts +0 -12
  233. package/dist/tui/components/TaskList.d.ts.map +0 -1
  234. package/dist/tui/components/TaskList.js +0 -75
  235. package/dist/tui/components/TaskList.js.map +0 -1
  236. package/dist/tui/components/index.d.ts +0 -31
  237. package/dist/tui/components/index.d.ts.map +0 -1
  238. package/dist/tui/components/index.js +0 -43
  239. package/dist/tui/components/index.js.map +0 -1
  240. package/dist/tui/hooks/index.d.ts +0 -3
  241. package/dist/tui/hooks/index.d.ts.map +0 -1
  242. package/dist/tui/hooks/index.js +0 -8
  243. package/dist/tui/hooks/index.js.map +0 -1
  244. package/dist/tui/hooks/useBrainfileLoader.d.ts +0 -5
  245. package/dist/tui/hooks/useBrainfileLoader.d.ts.map +0 -1
  246. package/dist/tui/hooks/useBrainfileLoader.js +0 -237
  247. package/dist/tui/hooks/useBrainfileLoader.js.map +0 -1
  248. package/dist/tui/hooks/useKeyboardNavigation.d.ts +0 -20
  249. package/dist/tui/hooks/useKeyboardNavigation.d.ts.map +0 -1
  250. package/dist/tui/hooks/useKeyboardNavigation.js +0 -806
  251. package/dist/tui/hooks/useKeyboardNavigation.js.map +0 -1
  252. package/dist/tui/index.d.ts +0 -10
  253. package/dist/tui/index.d.ts.map +0 -1
  254. package/dist/tui/index.js +0 -38
  255. package/dist/tui/index.js.map +0 -1
  256. package/dist/tui/types.d.ts +0 -53
  257. package/dist/tui/types.d.ts.map +0 -1
  258. package/dist/tui/types.js +0 -12
  259. package/dist/tui/types.js.map +0 -1
  260. package/dist/tui/utils.d.ts +0 -24
  261. package/dist/tui/utils.d.ts.map +0 -1
  262. package/dist/tui/utils.js +0 -161
  263. package/dist/tui/utils.js.map +0 -1
  264. package/dist/utils/board-types.d.ts +0 -13
  265. package/dist/utils/board-types.d.ts.map +0 -1
  266. package/dist/utils/board-types.js +0 -7
  267. package/dist/utils/board-types.js.map +0 -1
  268. package/dist/utils/contractSpec.d.ts +0 -13
  269. package/dist/utils/contractSpec.d.ts.map +0 -1
  270. package/dist/utils/contractSpec.js +0 -61
  271. package/dist/utils/contractSpec.js.map +0 -1
  272. package/dist/utils/strict-validation.d.ts +0 -8
  273. package/dist/utils/strict-validation.d.ts.map +0 -1
  274. package/dist/utils/strict-validation.js +0 -41
  275. package/dist/utils/strict-validation.js.map +0 -1
@@ -1,133 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.wrapText = wrapText;
4
- exports.safeTruncate = safeTruncate;
5
- exports.measureTaskCard = measureTaskCard;
6
- exports.getTaskCardHeight = getTaskCardHeight;
7
- /**
8
- * Wrap text to a maximum width, returning an array of lines.
9
- * Each line is guaranteed to fit within maxWidth characters.
10
- */
11
- function wrapText(text, maxWidth) {
12
- if (!text || maxWidth <= 0)
13
- return [];
14
- const words = text.split(/\s+/);
15
- const lines = [];
16
- let currentLine = '';
17
- for (const word of words) {
18
- if (word.length > maxWidth) {
19
- // Word is longer than line - split it
20
- if (currentLine) {
21
- lines.push(currentLine);
22
- currentLine = '';
23
- }
24
- for (let i = 0; i < word.length; i += maxWidth) {
25
- lines.push(word.slice(i, i + maxWidth));
26
- }
27
- }
28
- else if (currentLine.length + 1 + word.length <= maxWidth) {
29
- // Word fits on current line
30
- currentLine = currentLine ? `${currentLine} ${word}` : word;
31
- }
32
- else {
33
- // Start new line
34
- if (currentLine)
35
- lines.push(currentLine);
36
- currentLine = word;
37
- }
38
- }
39
- if (currentLine)
40
- lines.push(currentLine);
41
- return lines.length > 0 ? lines : [''];
42
- }
43
- /**
44
- * Safe truncation that always returns a non-empty string.
45
- * Ink requires non-empty strings to avoid rendering errors.
46
- */
47
- function safeTruncate(text, maxWidth) {
48
- if (!text)
49
- return ' ';
50
- if (maxWidth <= 0)
51
- return ' ';
52
- if (maxWidth <= 3)
53
- return text.slice(0, maxWidth);
54
- if (text.length <= maxWidth)
55
- return text;
56
- return text.slice(0, maxWidth - 1) + '…';
57
- }
58
- /**
59
- * Calculate exact height dimensions for a TaskCard.
60
- */
61
- function measureTaskCard(task, contentWidth, allTasks = []) {
62
- // Collapsed is ALWAYS 3 lines (2 content + 1 margin)
63
- const collapsed = 3;
64
- // Expanded builds on top of collapsed base
65
- let expanded = 3;
66
- // marginTop before expanded content
67
- expanded += 1;
68
- // Description section (if present)
69
- if (task.description) {
70
- const descLines = wrapText(task.description, contentWidth - 4);
71
- expanded += Math.min(descLines.length, 3);
72
- if (descLines.length > 3) {
73
- expanded += 1; // "…" overflow indicator
74
- }
75
- }
76
- // Subtasks section (if present)
77
- if (task.subtasks && task.subtasks.length > 0) {
78
- if (task.description) {
79
- expanded += 1; // marginTop={1} only if description present
80
- }
81
- expanded += Math.min(task.subtasks.length, 5);
82
- if (task.subtasks.length > 5) {
83
- expanded += 1; // "+N more" line
84
- }
85
- }
86
- // Related files section (if present)
87
- if (task.relatedFiles && task.relatedFiles.length > 0) {
88
- expanded += 1; // marginTop={1}
89
- expanded += Math.min(task.relatedFiles.length, 3);
90
- if (task.relatedFiles.length > 3) {
91
- expanded += 1; // "+N more" line
92
- }
93
- }
94
- const hasPreviousSections = Boolean(task.description) ||
95
- Boolean(task.subtasks && task.subtasks.length > 0) ||
96
- Boolean(task.relatedFiles && task.relatedFiles.length > 0);
97
- const childrenCount = allTasks.filter(t => {
98
- const parentId = t.parentId;
99
- return parentId === task.id && t.id !== task.id;
100
- }).length;
101
- const isAdr = (task.type || 'task').toLowerCase() === 'adr';
102
- const hasAdrStatus = Boolean(task.status) && isAdr;
103
- const hasContract = Boolean(task.contract);
104
- const parentId = task.parentId;
105
- const hasDetailBlock = Boolean(parentId) || childrenCount > 0 || hasAdrStatus || hasContract;
106
- if (hasDetailBlock) {
107
- if (hasPreviousSections) {
108
- expanded += 1; // marginTop before TaskDetail block
109
- }
110
- if (parentId)
111
- expanded += 1; // Parent row
112
- if (childrenCount > 0)
113
- expanded += 1; // Children row
114
- if (hasAdrStatus)
115
- expanded += 1; // ADR status row
116
- if (hasContract) {
117
- if (parentId || childrenCount > 0 || hasAdrStatus) {
118
- expanded += 1; // spacer before Contract header
119
- }
120
- expanded += 3; // Contract header + status + deliverables
121
- }
122
- }
123
- return { collapsed, expanded };
124
- }
125
- /**
126
- * Get the height for a task card based on expanded state.
127
- * Convenience wrapper for TaskList viewport calculations.
128
- */
129
- function getTaskCardHeight(task, isExpanded, contentWidth, allTasks = []) {
130
- const dims = measureTaskCard(task, contentWidth, allTasks);
131
- return isExpanded ? dims.expanded : dims.collapsed;
132
- }
133
- //# sourceMappingURL=TaskCardMeasure.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskCardMeasure.js","sourceRoot":"","sources":["../../../src/tui/components/TaskCardMeasure.ts"],"names":[],"mappings":";;AAiBA,4BA6BC;AAMD,oCAMC;AAKD,0CAwEC;AAMD,8CAGC;AAnID;;;GAGG;AACH,SAAgB,QAAQ,CAAC,IAAY,EAAE,QAAgB;IACrD,IAAI,CAAC,IAAI,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC3B,sCAAsC;YACtC,IAAI,WAAW,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxB,WAAW,GAAG,EAAE,CAAC;YACnB,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;aAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC5D,4BAA4B;YAC5B,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,iBAAiB;YACjB,IAAI,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzC,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,IAAwB,EAAE,QAAgB;IACrE,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC;IACtB,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAC9B,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,IAAU,EAAE,YAAoB,EAAE,WAAmB,EAAE;IACrF,qDAAqD;IACrD,MAAM,SAAS,GAAG,CAAC,CAAC;IAEpB,2CAA2C;IAC3C,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,oCAAoC;IACpC,QAAQ,IAAI,CAAC,CAAC;IAEd,mCAAmC;IACnC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;QAC/D,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,QAAQ,IAAI,CAAC,CAAC,CAAC,yBAAyB;QAC1C,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,QAAQ,IAAI,CAAC,CAAC,CAAC,4CAA4C;QAC7D,CAAC;QACD,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,QAAQ,IAAI,CAAC,CAAC,CAAC,iBAAiB;QAClC,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,QAAQ,IAAI,CAAC,CAAC,CAAC,gBAAgB;QAC/B,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,QAAQ,IAAI,CAAC,CAAC,CAAC,iBAAiB;QAClC,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,GACvB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE7D,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACxC,MAAM,QAAQ,GAAI,CAAkC,CAAC,QAAQ,CAAC;QAC9D,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC,MAAM,CAAC;IACV,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAE,IAAmC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;IACnF,MAAM,WAAW,GAAG,OAAO,CAAE,IAAsC,CAAC,QAAQ,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAI,IAAqC,CAAC,QAAQ,CAAC;IACjE,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,GAAG,CAAC,IAAI,YAAY,IAAI,WAAW,CAAC;IAE7F,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,mBAAmB,EAAE,CAAC;YACxB,QAAQ,IAAI,CAAC,CAAC,CAAC,oCAAoC;QACrD,CAAC;QAED,IAAI,QAAQ;YAAE,QAAQ,IAAI,CAAC,CAAC,CAAC,aAAa;QAC1C,IAAI,aAAa,GAAG,CAAC;YAAE,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe;QACrD,IAAI,YAAY;YAAE,QAAQ,IAAI,CAAC,CAAC,CAAC,iBAAiB;QAElD,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,QAAQ,IAAI,aAAa,GAAG,CAAC,IAAI,YAAY,EAAE,CAAC;gBAClD,QAAQ,IAAI,CAAC,CAAC,CAAC,gCAAgC;YACjD,CAAC;YACD,QAAQ,IAAI,CAAC,CAAC,CAAC,0CAA0C;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,IAAU,EAAE,UAAmB,EAAE,YAAoB,EAAE,WAAmB,EAAE;IAC5G,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC3D,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;AACrD,CAAC"}
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- import type { Task } from '@brainfile/core';
3
- export interface TaskDetailProps {
4
- task: Task;
5
- allTasks?: Task[];
6
- /** Optional top spacing before the detail block */
7
- marginTop?: number;
8
- }
9
- /**
10
- * TaskDetail - detail sections shown when a task card is expanded.
11
- */
12
- export declare function TaskDetail({ task, allTasks, marginTop }: TaskDetailProps): React.JSX.Element | null;
13
- //# sourceMappingURL=TaskDetail.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskDetail.d.ts","sourceRoot":"","sources":["../../../src/tui/components/TaskDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAgB5C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAClB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,QAAa,EAAE,SAAa,EAAE,EAAE,eAAe,4BA2DjF"}
@@ -1,64 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TaskDetail = TaskDetail;
7
- const react_1 = __importDefault(require("react"));
8
- const ink_1 = require("ink");
9
- const theme_js_1 = require("../theme.js");
10
- function getContractStatusColor(status) {
11
- switch (status) {
12
- case 'done':
13
- return theme_js_1.PALETTE.success;
14
- case 'in_progress':
15
- return theme_js_1.PALETTE.warning;
16
- case 'failed':
17
- return theme_js_1.PALETTE.error;
18
- default:
19
- return theme_js_1.PALETTE.textMuted;
20
- }
21
- }
22
- /**
23
- * TaskDetail - detail sections shown when a task card is expanded.
24
- */
25
- function TaskDetail({ task, allTasks = [], marginTop = 0 }) {
26
- const parentId = task.parentId;
27
- const children = allTasks.filter(t => {
28
- const candidateParentId = t.parentId;
29
- return candidateParentId === task.id && t.id !== task.id;
30
- });
31
- const isAdr = (task.type || 'task').toLowerCase() === 'adr';
32
- const adrStatus = isAdr ? task.status : undefined;
33
- const hasParentOrChildren = Boolean(parentId) || children.length > 0;
34
- const hasContract = Boolean(task.contract);
35
- const hasAdrStatus = Boolean(adrStatus);
36
- if (!hasParentOrChildren && !hasContract && !hasAdrStatus) {
37
- return null;
38
- }
39
- const status = task.contract?.status;
40
- const deliverablesCount = task.contract?.deliverables?.length ?? 0;
41
- return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: marginTop },
42
- parentId && (react_1.default.createElement(ink_1.Text, null,
43
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textDim }, "Parent: "),
44
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, parentId))),
45
- children.length > 0 && (react_1.default.createElement(ink_1.Text, null,
46
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textDim }, "Children: "),
47
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary },
48
- "[",
49
- children.map(c => c.id).join(', '),
50
- "]"))),
51
- hasAdrStatus && (react_1.default.createElement(ink_1.Text, null,
52
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textDim }, "Status: "),
53
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, adrStatus))),
54
- hasContract && (react_1.default.createElement(react_1.default.Fragment, null,
55
- (parentId || children.length > 0 || hasAdrStatus) && react_1.default.createElement(ink_1.Box, { marginTop: 1 }),
56
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textDim, bold: true }, "Contract"),
57
- react_1.default.createElement(ink_1.Text, null,
58
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textDim }, "Status: "),
59
- react_1.default.createElement(ink_1.Text, { color: getContractStatusColor(status), bold: true }, status)),
60
- react_1.default.createElement(ink_1.Text, null,
61
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textDim }, "Deliverables: "),
62
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, deliverablesCount))))));
63
- }
64
- //# sourceMappingURL=TaskDetail.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskDetail.js","sourceRoot":"","sources":["../../../src/tui/components/TaskDetail.tsx"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import React from 'react';
2
- import type { Task } from '@brainfile/core';
3
- export interface TaskListProps {
4
- tasks: Task[];
5
- allTasks?: Task[];
6
- selectedIndex: number;
7
- expandedIds: Set<string>;
8
- viewportHeight: number;
9
- termWidth: number;
10
- }
11
- export declare function TaskList({ tasks, allTasks, selectedIndex, expandedIds, viewportHeight, termWidth }: TaskListProps): React.JSX.Element;
12
- //# sourceMappingURL=TaskList.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskList.d.ts","sourceRoot":"","sources":["../../../src/tui/components/TaskList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAK5C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAa,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,aAAa,qBA0FtH"}
@@ -1,75 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TaskList = TaskList;
7
- const react_1 = __importDefault(require("react"));
8
- const ink_1 = require("ink");
9
- const theme_js_1 = require("../theme.js");
10
- const TaskCard_js_1 = require("./TaskCard.js");
11
- const TaskCardMeasure_js_1 = require("./TaskCardMeasure.js");
12
- function TaskList({ tasks, allTasks = [], selectedIndex, expandedIds, viewportHeight, termWidth }) {
13
- const cardWidth = termWidth - 4;
14
- const contentWidth = cardWidth - 6; // indicator (4) + right padding (2) = 6
15
- // Calculate scroll offset - ensure selected task is visible
16
- // Start from selected task and work backwards to find scroll position
17
- let scrollOffset = 0;
18
- let heightBeforeSelected = 0;
19
- for (let i = 0; i < selectedIndex; i++) {
20
- const task = tasks[i];
21
- const isExpanded = expandedIds.has(task.id);
22
- heightBeforeSelected += (0, TaskCardMeasure_js_1.getTaskCardHeight)(task, isExpanded, contentWidth, allTasks);
23
- }
24
- // If selected task would be off screen, adjust scroll
25
- const selectedTask = tasks[selectedIndex];
26
- const selectedHeight = selectedTask
27
- ? (0, TaskCardMeasure_js_1.getTaskCardHeight)(selectedTask, expandedIds.has(selectedTask.id), contentWidth, allTasks)
28
- : 5;
29
- if (heightBeforeSelected + selectedHeight > viewportHeight) {
30
- // Need to scroll - start from selected task
31
- scrollOffset = selectedIndex;
32
- }
33
- else if (heightBeforeSelected > viewportHeight * 0.6) {
34
- // Selected is in lower part of viewport, scroll to center it a bit
35
- scrollOffset = Math.max(0, selectedIndex - 2);
36
- }
37
- // Build visible items starting from scrollOffset
38
- const visibleItems = [];
39
- let linesUsed = 0;
40
- for (let i = scrollOffset; i < tasks.length; i++) {
41
- const task = tasks[i];
42
- const isSelected = i === selectedIndex;
43
- const isExpanded = expandedIds.has(task.id);
44
- const taskLines = (0, TaskCardMeasure_js_1.getTaskCardHeight)(task, isExpanded, contentWidth, allTasks);
45
- // Always include the selected task, even if it's tall
46
- if (isSelected) {
47
- visibleItems.push({ task, isSelected, isExpanded });
48
- linesUsed += taskLines;
49
- continue;
50
- }
51
- // For non-selected tasks, check if they fit
52
- if (linesUsed + taskLines <= viewportHeight) {
53
- visibleItems.push({ task, isSelected, isExpanded });
54
- linesUsed += taskLines;
55
- }
56
- else if (linesUsed > 0) {
57
- // We have items and this one doesn't fit, stop
58
- break;
59
- }
60
- }
61
- // Calculate remaining empty lines to fill viewport
62
- const emptyLines = Math.max(0, viewportHeight - linesUsed);
63
- if (tasks.length === 0) {
64
- return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingLeft: 2, height: viewportHeight },
65
- react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted, dimColor: true }, "No tasks in this column"),
66
- Array.from({ length: viewportHeight - 1 }).map((_, i) => (react_1.default.createElement(ink_1.Box, { key: `empty-${i}` },
67
- react_1.default.createElement(ink_1.Text, null, ' '))))));
68
- }
69
- return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingLeft: 1, height: viewportHeight },
70
- visibleItems.map(({ task, isSelected, isExpanded }, index) => (react_1.default.createElement(react_1.default.Fragment, { key: task.id },
71
- index > 0 && react_1.default.createElement(ink_1.Box, { height: 1 }),
72
- react_1.default.createElement(TaskCard_js_1.TaskCard, { task: task, allTasks: allTasks, isSelected: isSelected, isExpanded: isExpanded, width: cardWidth, showContractBadge: true })))),
73
- emptyLines > 0 && react_1.default.createElement(ink_1.Box, { height: emptyLines })));
74
- }
75
- //# sourceMappingURL=TaskList.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskList.js","sourceRoot":"","sources":["../../../src/tui/components/TaskList.tsx"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- export { Header } from './Header.js';
2
- export type { HeaderProps } from './Header.js';
3
- export { ProgressBar } from './ProgressBar.js';
4
- export type { ProgressBarProps } from './ProgressBar.js';
5
- export { SearchBar } from './SearchBar.js';
6
- export type { SearchBarProps } from './SearchBar.js';
7
- export { ColumnTabs } from './ColumnTabs.js';
8
- export type { ColumnTabsProps } from './ColumnTabs.js';
9
- export { TaskCard } from './TaskCard.js';
10
- export type { TaskCardProps } from './TaskCard.js';
11
- export { TaskList } from './TaskList.js';
12
- export type { TaskListProps } from './TaskList.js';
13
- export { StackedTaskList, flattenTasks } from './StackedTaskList.js';
14
- export type { StackedTaskListProps, FlatTask } from './StackedTaskList.js';
15
- export { StatusBar } from './StatusBar.js';
16
- export type { StatusBarProps } from './StatusBar.js';
17
- export { HelpOverlay } from './HelpOverlay.js';
18
- export type { HelpOverlayProps } from './HelpOverlay.js';
19
- export { StatusMessageDisplay, MoveOverlay, DeleteConfirmOverlay, SubtaskOverlay, NewTaskOverlay, } from './Overlays.js';
20
- export type { StatusMessageProps, MoveOverlayProps, DeleteConfirmOverlayProps, SubtaskOverlayProps, NewTaskOverlayProps, } from './Overlays.js';
21
- export { MainPanelTabs } from './MainPanelTabs.js';
22
- export type { MainPanelTabsProps } from './MainPanelTabs.js';
23
- export { RulesPanel } from './RulesPanel.js';
24
- export type { RulesPanelProps } from './RulesPanel.js';
25
- export { LogsPanel } from './LogsPanel.js';
26
- export type { LogsPanelProps } from './LogsPanel.js';
27
- export { ManualBorder, BorderRow } from './ManualBorder.js';
28
- export type { ManualBorderProps, BorderRowProps } from './ManualBorder.js';
29
- export { measureTaskCard, getTaskCardHeight, wrapText, safeTruncate } from './TaskCardMeasure.js';
30
- export type { TaskCardDimensions } from './TaskCardMeasure.js';
31
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tui/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,oBAAoB,EACpB,cAAc,EACd,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAClG,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,43 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.safeTruncate = exports.wrapText = exports.getTaskCardHeight = exports.measureTaskCard = exports.BorderRow = exports.ManualBorder = exports.LogsPanel = exports.RulesPanel = exports.MainPanelTabs = exports.NewTaskOverlay = exports.SubtaskOverlay = exports.DeleteConfirmOverlay = exports.MoveOverlay = exports.StatusMessageDisplay = exports.HelpOverlay = exports.StatusBar = exports.flattenTasks = exports.StackedTaskList = exports.TaskList = exports.TaskCard = exports.ColumnTabs = exports.SearchBar = exports.ProgressBar = exports.Header = void 0;
4
- var Header_js_1 = require("./Header.js");
5
- Object.defineProperty(exports, "Header", { enumerable: true, get: function () { return Header_js_1.Header; } });
6
- var ProgressBar_js_1 = require("./ProgressBar.js");
7
- Object.defineProperty(exports, "ProgressBar", { enumerable: true, get: function () { return ProgressBar_js_1.ProgressBar; } });
8
- var SearchBar_js_1 = require("./SearchBar.js");
9
- Object.defineProperty(exports, "SearchBar", { enumerable: true, get: function () { return SearchBar_js_1.SearchBar; } });
10
- var ColumnTabs_js_1 = require("./ColumnTabs.js");
11
- Object.defineProperty(exports, "ColumnTabs", { enumerable: true, get: function () { return ColumnTabs_js_1.ColumnTabs; } });
12
- var TaskCard_js_1 = require("./TaskCard.js");
13
- Object.defineProperty(exports, "TaskCard", { enumerable: true, get: function () { return TaskCard_js_1.TaskCard; } });
14
- var TaskList_js_1 = require("./TaskList.js");
15
- Object.defineProperty(exports, "TaskList", { enumerable: true, get: function () { return TaskList_js_1.TaskList; } });
16
- var StackedTaskList_js_1 = require("./StackedTaskList.js");
17
- Object.defineProperty(exports, "StackedTaskList", { enumerable: true, get: function () { return StackedTaskList_js_1.StackedTaskList; } });
18
- Object.defineProperty(exports, "flattenTasks", { enumerable: true, get: function () { return StackedTaskList_js_1.flattenTasks; } });
19
- var StatusBar_js_1 = require("./StatusBar.js");
20
- Object.defineProperty(exports, "StatusBar", { enumerable: true, get: function () { return StatusBar_js_1.StatusBar; } });
21
- var HelpOverlay_js_1 = require("./HelpOverlay.js");
22
- Object.defineProperty(exports, "HelpOverlay", { enumerable: true, get: function () { return HelpOverlay_js_1.HelpOverlay; } });
23
- var Overlays_js_1 = require("./Overlays.js");
24
- Object.defineProperty(exports, "StatusMessageDisplay", { enumerable: true, get: function () { return Overlays_js_1.StatusMessageDisplay; } });
25
- Object.defineProperty(exports, "MoveOverlay", { enumerable: true, get: function () { return Overlays_js_1.MoveOverlay; } });
26
- Object.defineProperty(exports, "DeleteConfirmOverlay", { enumerable: true, get: function () { return Overlays_js_1.DeleteConfirmOverlay; } });
27
- Object.defineProperty(exports, "SubtaskOverlay", { enumerable: true, get: function () { return Overlays_js_1.SubtaskOverlay; } });
28
- Object.defineProperty(exports, "NewTaskOverlay", { enumerable: true, get: function () { return Overlays_js_1.NewTaskOverlay; } });
29
- var MainPanelTabs_js_1 = require("./MainPanelTabs.js");
30
- Object.defineProperty(exports, "MainPanelTabs", { enumerable: true, get: function () { return MainPanelTabs_js_1.MainPanelTabs; } });
31
- var RulesPanel_js_1 = require("./RulesPanel.js");
32
- Object.defineProperty(exports, "RulesPanel", { enumerable: true, get: function () { return RulesPanel_js_1.RulesPanel; } });
33
- var LogsPanel_js_1 = require("./LogsPanel.js");
34
- Object.defineProperty(exports, "LogsPanel", { enumerable: true, get: function () { return LogsPanel_js_1.LogsPanel; } });
35
- var ManualBorder_js_1 = require("./ManualBorder.js");
36
- Object.defineProperty(exports, "ManualBorder", { enumerable: true, get: function () { return ManualBorder_js_1.ManualBorder; } });
37
- Object.defineProperty(exports, "BorderRow", { enumerable: true, get: function () { return ManualBorder_js_1.BorderRow; } });
38
- var TaskCardMeasure_js_1 = require("./TaskCardMeasure.js");
39
- Object.defineProperty(exports, "measureTaskCard", { enumerable: true, get: function () { return TaskCardMeasure_js_1.measureTaskCard; } });
40
- Object.defineProperty(exports, "getTaskCardHeight", { enumerable: true, get: function () { return TaskCardMeasure_js_1.getTaskCardHeight; } });
41
- Object.defineProperty(exports, "wrapText", { enumerable: true, get: function () { return TaskCardMeasure_js_1.wrapText; } });
42
- Object.defineProperty(exports, "safeTruncate", { enumerable: true, get: function () { return TaskCardMeasure_js_1.safeTruncate; } });
43
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/components/index.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AAGf,mDAA+C;AAAtC,6GAAA,WAAW,OAAA;AAGpB,+CAA2C;AAAlC,yGAAA,SAAS,OAAA;AAGlB,iDAA6C;AAApC,2GAAA,UAAU,OAAA;AAGnB,6CAAyC;AAAhC,uGAAA,QAAQ,OAAA;AAGjB,6CAAyC;AAAhC,uGAAA,QAAQ,OAAA;AAGjB,2DAAqE;AAA5D,qHAAA,eAAe,OAAA;AAAE,kHAAA,YAAY,OAAA;AAGtC,+CAA2C;AAAlC,yGAAA,SAAS,OAAA;AAGlB,mDAA+C;AAAtC,6GAAA,WAAW,OAAA;AAGpB,6CAMuB;AALrB,mHAAA,oBAAoB,OAAA;AACpB,0GAAA,WAAW,OAAA;AACX,mHAAA,oBAAoB,OAAA;AACpB,6GAAA,cAAc,OAAA;AACd,6GAAA,cAAc,OAAA;AAUhB,uDAAmD;AAA1C,iHAAA,aAAa,OAAA;AAGtB,iDAA6C;AAApC,2GAAA,UAAU,OAAA;AAGnB,+CAA2C;AAAlC,yGAAA,SAAS,OAAA;AAGlB,qDAA4D;AAAnD,+GAAA,YAAY,OAAA;AAAE,4GAAA,SAAS,OAAA;AAGhC,2DAAkG;AAAzF,qHAAA,eAAe,OAAA;AAAE,uHAAA,iBAAiB,OAAA;AAAE,8GAAA,QAAQ,OAAA;AAAE,kHAAA,YAAY,OAAA"}
@@ -1,3 +0,0 @@
1
- export { useBrainfileLoader } from './useBrainfileLoader.js';
2
- export { useKeyboardNavigation } from './useKeyboardNavigation.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useKeyboardNavigation = exports.useBrainfileLoader = void 0;
4
- var useBrainfileLoader_js_1 = require("./useBrainfileLoader.js");
5
- Object.defineProperty(exports, "useBrainfileLoader", { enumerable: true, get: function () { return useBrainfileLoader_js_1.useBrainfileLoader; } });
6
- var useKeyboardNavigation_js_1 = require("./useKeyboardNavigation.js");
7
- Object.defineProperty(exports, "useKeyboardNavigation", { enumerable: true, get: function () { return useKeyboardNavigation_js_1.useKeyboardNavigation; } });
8
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/hooks/index.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;AAApD,2HAAA,kBAAkB,OAAA;AAC3B,uEAAmE;AAA1D,iIAAA,qBAAqB,OAAA"}
@@ -1,5 +0,0 @@
1
- import type { AppState } from '../types.js';
2
- export declare function useBrainfileLoader(filePath: string, state: AppState, setState: React.Dispatch<React.SetStateAction<AppState>>): {
3
- loadBrainfile: (forceRefresh?: any) => void;
4
- };
5
- //# sourceMappingURL=useBrainfileLoader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useBrainfileLoader.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useBrainfileLoader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA6C5C,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;;EAqKzD"}