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,119 +1,98 @@
1
1
  /**
2
- * Brainfile TUI Theme
2
+ * Brainfile TUI v3 design system.
3
3
  *
4
- * Design principles (aligned with VSCode extension aesthetic):
5
- * 1. True black background (#000) for maximum contrast
6
- * 2. Muted grays for secondary content
7
- * 3. Vibrant accent colors used sparingly
8
- * 4. Rounded borders for modern feel
9
- * 5. Generous spacing for readability
4
+ * Two rules drive everything here:
10
5
  *
11
- * VSCode extension colors reference:
12
- * - critical: #d64933, high: #867530, medium: #37505C, low: #bac1b8
6
+ * 1. **Colour is signal only.** Priority, contract state and selection get
7
+ * colour; nothing else does. IDs and metadata are dim, titles are default
8
+ * foreground. There are no decorative accents and no theme colours for
9
+ * "chrome", because v3 has no chrome.
10
+ * 2. **Structure comes from typography.** A document's kind is a single glyph
11
+ * in column 1; hierarchy is two spaces of indent; separation is whitespace.
12
+ * The only box-drawing character that survives is the horizontal rule used
13
+ * for the header and footer boundaries.
13
14
  */
14
- export declare const PALETTE: {
15
- readonly bg: "#000000";
16
- readonly bgSubtle: "#0a0a0a";
17
- readonly bgMuted: "#1a1a1a";
18
- readonly bgHighlight: "#2a2a2a";
19
- readonly panel: "#1e1e1e";
15
+ declare const RAW_PALETTE: {
20
16
  readonly text: "#ffffff";
21
17
  readonly textSecondary: "#a0a0a0";
22
18
  readonly textMuted: "#606060";
23
19
  readonly textDim: "#404040";
24
- readonly border: "#333333";
25
- readonly borderFocus: "#505050";
26
- readonly borderAccent: "#7c3aed";
27
20
  readonly critical: "#ef4444";
28
21
  readonly high: "#f59e0b";
29
22
  readonly medium: "#3b82f6";
30
23
  readonly low: "#6b7280";
31
- readonly giga: "#a855f7";
24
+ readonly contractDraft: "#606060";
25
+ readonly contractReady: "#06b6d4";
26
+ readonly contractInProgress: "#eab308";
27
+ readonly contractDelivered: "#c026d3";
28
+ readonly contractDone: "#22c55e";
29
+ readonly contractFailed: "#ef4444";
32
30
  readonly success: "#22c55e";
33
31
  readonly warning: "#eab308";
34
32
  readonly error: "#ef4444";
35
33
  readonly info: "#3b82f6";
36
- readonly progress: "#3b82f6";
37
34
  readonly accent: "#7c3aed";
38
- readonly accentAlt: "#06b6d4";
39
- readonly selected: "#ffffff";
40
35
  };
41
- export declare const BOX: {
42
- readonly topLeft: "╭";
43
- readonly topRight: "╮";
44
- readonly bottomLeft: "╰";
45
- readonly bottomRight: "╯";
46
- readonly horizontal: "─";
47
- readonly vertical: "│";
48
- readonly teeRight: "├";
49
- readonly teeLeft: "┤";
50
- };
51
- export declare const BORDERS: {
52
- readonly round: {
53
- readonly topLeft: "╭";
54
- readonly topRight: "╮";
55
- readonly bottomLeft: "╰";
56
- readonly bottomRight: "╯";
57
- readonly horizontal: "─";
58
- readonly vertical: "│";
59
- };
60
- readonly single: {
61
- readonly topLeft: "┌";
62
- readonly topRight: "┐";
63
- readonly bottomLeft: "└";
64
- readonly bottomRight: "┘";
65
- readonly horizontal: "─";
66
- readonly vertical: "│";
67
- };
68
- readonly double: {
69
- readonly topLeft: "╔";
70
- readonly topRight: "╗";
71
- readonly bottomLeft: "╚";
72
- readonly bottomRight: "╝";
73
- readonly horizontal: "═";
74
- readonly vertical: "║";
75
- };
76
- readonly bold: {
77
- readonly topLeft: "┏";
78
- readonly topRight: "┓";
79
- readonly bottomLeft: "┗";
80
- readonly bottomRight: "┛";
81
- readonly horizontal: "━";
82
- readonly vertical: "┃";
83
- };
84
- };
85
- export declare const SPACING: {
86
- readonly none: 0;
87
- readonly xs: 1;
88
- readonly sm: 2;
89
- readonly md: 3;
90
- readonly lg: 4;
91
- readonly xl: 6;
92
- };
93
- export declare const ICONS: {
36
+ /**
37
+ * `NO_COLOR` (https://no-color.org): any non-empty value disables colour. The
38
+ * empty string is falsy in JS, which happens to be exactly the spec's rule.
39
+ *
40
+ * Gating happens HERE, at the prop layer, rather than by forcing `chalk.level`
41
+ * to 0 globally. Ink still applies `inverse` through `chalk.inverse`, and chalk
42
+ * level 0 (NO_COLOR / FORCE_COLOR=0) is a no-op — so selection also puts a
43
+ * cursor glyph in column 1 of `DocumentRow`. The palette gate keeps colour
44
+ * props `undefined`; the glyph is what a no-colour terminal can actually see.
45
+ *
46
+ * The Proxy means all ~107 `PALETTE.x` call sites need no change, and the check
47
+ * is a plain runtime read at module init, so it survives the esbuild bundle
48
+ * without depending on import order the way a `FORCE_COLOR` shim would.
49
+ */
50
+ export declare function isNoColor(env?: NodeJS.ProcessEnv): boolean;
51
+ /**
52
+ * The palette the views see. Exported as a factory so the gate is testable
53
+ * without module-cache gymnastics — `PALETTE` itself is the one-shot
54
+ * application of it to the real environment.
55
+ */
56
+ export declare function makePalette(noColor: boolean): typeof RAW_PALETTE;
57
+ export declare const NO_COLOR: boolean;
58
+ export declare const PALETTE: typeof RAW_PALETTE;
59
+ /** The only box-drawing character v3 uses: header and footer rules. */
60
+ export declare const RULE = "\u2500";
61
+ /**
62
+ * Document-type glyphs (column 1). A plain task deliberately renders *no*
63
+ * glyph — the blank column is what makes typed documents stand out.
64
+ */
65
+ export declare const TYPE_GLYPHS: Record<string, string>;
66
+ export declare function getTypeGlyph(type?: string): string;
67
+ /**
68
+ * Plain (non-emoji) glyphs used by the chrome-free views. The v2 emoji set
69
+ * (📄 📁 🔍 📦 📋 🗑 …) is gone: emoji have unreliable terminal widths and
70
+ * broke column alignment, which is the whole point of the v3 list.
71
+ */
72
+ export declare const GLYPHS: {
73
+ readonly pointer: "▸";
74
+ readonly cursor: "▌";
75
+ readonly collapsed: "▶";
94
76
  readonly success: "✓";
95
77
  readonly error: "✗";
96
78
  readonly warning: "⚠";
97
- readonly info: "ℹ";
98
- readonly expanded: "▼";
99
- readonly collapsed: "▶";
100
- readonly bullet: "•";
101
- readonly arrow: "→";
102
- readonly pointer: "▸";
103
- readonly cursor: "▌";
104
- readonly file: "📄";
105
- readonly folder: "📁";
106
- readonly task: "☐";
107
- readonly taskDone: "☑";
108
- readonly progressFilled: "█";
109
- readonly progressEmpty: "░";
110
- readonly progressPartial: "▓";
111
- readonly reload: "↻";
112
79
  readonly live: "●";
113
- readonly search: "🔍";
114
- readonly archive: "📦";
115
- readonly rules: "📋";
116
- readonly restore: "↩";
117
- readonly delete: "🗑";
80
+ readonly subtaskOpen: "◻";
81
+ readonly subtaskDone: "☑";
82
+ readonly orphanParent: "←";
83
+ /** Board-list row glyph for a parent-with-children that is expanded (§A1). */
84
+ readonly parentExpanded: "▾";
85
+ /** Board-list row glyph for a parent-with-children that is collapsed (§A1). */
86
+ readonly parentCollapsed: "▸";
87
+ /** Detail body scroll indicator (§B2), e.g. `↕ 2/9`. */
88
+ readonly scroll: "↕";
118
89
  };
90
+ export type ContractState = 'draft' | 'ready' | 'in_progress' | 'delivered' | 'done' | 'failed' | 'blocked';
91
+ /**
92
+ * Contract state → colour. Unlike v2 (which had two divergent, both-incomplete
93
+ * switch statements in TaskCard and TaskDetail) this is the single mapping, and
94
+ * it covers all six states the schema can produce.
95
+ */
96
+ export declare function getContractStateColor(state?: string): string;
97
+ export {};
119
98
  //# sourceMappingURL=theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCV,CAAC;AAGX,eAAO,MAAM,GAAG;;;;;;;;;CASN,CAAC;AAGX,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCV,CAAC;AAGX,eAAO,MAAM,OAAO;;;;;;;CAOV,CAAC;AAGX,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;CAkCR,CAAC"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;CA6BP,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEvE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,WAAW,CAGhE;AAED,eAAO,MAAM,QAAQ,SAAc,CAAC;AAEpC,eAAO,MAAM,OAAO,EAAE,OAAO,WAAmC,CAAC;AAEjE,uEAAuE;AACvE,eAAO,MAAM,IAAI,WAAM,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM9C,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;GAIG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;IAWjB,8EAA8E;;IAE9E,+EAA+E;;IAE/E,wDAAwD;;CAEhD,CAAC;AAEX,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,OAAO,GACP,aAAa,GACb,WAAW,GACX,MAAM,GACN,QAAQ,GACR,SAAS,CAAC;AAEd;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAiB5D"}
package/dist/tui/theme.js CHANGED
@@ -1,138 +1,141 @@
1
1
  "use strict";
2
2
  /**
3
- * Brainfile TUI Theme
3
+ * Brainfile TUI v3 design system.
4
4
  *
5
- * Design principles (aligned with VSCode extension aesthetic):
6
- * 1. True black background (#000) for maximum contrast
7
- * 2. Muted grays for secondary content
8
- * 3. Vibrant accent colors used sparingly
9
- * 4. Rounded borders for modern feel
10
- * 5. Generous spacing for readability
5
+ * Two rules drive everything here:
11
6
  *
12
- * VSCode extension colors reference:
13
- * - critical: #d64933, high: #867530, medium: #37505C, low: #bac1b8
7
+ * 1. **Colour is signal only.** Priority, contract state and selection get
8
+ * colour; nothing else does. IDs and metadata are dim, titles are default
9
+ * foreground. There are no decorative accents and no theme colours for
10
+ * "chrome", because v3 has no chrome.
11
+ * 2. **Structure comes from typography.** A document's kind is a single glyph
12
+ * in column 1; hierarchy is two spaces of indent; separation is whitespace.
13
+ * The only box-drawing character that survives is the horizontal rule used
14
+ * for the header and footer boundaries.
14
15
  */
15
16
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.ICONS = exports.SPACING = exports.BORDERS = exports.BOX = exports.PALETTE = void 0;
17
- // Main color palette with hex values for True Color terminals
18
- exports.PALETTE = {
19
- // Backgrounds
20
- bg: '#000000',
21
- bgSubtle: '#0a0a0a',
22
- bgMuted: '#1a1a1a',
23
- bgHighlight: '#2a2a2a',
24
- panel: '#1e1e1e',
17
+ exports.GLYPHS = exports.TYPE_GLYPHS = exports.RULE = exports.PALETTE = exports.NO_COLOR = void 0;
18
+ exports.isNoColor = isNoColor;
19
+ exports.makePalette = makePalette;
20
+ exports.getTypeGlyph = getTypeGlyph;
21
+ exports.getContractStateColor = getContractStateColor;
22
+ const RAW_PALETTE = {
25
23
  // Text hierarchy
26
24
  text: '#ffffff',
27
25
  textSecondary: '#a0a0a0',
28
26
  textMuted: '#606060',
29
27
  textDim: '#404040',
30
- // Borders
31
- border: '#333333',
32
- borderFocus: '#505050',
33
- borderAccent: '#7c3aed',
34
- // Priority colors (TUI-optimized, inspired by VSCode extension)
28
+ // Priority signal
35
29
  critical: '#ef4444',
36
30
  high: '#f59e0b',
37
31
  medium: '#3b82f6',
38
32
  low: '#6b7280',
39
- giga: '#a855f7', // Purple for custom priority
40
- // Semantic colors
33
+ // Contract-state signal (design §3: draft dim · ready cyan · in_progress
34
+ // yellow · delivered magenta · done green · failed/blocked red)
35
+ contractDraft: '#606060',
36
+ contractReady: '#06b6d4',
37
+ contractInProgress: '#eab308',
38
+ contractDelivered: '#c026d3',
39
+ contractDone: '#22c55e',
40
+ contractFailed: '#ef4444',
41
+ // Feedback
41
42
  success: '#22c55e',
42
43
  warning: '#eab308',
43
44
  error: '#ef4444',
44
45
  info: '#3b82f6',
45
- // UI accents
46
- progress: '#3b82f6',
47
46
  accent: '#7c3aed',
48
- accentAlt: '#06b6d4',
49
- selected: '#ffffff',
50
47
  };
51
- // Box drawing characters - default to rounded for modern feel
52
- exports.BOX = {
53
- topLeft: '╭',
54
- topRight: '╮',
55
- bottomLeft: '╰',
56
- bottomRight: '╯',
57
- horizontal: '─',
58
- vertical: '│',
59
- teeRight: '├',
60
- teeLeft: '┤',
61
- };
62
- // Alternative border styles
63
- exports.BORDERS = {
64
- round: {
65
- topLeft: '╭',
66
- topRight: '╮',
67
- bottomLeft: '╰',
68
- bottomRight: '╯',
69
- horizontal: '─',
70
- vertical: '│',
71
- },
72
- single: {
73
- topLeft: '┌',
74
- topRight: '┐',
75
- bottomLeft: '└',
76
- bottomRight: '┘',
77
- horizontal: '─',
78
- vertical: '│',
79
- },
80
- double: {
81
- topLeft: '╔',
82
- topRight: '╗',
83
- bottomLeft: '╚',
84
- bottomRight: '╝',
85
- horizontal: '═',
86
- vertical: '║',
87
- },
88
- bold: {
89
- topLeft: '┏',
90
- topRight: '┓',
91
- bottomLeft: '┗',
92
- bottomRight: '┛',
93
- horizontal: '━',
94
- vertical: '┃',
95
- },
96
- };
97
- // Spacing scale
98
- exports.SPACING = {
99
- none: 0,
100
- xs: 1,
101
- sm: 2,
102
- md: 3,
103
- lg: 4,
104
- xl: 6,
48
+ /**
49
+ * `NO_COLOR` (https://no-color.org): any non-empty value disables colour. The
50
+ * empty string is falsy in JS, which happens to be exactly the spec's rule.
51
+ *
52
+ * Gating happens HERE, at the prop layer, rather than by forcing `chalk.level`
53
+ * to 0 globally. Ink still applies `inverse` through `chalk.inverse`, and chalk
54
+ * level 0 (NO_COLOR / FORCE_COLOR=0) is a no-op — so selection also puts a
55
+ * cursor glyph in column 1 of `DocumentRow`. The palette gate keeps colour
56
+ * props `undefined`; the glyph is what a no-colour terminal can actually see.
57
+ *
58
+ * The Proxy means all ~107 `PALETTE.x` call sites need no change, and the check
59
+ * is a plain runtime read at module init, so it survives the esbuild bundle
60
+ * without depending on import order the way a `FORCE_COLOR` shim would.
61
+ */
62
+ function isNoColor(env = process.env) {
63
+ return Boolean(env.NO_COLOR);
64
+ }
65
+ /**
66
+ * The palette the views see. Exported as a factory so the gate is testable
67
+ * without module-cache gymnastics — `PALETTE` itself is the one-shot
68
+ * application of it to the real environment.
69
+ */
70
+ function makePalette(noColor) {
71
+ if (!noColor)
72
+ return RAW_PALETTE;
73
+ return new Proxy(RAW_PALETTE, { get: () => undefined });
74
+ }
75
+ exports.NO_COLOR = isNoColor();
76
+ exports.PALETTE = makePalette(exports.NO_COLOR);
77
+ /** The only box-drawing character v3 uses: header and footer rules. */
78
+ exports.RULE = '─';
79
+ /**
80
+ * Document-type glyphs (column 1). A plain task deliberately renders *no*
81
+ * glyph — the blank column is what makes typed documents stand out.
82
+ */
83
+ exports.TYPE_GLYPHS = {
84
+ epic: '▸',
85
+ spec: '◆',
86
+ adr: '●',
87
+ plan: '⎘',
88
+ task: '',
105
89
  };
106
- // Icons/glyphs for consistent visual language
107
- exports.ICONS = {
108
- // Status
90
+ function getTypeGlyph(type) {
91
+ if (!type)
92
+ return '';
93
+ return exports.TYPE_GLYPHS[type.toLowerCase()] ?? '';
94
+ }
95
+ /**
96
+ * Plain (non-emoji) glyphs used by the chrome-free views. The v2 emoji set
97
+ * (📄 📁 🔍 📦 📋 🗑 …) is gone: emoji have unreliable terminal widths and
98
+ * broke column alignment, which is the whole point of the v3 list.
99
+ */
100
+ exports.GLYPHS = {
101
+ pointer: '▸',
102
+ cursor: '▌',
103
+ collapsed: '▶',
109
104
  success: '✓',
110
105
  error: '✗',
111
106
  warning: '⚠',
112
- info: 'ℹ',
113
- // Navigation
114
- expanded: '▼',
115
- collapsed: '▶',
116
- bullet: '•',
117
- arrow: '→',
118
- pointer: '▸',
119
- cursor: '▌',
120
- // Objects
121
- file: '📄',
122
- folder: '📁',
123
- task: '☐',
124
- taskDone: '☑',
125
- // Progress
126
- progressFilled: '█',
127
- progressEmpty: '░',
128
- progressPartial: '▓',
129
- // Misc
130
- reload: '↻',
131
107
  live: '●',
132
- search: '🔍',
133
- archive: '📦',
134
- rules: '📋',
135
- restore: '↩',
136
- delete: '🗑',
108
+ subtaskOpen: '◻',
109
+ subtaskDone: '☑',
110
+ orphanParent: '←',
111
+ /** Board-list row glyph for a parent-with-children that is expanded (§A1). */
112
+ parentExpanded: '▾',
113
+ /** Board-list row glyph for a parent-with-children that is collapsed (§A1). */
114
+ parentCollapsed: '▸',
115
+ /** Detail body scroll indicator (§B2), e.g. `↕ 2/9`. */
116
+ scroll: '↕',
137
117
  };
118
+ /**
119
+ * Contract state → colour. Unlike v2 (which had two divergent, both-incomplete
120
+ * switch statements in TaskCard and TaskDetail) this is the single mapping, and
121
+ * it covers all six states the schema can produce.
122
+ */
123
+ function getContractStateColor(state) {
124
+ switch (state?.toLowerCase()) {
125
+ case 'ready':
126
+ return exports.PALETTE.contractReady;
127
+ case 'in_progress':
128
+ return exports.PALETTE.contractInProgress;
129
+ case 'delivered':
130
+ return exports.PALETTE.contractDelivered;
131
+ case 'done':
132
+ return exports.PALETTE.contractDone;
133
+ case 'failed':
134
+ case 'blocked':
135
+ return exports.PALETTE.contractFailed;
136
+ case 'draft':
137
+ default:
138
+ return exports.PALETTE.contractDraft;
139
+ }
140
+ }
138
141
  //# sourceMappingURL=theme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"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"}