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.
- package/README.md +30 -11
- package/bin/projectinator.mjs +56 -11
- package/dist/bakeoff.js +163 -0
- package/dist/bakeoff.js.map +1 -0
- package/dist/build-state.js +26 -0
- package/dist/build-state.js.map +1 -0
- package/dist/burndown.js +19 -0
- package/dist/burndown.js.map +1 -0
- package/dist/calibration.js +86 -0
- package/dist/calibration.js.map +1 -0
- package/dist/cli.js +289 -0
- package/dist/cli.js.map +1 -0
- package/dist/cost.js +35 -0
- package/dist/cost.js.map +1 -0
- package/dist/council.js +147 -0
- package/dist/council.js.map +1 -0
- package/dist/demo.js +93 -0
- package/dist/demo.js.map +1 -0
- package/dist/estimate.js +98 -0
- package/dist/estimate.js.map +1 -0
- package/dist/executor.js +118 -0
- package/dist/executor.js.map +1 -0
- package/dist/git.js +82 -0
- package/dist/git.js.map +1 -0
- package/dist/intake.js +98 -0
- package/dist/intake.js.map +1 -0
- package/dist/models.js +171 -0
- package/dist/models.js.map +1 -0
- package/dist/narrate.js +76 -0
- package/dist/narrate.js.map +1 -0
- package/dist/openrouter.js +112 -0
- package/dist/openrouter.js.map +1 -0
- package/dist/orchestrator.js +273 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/pm.js +245 -0
- package/dist/pm.js.map +1 -0
- package/dist/preview.js +194 -0
- package/dist/preview.js.map +1 -0
- package/dist/registry-store.js +38 -0
- package/dist/registry-store.js.map +1 -0
- package/dist/registry.js +115 -0
- package/dist/registry.js.map +1 -0
- package/dist/research.js +98 -0
- package/dist/research.js.map +1 -0
- package/dist/retro.js +83 -0
- package/dist/retro.js.map +1 -0
- package/dist/roles.js +357 -0
- package/dist/roles.js.map +1 -0
- package/dist/router.js +95 -0
- package/dist/router.js.map +1 -0
- package/dist/run-bakeoff.js +68 -0
- package/dist/run-bakeoff.js.map +1 -0
- package/dist/run-build.js +193 -0
- package/dist/run-build.js.map +1 -0
- package/{src/run-dev.ts → dist/run-dev.js} +23 -39
- package/dist/run-dev.js.map +1 -0
- package/{src/run-pm.ts → dist/run-pm.js} +34 -46
- package/dist/run-pm.js.map +1 -0
- package/{src/run-research.ts → dist/run-research.js} +19 -30
- package/dist/run-research.js.map +1 -0
- package/{src/run-scout.ts → dist/run-scout.js} +17 -27
- package/dist/run-scout.js.map +1 -0
- package/dist/run-web.js +93 -0
- package/dist/run-web.js.map +1 -0
- package/dist/scout.js +81 -0
- package/dist/scout.js.map +1 -0
- package/dist/session-cost.js +15 -0
- package/dist/session-cost.js.map +1 -0
- package/dist/stack.js +34 -0
- package/dist/stack.js.map +1 -0
- package/dist/stuck.js +21 -0
- package/dist/stuck.js.map +1 -0
- package/dist/tui/App.js +1269 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/BakeOff.js +95 -0
- package/dist/tui/BakeOff.js.map +1 -0
- package/dist/tui/BoardEditor.js +183 -0
- package/dist/tui/BoardEditor.js.map +1 -0
- package/dist/tui/EditableBoard.js +140 -0
- package/dist/tui/EditableBoard.js.map +1 -0
- package/dist/tui/Frame.js +78 -0
- package/dist/tui/Frame.js.map +1 -0
- package/dist/tui/Intake.js +59 -0
- package/dist/tui/Intake.js.map +1 -0
- package/dist/tui/Kanban.js +75 -0
- package/dist/tui/Kanban.js.map +1 -0
- package/dist/tui/Settings.js +299 -0
- package/dist/tui/Settings.js.map +1 -0
- package/dist/tui/StackPick.js +44 -0
- package/dist/tui/StackPick.js.map +1 -0
- package/dist/tui/WebAccounts.js +131 -0
- package/dist/tui/WebAccounts.js.map +1 -0
- package/dist/tui/components.js +178 -0
- package/dist/tui/components.js.map +1 -0
- package/dist/tui/config.js +129 -0
- package/dist/tui/config.js.map +1 -0
- package/dist/tui/deploy.js +114 -0
- package/dist/tui/deploy.js.map +1 -0
- package/dist/tui/engine.js +710 -0
- package/dist/tui/engine.js.map +1 -0
- package/dist/tui/notify.js +47 -0
- package/dist/tui/notify.js.map +1 -0
- package/dist/tui/panels.js +42 -0
- package/dist/tui/panels.js.map +1 -0
- package/dist/tui/templates.js +106 -0
- package/dist/tui/templates.js.map +1 -0
- package/dist/tui/theme.js +42 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/validate.js +51 -0
- package/dist/tui/validate.js.map +1 -0
- package/{src/tui.tsx → dist/tui.js} +23 -33
- package/dist/tui.js.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/web/oauth-anthropic.js +179 -0
- package/dist/web/oauth-anthropic.js.map +1 -0
- package/dist/web/session.js +274 -0
- package/dist/web/session.js.map +1 -0
- package/package.json +5 -4
- package/src/bakeoff.ts +0 -214
- package/src/build-state.ts +0 -47
- package/src/burndown.ts +0 -35
- package/src/calibration.ts +0 -88
- package/src/cost.ts +0 -43
- package/src/council.ts +0 -175
- package/src/demo.ts +0 -106
- package/src/estimate.ts +0 -111
- package/src/executor.ts +0 -169
- package/src/git.ts +0 -72
- package/src/intake.ts +0 -125
- package/src/models.ts +0 -175
- package/src/narrate.ts +0 -87
- package/src/openrouter.ts +0 -119
- package/src/orchestrator.ts +0 -310
- package/src/pm.ts +0 -302
- package/src/preview.ts +0 -206
- package/src/registry-store.ts +0 -41
- package/src/registry.ts +0 -132
- package/src/research.ts +0 -123
- package/src/retro.ts +0 -99
- package/src/roles.ts +0 -401
- package/src/router.ts +0 -120
- package/src/run-bakeoff.ts +0 -77
- package/src/run-build.ts +0 -203
- package/src/run-web.ts +0 -87
- package/src/scout.ts +0 -121
- package/src/session-cost.ts +0 -17
- package/src/stack.ts +0 -46
- package/src/tui/App.tsx +0 -1760
- package/src/tui/BakeOff.tsx +0 -190
- package/src/tui/BoardEditor.tsx +0 -260
- package/src/tui/EditableBoard.tsx +0 -179
- package/src/tui/Frame.tsx +0 -142
- package/src/tui/Intake.tsx +0 -111
- package/src/tui/Kanban.tsx +0 -158
- package/src/tui/Settings.tsx +0 -513
- package/src/tui/StackPick.tsx +0 -79
- package/src/tui/WebAccounts.tsx +0 -197
- package/src/tui/components.tsx +0 -340
- package/src/tui/config.ts +0 -150
- package/src/tui/deploy.ts +0 -137
- package/src/tui/engine.ts +0 -749
- package/src/tui/notify.ts +0 -21
- package/src/tui/panels.tsx +0 -89
- package/src/tui/templates.ts +0 -119
- package/src/tui/theme.ts +0 -44
- package/src/tui/validate.ts +0 -53
- package/src/types.ts +0 -208
- package/src/web/oauth-anthropic.ts +0 -206
- 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":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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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"}
|