projectinator 0.3.0 → 0.4.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 (170) hide show
  1. package/README.md +30 -11
  2. package/bin/projectinator.mjs +56 -11
  3. package/dist/bakeoff.js +163 -0
  4. package/dist/bakeoff.js.map +1 -0
  5. package/dist/build-state.js +26 -0
  6. package/dist/build-state.js.map +1 -0
  7. package/dist/burndown.js +19 -0
  8. package/dist/burndown.js.map +1 -0
  9. package/dist/calibration.js +86 -0
  10. package/dist/calibration.js.map +1 -0
  11. package/dist/cli.js +289 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/cost.js +35 -0
  14. package/dist/cost.js.map +1 -0
  15. package/dist/council.js +147 -0
  16. package/dist/council.js.map +1 -0
  17. package/dist/demo.js +93 -0
  18. package/dist/demo.js.map +1 -0
  19. package/dist/estimate.js +98 -0
  20. package/dist/estimate.js.map +1 -0
  21. package/dist/executor.js +118 -0
  22. package/dist/executor.js.map +1 -0
  23. package/dist/git.js +82 -0
  24. package/dist/git.js.map +1 -0
  25. package/dist/intake.js +98 -0
  26. package/dist/intake.js.map +1 -0
  27. package/dist/models.js +171 -0
  28. package/dist/models.js.map +1 -0
  29. package/dist/narrate.js +76 -0
  30. package/dist/narrate.js.map +1 -0
  31. package/dist/openrouter.js +112 -0
  32. package/dist/openrouter.js.map +1 -0
  33. package/dist/orchestrator.js +273 -0
  34. package/dist/orchestrator.js.map +1 -0
  35. package/dist/pm.js +245 -0
  36. package/dist/pm.js.map +1 -0
  37. package/dist/preview.js +194 -0
  38. package/dist/preview.js.map +1 -0
  39. package/dist/registry-store.js +38 -0
  40. package/dist/registry-store.js.map +1 -0
  41. package/dist/registry.js +115 -0
  42. package/dist/registry.js.map +1 -0
  43. package/dist/research.js +98 -0
  44. package/dist/research.js.map +1 -0
  45. package/dist/retro.js +83 -0
  46. package/dist/retro.js.map +1 -0
  47. package/dist/roles.js +357 -0
  48. package/dist/roles.js.map +1 -0
  49. package/dist/router.js +95 -0
  50. package/dist/router.js.map +1 -0
  51. package/dist/run-bakeoff.js +68 -0
  52. package/dist/run-bakeoff.js.map +1 -0
  53. package/dist/run-build.js +193 -0
  54. package/dist/run-build.js.map +1 -0
  55. package/{src/run-dev.ts → dist/run-dev.js} +23 -39
  56. package/dist/run-dev.js.map +1 -0
  57. package/{src/run-pm.ts → dist/run-pm.js} +34 -46
  58. package/dist/run-pm.js.map +1 -0
  59. package/{src/run-research.ts → dist/run-research.js} +19 -30
  60. package/dist/run-research.js.map +1 -0
  61. package/{src/run-scout.ts → dist/run-scout.js} +17 -27
  62. package/dist/run-scout.js.map +1 -0
  63. package/dist/run-web.js +93 -0
  64. package/dist/run-web.js.map +1 -0
  65. package/dist/scout.js +81 -0
  66. package/dist/scout.js.map +1 -0
  67. package/dist/session-cost.js +15 -0
  68. package/dist/session-cost.js.map +1 -0
  69. package/dist/stack.js +34 -0
  70. package/dist/stack.js.map +1 -0
  71. package/dist/stuck.js +21 -0
  72. package/dist/stuck.js.map +1 -0
  73. package/dist/tui/App.js +1269 -0
  74. package/dist/tui/App.js.map +1 -0
  75. package/dist/tui/BakeOff.js +95 -0
  76. package/dist/tui/BakeOff.js.map +1 -0
  77. package/dist/tui/BoardEditor.js +183 -0
  78. package/dist/tui/BoardEditor.js.map +1 -0
  79. package/dist/tui/EditableBoard.js +140 -0
  80. package/dist/tui/EditableBoard.js.map +1 -0
  81. package/dist/tui/Frame.js +78 -0
  82. package/dist/tui/Frame.js.map +1 -0
  83. package/dist/tui/Intake.js +59 -0
  84. package/dist/tui/Intake.js.map +1 -0
  85. package/dist/tui/Kanban.js +75 -0
  86. package/dist/tui/Kanban.js.map +1 -0
  87. package/dist/tui/Settings.js +299 -0
  88. package/dist/tui/Settings.js.map +1 -0
  89. package/dist/tui/StackPick.js +44 -0
  90. package/dist/tui/StackPick.js.map +1 -0
  91. package/dist/tui/WebAccounts.js +131 -0
  92. package/dist/tui/WebAccounts.js.map +1 -0
  93. package/dist/tui/components.js +178 -0
  94. package/dist/tui/components.js.map +1 -0
  95. package/dist/tui/config.js +129 -0
  96. package/dist/tui/config.js.map +1 -0
  97. package/dist/tui/deploy.js +114 -0
  98. package/dist/tui/deploy.js.map +1 -0
  99. package/dist/tui/engine.js +710 -0
  100. package/dist/tui/engine.js.map +1 -0
  101. package/dist/tui/notify.js +47 -0
  102. package/dist/tui/notify.js.map +1 -0
  103. package/dist/tui/panels.js +42 -0
  104. package/dist/tui/panels.js.map +1 -0
  105. package/dist/tui/templates.js +106 -0
  106. package/dist/tui/templates.js.map +1 -0
  107. package/dist/tui/theme.js +42 -0
  108. package/dist/tui/theme.js.map +1 -0
  109. package/dist/tui/validate.js +51 -0
  110. package/dist/tui/validate.js.map +1 -0
  111. package/{src/tui.tsx → dist/tui.js} +23 -33
  112. package/dist/tui.js.map +1 -0
  113. package/dist/types.js +19 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/web/oauth-anthropic.js +179 -0
  116. package/dist/web/oauth-anthropic.js.map +1 -0
  117. package/dist/web/session.js +274 -0
  118. package/dist/web/session.js.map +1 -0
  119. package/package.json +5 -4
  120. package/src/bakeoff.ts +0 -214
  121. package/src/build-state.ts +0 -47
  122. package/src/burndown.ts +0 -35
  123. package/src/calibration.ts +0 -88
  124. package/src/cost.ts +0 -43
  125. package/src/council.ts +0 -175
  126. package/src/demo.ts +0 -106
  127. package/src/estimate.ts +0 -111
  128. package/src/executor.ts +0 -169
  129. package/src/git.ts +0 -72
  130. package/src/intake.ts +0 -125
  131. package/src/models.ts +0 -175
  132. package/src/narrate.ts +0 -87
  133. package/src/openrouter.ts +0 -119
  134. package/src/orchestrator.ts +0 -310
  135. package/src/pm.ts +0 -302
  136. package/src/preview.ts +0 -206
  137. package/src/registry-store.ts +0 -41
  138. package/src/registry.ts +0 -132
  139. package/src/research.ts +0 -123
  140. package/src/retro.ts +0 -99
  141. package/src/roles.ts +0 -401
  142. package/src/router.ts +0 -120
  143. package/src/run-bakeoff.ts +0 -77
  144. package/src/run-build.ts +0 -203
  145. package/src/run-web.ts +0 -87
  146. package/src/scout.ts +0 -121
  147. package/src/session-cost.ts +0 -17
  148. package/src/stack.ts +0 -46
  149. package/src/tui/App.tsx +0 -1760
  150. package/src/tui/BakeOff.tsx +0 -190
  151. package/src/tui/BoardEditor.tsx +0 -260
  152. package/src/tui/EditableBoard.tsx +0 -179
  153. package/src/tui/Frame.tsx +0 -142
  154. package/src/tui/Intake.tsx +0 -111
  155. package/src/tui/Kanban.tsx +0 -158
  156. package/src/tui/Settings.tsx +0 -513
  157. package/src/tui/StackPick.tsx +0 -79
  158. package/src/tui/WebAccounts.tsx +0 -197
  159. package/src/tui/components.tsx +0 -340
  160. package/src/tui/config.ts +0 -150
  161. package/src/tui/deploy.ts +0 -137
  162. package/src/tui/engine.ts +0 -749
  163. package/src/tui/notify.ts +0 -21
  164. package/src/tui/panels.tsx +0 -89
  165. package/src/tui/templates.ts +0 -119
  166. package/src/tui/theme.ts +0 -44
  167. package/src/tui/validate.ts +0 -53
  168. package/src/types.ts +0 -208
  169. package/src/web/oauth-anthropic.ts +0 -206
  170. package/src/web/session.ts +0 -299
@@ -0,0 +1,140 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ // Directly edit a project's board: reorganize epics, rename, retag, add or delete
3
+ // tasks. Done tasks are locked (they're already built). Saves back to build-state.
4
+ import { useState } from "react";
5
+ import { Box, Text, useInput } from "ink";
6
+ import { C, ROLE_META, KeyHint, TextField as TextInput } from "./components.js";
7
+ import { estimateTokens } from "../estimate.js";
8
+ import { groupByEpic } from "./Kanban.js";
9
+ const CAPS = ["plan", "design", "code", "review", "test", "ops"];
10
+ const DIFFS = ["trivial", "low", "medium", "high"];
11
+ export function EditableBoard({ tasks, doneIds, onSave, onCancel, }) {
12
+ const [items, setItems] = useState(() => tasks.map((t) => ({ ...t })));
13
+ const [cursor, setCursor] = useState(0);
14
+ const [editing, setEditing] = useState(false);
15
+ const [field, setField] = useState("title");
16
+ const [draft, setDraft] = useState("");
17
+ const [warn, setWarn] = useState("");
18
+ const lanes = groupByEpic(items);
19
+ const ordered = lanes.flatMap((l) => l.tasks);
20
+ const selected = ordered[Math.min(cursor, ordered.length - 1)];
21
+ const isDone = (id) => doneIds.has(id);
22
+ const update = (id, patch) => setItems((is) => is.map((t) => (t.id === id ? { ...t, ...patch } : t)));
23
+ const nextId = () => {
24
+ const ids = new Set(items.map((t) => t.id));
25
+ let n = items.length + 1;
26
+ let id = `T-${String(n).padStart(2, "0")}`;
27
+ while (ids.has(id))
28
+ id = `T-${String(++n).padStart(2, "0")}`;
29
+ return id;
30
+ };
31
+ useInput((input, key) => {
32
+ if (editing)
33
+ return;
34
+ if (key.upArrow)
35
+ return setCursor((c) => Math.max(0, c - 1));
36
+ if (key.downArrow)
37
+ return setCursor((c) => Math.min(ordered.length - 1, c + 1));
38
+ if (input === "[" || input === "]") {
39
+ if (!selected)
40
+ return;
41
+ const dir = input === "[" ? -1 : 1;
42
+ const idx = items.findIndex((t) => t.id === selected.id);
43
+ let j = idx + dir;
44
+ while (j >= 0 && j < items.length) {
45
+ if ((items[j].epic || "General") === (selected.epic || "General"))
46
+ break;
47
+ j += dir;
48
+ }
49
+ if (j < 0 || j >= items.length)
50
+ return;
51
+ const next = [...items];
52
+ const [moved] = next.splice(idx, 1);
53
+ next.splice(j, 0, moved);
54
+ setItems(next);
55
+ const newOrdered = groupByEpic(next).flatMap((l) => l.tasks);
56
+ setCursor(newOrdered.findIndex((t) => t.id === moved.id));
57
+ return;
58
+ }
59
+ if (input === "a") {
60
+ const id = nextId();
61
+ const epic = selected?.epic || "General";
62
+ setItems((is) => [...is, { id, title: "New task", capability: "code", difficulty: "low", dependsOn: [], epic, estTokens: estimateTokens("code", "low") }]);
63
+ setField("title");
64
+ setDraft("New task");
65
+ setEditing(true);
66
+ setWarn("");
67
+ return;
68
+ }
69
+ if (!selected)
70
+ return;
71
+ if (key.return)
72
+ return onSave(items);
73
+ if (key.escape)
74
+ return onCancel();
75
+ if (input === "g") {
76
+ setField("epic");
77
+ setDraft(selected.epic || "General");
78
+ setEditing(true);
79
+ return;
80
+ }
81
+ if (input === "D") {
82
+ setField("deps");
83
+ setDraft((selected.dependsOn ?? []).join(" "));
84
+ setEditing(true);
85
+ return;
86
+ }
87
+ if (input === "n") {
88
+ setField("notes");
89
+ setDraft(selected.notes ?? "");
90
+ setEditing(true);
91
+ return;
92
+ }
93
+ // fields below don't change built work
94
+ if (isDone(selected.id)) {
95
+ setWarn(`${selected.id} is already built — only its epic (g) and notes (n) can be changed.`);
96
+ return;
97
+ }
98
+ if (input === "e") {
99
+ setField("title");
100
+ setDraft(selected.title);
101
+ setEditing(true);
102
+ }
103
+ else if (input === "c") {
104
+ const cap = CAPS[(CAPS.indexOf(selected.capability) + 1) % CAPS.length];
105
+ update(selected.id, { capability: cap, estTokens: estimateTokens(cap, selected.difficulty) });
106
+ }
107
+ else if (input === "f") {
108
+ const diff = DIFFS[(DIFFS.indexOf(selected.difficulty) + 1) % DIFFS.length];
109
+ update(selected.id, { difficulty: diff, estTokens: estimateTokens(selected.capability, diff) });
110
+ }
111
+ else if (input === "d") {
112
+ setItems((is) => is.filter((t) => t.id !== selected.id));
113
+ setCursor((c) => Math.max(0, c - 1));
114
+ }
115
+ });
116
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: ["Edit board ", _jsxs(Text, { color: C.dim, children: ["(", items.length, " tasks)"] })] }), warn ? _jsx(Text, { color: C.warn, children: warn }) : null, editing && field === "epic" && selected ? (_jsxs(Box, { children: [_jsxs(Text, { color: C.accent, children: ["Epic for ", selected.id, ": "] }), _jsx(TextInput, { value: draft, onChange: setDraft, onSubmit: () => { update(selected.id, { epic: draft.trim() || selected.epic }); setEditing(false); } })] })) : null, editing && field === "deps" && selected ? (_jsxs(Box, { children: [_jsxs(Text, { color: C.accent, children: [selected.id, " depends on (ids): "] }), _jsx(TextInput, { value: draft, onChange: setDraft, onSubmit: () => {
117
+ const ids = new Set(items.map((t) => t.id));
118
+ const deps = draft.split(/[\s,]+/).filter((d) => d && d !== selected.id && ids.has(d));
119
+ update(selected.id, { dependsOn: [...new Set(deps)] });
120
+ setEditing(false);
121
+ } })] })) : null, editing && field === "notes" && selected ? (_jsxs(Box, { children: [_jsxs(Text, { color: C.accent, children: ["Note for ", selected.id, " (yours only, never sent to the model): "] }), _jsx(TextInput, { value: draft, onChange: setDraft, onSubmit: () => { update(selected.id, { notes: draft.trim() || undefined }); setEditing(false); } })] })) : null, lanes.map((lane) => (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: C.accent, children: ["\u258A ", lane.epic] }), lane.tasks.map((t) => {
122
+ const sel = selected?.id === t.id;
123
+ const done = isDone(t.id);
124
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Box, { width: 2, children: _jsx(Text, { color: C.accent, children: sel ? "›" : " " }) }), _jsx(Box, { width: 2, children: _jsx(Text, { color: done ? C.good : C.dim, children: done ? "✓" : "○" }) }), _jsx(Box, { width: 7, children: _jsx(Text, { color: C.dim, children: t.id }) }), _jsx(Box, { width: 3, children: _jsx(Text, { children: ROLE_META[t.capability].emoji }) }), _jsx(Box, { width: 16, children: _jsxs(Text, { color: sel ? C.accent : C.dim, children: [t.capability, "/", t.difficulty] }) }), _jsx(Box, { flexGrow: 1, children: sel && editing && field === "title" ? (_jsx(TextInput, { value: draft, onChange: setDraft, onSubmit: () => { update(t.id, { title: draft.trim() || t.title }); setEditing(false); } })) : (_jsx(Text, { color: sel ? C.text : done ? C.dim : C.text, wrap: "truncate-end", children: t.title })) })] }), t.notes ? _jsx(Box, { marginLeft: 30, children: _jsxs(Text, { color: C.dim, wrap: "truncate-end", children: ["\u270E ", t.notes] }) }) : null] }, t.id));
125
+ })] }, lane.epic))), _jsx(Box, { marginTop: 1, children: _jsx(KeyHint, { hints: [
126
+ { keys: "↑↓", label: "pick" },
127
+ { keys: "[ ]", label: "reorder" },
128
+ { keys: "g", label: "epic" },
129
+ { keys: "D", label: "deps" },
130
+ { keys: "n", label: "note" },
131
+ { keys: "e", label: "rename" },
132
+ { keys: "c", label: "cap" },
133
+ { keys: "f", label: "diff" },
134
+ { keys: "a", label: "add" },
135
+ { keys: "d", label: "delete" },
136
+ { keys: "Enter", label: "save" },
137
+ { keys: "Esc", label: "back" },
138
+ ] }) })] }));
139
+ }
140
+ //# sourceMappingURL=EditableBoard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditableBoard.js","sourceRoot":"","sources":["../../src/tui/EditableBoard.tsx"],"names":[],"mappings":";AAAA,kFAAkF;AAClF,mFAAmF;AAEnF,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE1C,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,IAAI,GAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AAC9E,MAAM,KAAK,GAAiB,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAEjE,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,EACP,MAAM,EACN,QAAQ,GAMT;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAsC,OAAO,CAAC,CAAC;IACjF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAErC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,KAAoB,EAAE,EAAE,CAClD,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1E,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,IAAI,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,EAAE,GAAG,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7D,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,OAAO;YAAE,OAAO;QACpB,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,GAAG,CAAC,SAAS;YAAE,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,MAAM,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,SAAS,CAAC;oBAAE,MAAM;gBAC1E,CAAC,IAAI,GAAG,CAAC;YACX,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YACvC,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAM,CAAC,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7D,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,IAAI,SAAS,CAAC;YACzC,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3J,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClB,QAAQ,CAAC,UAAU,CAAC,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO,CAAC,EAAE,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO,QAAQ,EAAE,CAAC;QAClC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACxG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAClH,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACnG,uCAAuC;QACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,qEAAqE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;aAChF,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAE,CAAC;YACzE,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAE,CAAC;YAC7E,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACzB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,IAAC,IAAI,kCAAY,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,GAAG,kBAAI,KAAK,CAAC,MAAM,eAAe,IAAO,EAC7E,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,IAAI,YAAG,IAAI,GAAQ,CAAC,CAAC,CAAC,IAAI,EAChD,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CACzC,MAAC,GAAG,eAAC,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,0BAAY,QAAQ,CAAC,EAAE,UAAU,EACzD,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAI,IACjJ,CACP,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CACzC,MAAC,GAAG,eAAC,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,aAAG,QAAQ,CAAC,EAAE,2BAA2B,EACjE,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,GAAG,EAAE;4BACb,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;4BAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;4BACvF,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;4BACvD,UAAU,CAAC,KAAK,CAAC,CAAC;wBACpB,CAAC,GACD,IACE,CACP,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,CAC1C,MAAC,GAAG,eAAC,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,0BAAY,QAAQ,CAAC,EAAE,gDAAgD,EAC/F,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAI,IAC9I,CACP,CAAC,CAAC,CAAC,IAAI,EAEP,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,MAAC,GAAG,IAAiB,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtD,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,wBAAK,IAAI,CAAC,IAAI,IAAQ,EAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBACpB,MAAM,GAAG,GAAG,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;wBAClC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBAC1B,OAAO,CACL,MAAC,GAAG,IAAY,aAAa,EAAC,QAAQ,aACpC,MAAC,GAAG,eACF,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,YAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAQ,GAAM,EACpE,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAQ,GAAM,EAClF,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,GAAG,YAAG,CAAC,CAAC,EAAE,GAAQ,GAAM,EACtD,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,YAAE,KAAC,IAAI,cAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,GAAQ,GAAM,EACjE,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,YAAE,MAAC,IAAI,IAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,aAAG,CAAC,CAAC,UAAU,OAAG,CAAC,CAAC,UAAU,IAAQ,GAAM,EAC/F,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACb,GAAG,IAAI,OAAO,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CACrC,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAI,CAC1I,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAC,cAAc,YAAE,CAAC,CAAC,KAAK,GAAQ,CACxF,GACG,IACF,EACL,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,UAAU,EAAE,EAAE,YAAE,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAC,cAAc,wBAAI,CAAC,CAAC,KAAK,IAAQ,GAAM,CAAC,CAAC,CAAC,IAAI,KAf/F,CAAC,CAAC,EAAE,CAgBR,CACP,CAAC;oBACJ,CAAC,CAAC,KAxBM,IAAI,CAAC,IAAI,CAyBb,CACP,CAAC,EACF,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,OAAO,IAAC,KAAK,EAAE;wBACd,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;wBAC7B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;wBACjC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;wBAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;wBAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;wBAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE;wBAC9B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;wBAC3B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;wBAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;wBAC3B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE;wBAC9B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;wBAChC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;qBAC/B,GAAI,GACD,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { C, useTermRows, useTermCols } from "./components.js";
4
+ import { sessionCost } from "../session-cost.js";
5
+ import { getPrefs } from "./config.js";
6
+ function truncate(s, n) {
7
+ return s.length > n ? s.slice(0, n - 1) + "…" : s;
8
+ }
9
+ /** A short, human label for the current phase — shown faintly in the status bar. */
10
+ const PHASE_LABEL = {
11
+ setup: "Setup",
12
+ home: "Home",
13
+ assessing: "Reading your idea",
14
+ setCap: "Budget cap",
15
+ exportMenu: "Export",
16
+ filterEpic: "Filter",
17
+ rename: "Rename",
18
+ confirmDelete: "Delete",
19
+ saveTemplate: "Save template",
20
+ addAsset: "Add asset",
21
+ error: "Error",
22
+ projects: "Projects",
23
+ projectActions: "Project",
24
+ settings: "Settings",
25
+ bakeoff: "Bake-off",
26
+ idea: "New build",
27
+ change: "Change",
28
+ stack: "Stack",
29
+ intake: "Intake",
30
+ planMode: "Plan",
31
+ council: "Council",
32
+ approveEpics: "Epics",
33
+ planning: "Planning",
34
+ plan: "Plan",
35
+ board: "Plan board",
36
+ editBoard: "Edit board",
37
+ kanban: "Board",
38
+ building: "Building",
39
+ done: "Done",
40
+ preview: "Preview",
41
+ deployMenu: "Deploy",
42
+ deploying: "Deploying",
43
+ retro: "Retro",
44
+ burndown: "Burndown",
45
+ history: "History",
46
+ diff: "Diff",
47
+ transcripts: "Transcripts",
48
+ transcript: "Transcript",
49
+ importProject: "Import folder",
50
+ };
51
+ /** Slim top bar (OpenCode-style header): brand ▌ + project · phase on the left,
52
+ * a faint tagline on the right, with a subtle rule underneath. Full width. */
53
+ export function TopBar({ projectName, phase, }) {
54
+ const cols = useTermCols();
55
+ const label = phase ? PHASE_LABEL[phase] ?? phase : undefined;
56
+ return (_jsxs(Box, { width: cols, borderStyle: "single", borderColor: C.borderSubtle, borderBottom: true, borderTop: false, borderLeft: false, borderRight: false, paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: C.accent, bold: true, children: "\u258C PROJECTINATOR" }), projectName ? _jsx(Text, { color: C.textMuted, children: ` ${truncate(projectName, Math.max(12, Math.floor(cols * 0.4)))}` }) : null, label ? _jsx(Text, { color: C.textSubtle, children: ` · ${label}` }) : null] }), _jsx(Box, { children: _jsx(Text, { color: C.textSubtle, children: "your AI build team" }) })] }));
57
+ }
58
+ /** Bottom status bar: a global shortcut hint on the left, session cost + budget
59
+ * cap on the right, with a subtle rule on top. Full width. */
60
+ export function StatusBar() {
61
+ const cols = useTermCols();
62
+ const spent = sessionCost();
63
+ const cap = getPrefs().budgetCapUSD;
64
+ const overHalf = spent >= cap / 2;
65
+ return (_jsxs(Box, { width: cols, borderStyle: "single", borderColor: C.borderSubtle, borderTop: true, borderBottom: false, borderLeft: false, borderRight: false, paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: C.textSubtle, children: "q" }), _jsx(Text, { color: C.textSubtle, children: " quit" })] }), _jsxs(Box, { children: [_jsx(Text, { color: C.textSubtle, children: "session " }), _jsx(Text, { color: overHalf ? C.warn : C.accent, bold: true, children: `$${spent.toFixed(2)}` }), _jsx(Text, { color: C.textSubtle, children: ` · cap $${cap}` })] })] }));
66
+ }
67
+ /** Wraps every screen in the persistent frame: slim top bar, the screen content
68
+ * (padded, growing to fill the viewport), and the status bar pinned at the
69
+ * bottom edge. Replaces the old per-screen boxed Header. */
70
+ export function AppFrame({ children, projectName, phase, }) {
71
+ const rows = useTermRows();
72
+ return (
73
+ // Fixed height + overflow hidden so overly-tall content clips at the bottom
74
+ // instead of pushing the frame past the viewport (which would scroll the top
75
+ // bar off and unpin the status bar).
76
+ _jsxs(Box, { flexDirection: "column", height: rows, overflow: "hidden", children: [_jsx(TopBar, { projectName: projectName, phase: phase }), _jsx(Box, { flexGrow: 1, flexDirection: "column", paddingX: 1, paddingTop: 1, overflow: "hidden", children: children }), _jsx(StatusBar, {})] }));
77
+ }
78
+ //# sourceMappingURL=Frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Frame.js","sourceRoot":"","sources":["../../src/tui/Frame.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,oFAAoF;AACpF,MAAM,WAAW,GAA2B;IAC1C,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,QAAQ;IACpB,UAAU,EAAE,QAAQ;IACpB,MAAM,EAAE,QAAQ;IAChB,aAAa,EAAE,QAAQ;IACvB,YAAY,EAAE,eAAe;IAC7B,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,OAAO;IACrB,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,YAAY;IACvB,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,aAAa;IAC1B,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,eAAe;CAC/B,CAAC;AAEF;+EAC+E;AAC/E,MAAM,UAAU,MAAM,CAAC,EACrB,WAAW,EACX,KAAK,GAIN;IACC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,OAAO,CACL,MAAC,GAAG,IACF,KAAK,EAAE,IAAI,EACX,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,CAAC,CAAC,YAAY,EAC3B,YAAY,QACZ,SAAS,EAAE,KAAK,EAChB,UAAU,EAAE,KAAK,EACjB,WAAW,EAAE,KAAK,EAClB,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAE9B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,2CAAuB,EACjD,WAAW,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,YAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC3H,KAAK,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,YAAG,SAAS,KAAK,EAAE,GAAQ,CAAC,CAAC,CAAC,IAAI,IAChE,EACN,KAAC,GAAG,cAAC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,mCAA2B,GAAM,IAC3D,CACP,CAAC;AACJ,CAAC;AAED;+DAC+D;AAC/D,MAAM,UAAU,SAAS;IACvB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC,YAAY,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC,CAAC;IAClC,OAAO,CACL,MAAC,GAAG,IACF,KAAK,EAAE,IAAI,EACX,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,CAAC,CAAC,YAAY,EAC3B,SAAS,QACT,YAAY,EAAE,KAAK,EACnB,UAAU,EAAE,KAAK,EACjB,WAAW,EAAE,KAAK,EAClB,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAE9B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,kBAAU,EACnC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,sBAAc,IACnC,EACN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,yBAAiB,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,kBAAE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAQ,EAC/E,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,YAAG,aAAa,GAAG,EAAE,GAAQ,IAClD,IACF,CACP,CAAC;AACJ,CAAC;AAED;;6DAE6D;AAC7D,MAAM,UAAU,QAAQ,CAAC,EACvB,QAAQ,EACR,WAAW,EACX,KAAK,GAKN;IACC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,OAAO;IACL,4EAA4E;IAC5E,6EAA6E;IAC7E,qCAAqC;IACrC,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAC,QAAQ,aACzD,KAAC,MAAM,IAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAI,EAClD,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAC,QAAQ,YAAE,QAAQ,GAAO,EACvG,KAAC,SAAS,KAAG,IACT,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Intake wizard — walks the PM's clarifying questions one at a time. Single-choice
3
+ // questions use the menu; multi-choice use checkboxes. Every question offers
4
+ // "Something else…" (free text) and can be skipped.
5
+ import { useState } from "react";
6
+ import { Box, Text } from "ink";
7
+ import { MultiSelect } from "@inkjs/ui";
8
+ import { C, Panel, Menu as SelectInput, KeyHint, TextField as TextInput } from "./components.js";
9
+ const OTHER = "__other__";
10
+ const SKIP = "__skip__";
11
+ export function Intake({ questions, onDone, onCancel, }) {
12
+ const [i, setI] = useState(0);
13
+ const [answers, setAnswers] = useState([]);
14
+ const [typingPrefix, setTypingPrefix] = useState(null); // non-null = capturing free text
15
+ const [draft, setDraft] = useState("");
16
+ const q = questions[i];
17
+ const advance = (answer) => {
18
+ const next = [...answers, { question: q.question, answer }];
19
+ if (i + 1 < questions.length) {
20
+ setAnswers(next);
21
+ setI(i + 1);
22
+ setTypingPrefix(null);
23
+ setDraft("");
24
+ }
25
+ else {
26
+ onDone(next);
27
+ }
28
+ };
29
+ const progress = `Question ${i + 1} of ${questions.length}`;
30
+ // free-text capture (from "Something else…")
31
+ if (typingPrefix !== null) {
32
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: C.dim, children: progress }), _jsx(Text, { bold: true, wrap: "truncate-end", children: q.question }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: C.accent, children: "› " }), _jsx(TextInput, { value: draft, onChange: setDraft, onSubmit: () => advance([typingPrefix, draft].filter((s) => s.trim()).join(", ")) })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: C.dim, children: "Type your answer." }), _jsx(KeyHint, { hints: [{ keys: "Enter", label: "continue" }] })] })] }));
33
+ }
34
+ // multi-choice: checkboxes + then optional free text if "Something else…" picked
35
+ if (q.multi && q.options.length) {
36
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: C.textSubtle, children: progress }), _jsxs(Panel, { title: q.question, children: [_jsx(Text, { color: C.textMuted, children: "Pick any that apply." }), _jsx(MultiSelect, { options: [...q.options.map((o) => ({ label: o, value: o })), { label: "Something else…", value: OTHER }], onSubmit: (vals) => {
37
+ const picked = vals.filter((v) => v !== OTHER);
38
+ if (vals.includes(OTHER))
39
+ setTypingPrefix(picked.join(", "));
40
+ else
41
+ advance(picked.join(", "));
42
+ } }), _jsx(Box, { marginTop: 1, children: _jsx(KeyHint, { hints: [{ keys: "Space", label: "toggle" }, { keys: "Enter", label: "confirm" }] }) })] })] }));
43
+ }
44
+ // single-choice (or free-text-only when no options)
45
+ const items = [
46
+ ...q.options.map((o) => ({ label: o, value: o })),
47
+ { label: "Something else…", value: OTHER },
48
+ { label: "Skip", value: SKIP },
49
+ ];
50
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: C.dim, children: progress }), _jsx(Panel, { title: q.question, children: _jsx(SelectInput, { items: items, onSelect: (it) => {
51
+ if (it.value === OTHER)
52
+ setTypingPrefix("");
53
+ else if (it.value === SKIP)
54
+ advance("");
55
+ else
56
+ advance(it.value);
57
+ } }) }), _jsx(KeyHint, { hints: [{ keys: "Esc", label: "cancel & go back" }] })] }));
58
+ }
59
+ //# sourceMappingURL=Intake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Intake.js","sourceRoot":"","sources":["../../src/tui/Intake.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import Spinner from "ink-spinner";
4
+ import { Badge } from "@inkjs/ui";
5
+ import { C, ROLE_META } from "./components.js";
6
+ function columnOf(t, done) {
7
+ if (t.status === "done" || t.status === "skipped")
8
+ return "done";
9
+ if (t.status === "running" || t.status === "failed")
10
+ return "inProgress";
11
+ const ready = (t.dependsOn ?? []).every((d) => done.has(d));
12
+ return ready ? "notStarted" : "backlog";
13
+ }
14
+ const COLS = [
15
+ { key: "backlog", label: "BACKLOG", color: C.dim },
16
+ { key: "notStarted", label: "NOT STARTED", color: "cyan" },
17
+ { key: "inProgress", label: "IN PROGRESS", color: C.accent },
18
+ { key: "done", label: "DONE", color: C.good },
19
+ ];
20
+ /** Group tasks by epic, preserving first-seen order. */
21
+ export function groupByEpic(tasks) {
22
+ const order = [];
23
+ const map = new Map();
24
+ for (const t of tasks) {
25
+ const e = t.epic || "General";
26
+ if (!map.has(e)) {
27
+ map.set(e, []);
28
+ order.push(e);
29
+ }
30
+ map.get(e).push(t);
31
+ }
32
+ return order.map((epic) => ({ epic, tasks: map.get(epic) }));
33
+ }
34
+ function Card({ t }) {
35
+ const running = t.status === "running";
36
+ const failed = t.status === "failed";
37
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [running ? _jsxs(Text, { color: "cyan", children: [_jsx(Spinner, { type: "dots" }), " "] }) : failed ? _jsx(Text, { color: C.bad, children: "\u2717 " }) : null, _jsxs(Text, { children: [ROLE_META[t.capability].emoji, " "] }), _jsxs(Text, { color: C.dim, children: [t.id, " "] }), _jsx(Text, { color: C.accent, children: t.capability }), t.verdict ? _jsxs(Text, { children: [" ", _jsx(Badge, { color: t.verdict === "FAIL" ? "red" : t.verdict === "PASS*" ? "yellow" : "green", children: t.verdict })] }) : null, t.cost ? _jsxs(Text, { color: C.dim, children: [" $", t.cost.toFixed(2)] }) : null] }), _jsx(Text, { color: failed ? C.bad : C.text, wrap: "truncate-end", children: t.title }), t.assignee ? _jsx(Text, { color: C.dim, children: t.assignee }) : null, t.notes ? _jsxs(Text, { color: C.dim, wrap: "truncate-end", children: ["\u270E ", t.notes] }) : null] }));
38
+ }
39
+ /** mm:ss for a running card. */
40
+ function clock(sec) {
41
+ const m = Math.floor(sec / 60);
42
+ const s = sec % 60;
43
+ return `${m}:${String(s).padStart(2, "0")}`;
44
+ }
45
+ /** One-line card for the compact (live-build) board. */
46
+ function MiniCard({ t }) {
47
+ const running = t.status === "running";
48
+ return (_jsxs(Text, { wrap: "truncate-end", children: [running ? _jsxs(Text, { color: "cyan", children: [_jsx(Spinner, { type: "dots" }), " "] }) : t.status === "failed" ? _jsx(Text, { color: C.bad, children: "\u2717 " }) : _jsxs(Text, { children: [ROLE_META[t.capability].emoji, " "] }), _jsxs(Text, { color: C.dim, children: [t.id, " "] }), _jsx(Text, { color: running ? "cyan" : C.text, wrap: "truncate-end", children: t.title }), running && t.elapsedSec !== undefined ? _jsxs(Text, { color: t.stuck ? C.warn : C.dim, children: [" ", clock(t.elapsedSec), t.stuck ? " slow" : ""] }) : null, t.cost ? _jsxs(Text, { color: C.dim, children: [" $", t.cost.toFixed(2)] }) : null] }));
49
+ }
50
+ /** Compact 4-column board (no epic swimlanes, one-line cards, per-column cap) —
51
+ * for the live build screen where height must fit the viewport. */
52
+ export function Kanban({ tasks, compact, maxPerCol }) {
53
+ const done = new Set(tasks.filter((t) => t.status === "done" || t.status === "skipped").map((t) => t.id));
54
+ const counts = { backlog: 0, notStarted: 0, inProgress: 0, done: 0 };
55
+ for (const t of tasks)
56
+ counts[columnOf(t, done)]++;
57
+ if (compact) {
58
+ const byCol = { backlog: [], notStarted: [], inProgress: [], done: [] };
59
+ for (const t of tasks)
60
+ byCol[columnOf(t, done)].push(t);
61
+ const cap = Math.max(2, maxPerCol ?? 6);
62
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: COLS.map((col) => (_jsx(Box, { flexBasis: "25%", flexGrow: 1, marginRight: 1, children: _jsxs(Text, { color: col.color, bold: true, children: [col.label, " ", _jsx(Text, { color: C.dim, children: counts[col.key] })] }) }, col.key))) }), _jsx(Box, { marginTop: 1, children: COLS.map((col) => {
63
+ const list = byCol[col.key];
64
+ return (_jsxs(Box, { flexDirection: "column", flexBasis: "25%", flexGrow: 1, marginRight: 1, children: [list.length === 0 ? _jsx(Text, { color: C.dim, children: "\u00B7" }) : null, list.slice(0, cap).map((t) => _jsx(MiniCard, { t: t }, t.id)), list.length > cap ? _jsxs(Text, { color: C.dim, children: ["+", list.length - cap, " more"] }) : null] }, col.key));
65
+ }) })] }));
66
+ }
67
+ const lanes = groupByEpic(tasks);
68
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Box, { width: 12 }), COLS.map((col) => (_jsx(Box, { flexBasis: "25%", flexGrow: 1, marginRight: 1, children: _jsxs(Text, { color: col.color, bold: true, children: [col.label, " ", _jsx(Text, { color: C.dim, children: counts[col.key] })] }) }, col.key)))] }), lanes.map((lane) => {
69
+ const byCol = { backlog: [], notStarted: [], inProgress: [], done: [] };
70
+ for (const t of lane.tasks)
71
+ byCol[columnOf(t, done)].push(t);
72
+ return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: C.accent, children: ["\u258A ", lane.epic] }), _jsxs(Box, { children: [_jsx(Box, { width: 12 }), COLS.map((col) => (_jsx(Box, { flexDirection: "column", flexBasis: "25%", flexGrow: 1, marginRight: 1, children: byCol[col.key].length === 0 ? _jsx(Text, { color: C.dim, children: "\u00B7" }) : byCol[col.key].map((t) => _jsx(Card, { t: t }, t.id)) }, col.key)))] })] }, lane.epic));
73
+ })] }));
74
+ }
75
+ //# sourceMappingURL=Kanban.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Kanban.js","sourceRoot":"","sources":["../../src/tui/Kanban.tsx"],"names":[],"mappings":"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"}