Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d2b97c7
spec: TUI supervision hero surface design (#193)
windoliver May 16, 2026
b62aec4
spec(193): use real theme keys for state colors
windoliver May 16, 2026
200cdd6
plan: TUI supervision hero implementation (#193)
windoliver May 16, 2026
32afd78
tui/supervision: types + configurable thresholds (#193)
windoliver May 16, 2026
8bcd642
tui/supervision: rename FleetSummary count fields; drop path headers
windoliver May 16, 2026
4709ff6
tui/supervision: classifyAgent pure heuristics (#193)
windoliver May 16, 2026
a6c9d29
tui/supervision: document classifier invariants; thrashing primary-re…
windoliver May 16, 2026
3ec96d6
tui/supervision: summarize() fleet aggregation (#193)
windoliver May 16, 2026
0720602
tui/supervision: fleet aggregator hook + buildSupervisedFleet (#193)
windoliver May 16, 2026
49ded17
tui/supervision: approval queue adapter (#193)
windoliver May 16, 2026
761dd78
tui/supervision: keyboard router with precedence (#193)
windoliver May 16, 2026
bcfe533
tui/supervision: AgentCard component (#193)
windoliver May 16, 2026
bfd550a
tui/supervision: AgentGrid + moveCursor (#193)
windoliver May 16, 2026
d8ede69
tui/supervision: FleetBanner with state counts + approval chip (#193)
windoliver May 16, 2026
09a7eae
tui/supervision: DrillDock + DrillTabs + scoped DrillFeed (#193)
windoliver May 16, 2026
544a768
tui/supervision: ApprovalModal (#193)
windoliver May 16, 2026
72d68b5
tui/supervision: SupervisionScreen shell + state wiring (#193)
windoliver May 16, 2026
26916ee
tui/supervision: register screen behind GROVE_TUI_SUPERVISION env fla…
windoliver May 16, 2026
5b4a5ea
tui/supervision: integration tests — snapshot + keyboard e2e (#193)
windoliver May 16, 2026
0eb4661
tui/supervision: wire real approval handlers from useAgentMonitor (#193)
windoliver May 16, 2026
c48ae8b
tui: SupervisionScreen replaces running-view as default (#193)
windoliver May 16, 2026
e662827
tui: retire running-view surface files and wire supervision-hints (#193)
windoliver May 16, 2026
bf4bfa4
tui/supervision: wire onBack through SupervisionScreen (#193)
windoliver May 16, 2026
a1962cd
tui/supervision: real-grove e2e harness skeleton (#193)
windoliver May 16, 2026
dd76686
tui/supervision: retarget typed-acp tmux E2E predicates for Supervisi…
windoliver May 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3,382 changes: 3,382 additions & 0 deletions docs/superpowers/plans/2026-05-15-tui-supervision-hero.md

Large diffs are not rendered by default.

453 changes: 453 additions & 0 deletions docs/superpowers/specs/2026-05-15-tui-supervision-hero-design.md

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions src/tui/components/pages-router.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -292,9 +292,9 @@ describe("PagesRouter rendering", () => {
);
});

// Running hints visible
expect(JSON.stringify(renderer.toJSON())).toContain("[:]");
expect(JSON.stringify(renderer.toJSON())).toContain("Goto");
// Running hints visible (SupervisionScreen hints — successor to RUNNING_VIEW_HINTS)
expect(JSON.stringify(renderer.toJSON())).toContain("[h/j/k/l]");
expect(JSON.stringify(renderer.toJSON())).toContain("Move");
expect(JSON.stringify(renderer.toJSON())).toContain("[/]");
expect(JSON.stringify(renderer.toJSON())).toContain("Filter");

Expand All @@ -314,11 +314,11 @@ describe("PagesRouter rendering", () => {
expect(dagFlat).toContain("[L]");
expect(dagFlat).toContain("Logs");

// Pop → running hints again
// Pop → running hints again (supervision hints)
await act(async () => {
store.pop();
});
expect(JSON.stringify(renderer.toJSON())).toContain("Goto");
expect(JSON.stringify(renderer.toJSON())).toContain("Move");

renderer.unmount();
});
Expand Down
4 changes: 2 additions & 2 deletions src/tui/data/hint-map.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { INSPECT_HINTS } from "../views/inspect-hints.js";
import { LAUNCH_PREVIEW_HINTS } from "../views/launch-preview-hints.js";
import { PANEL_HINTS } from "../views/panel-hints.js";
import { PRESET_SELECT_HINTS } from "../views/preset-select-hints.js";
import { RUNNING_VIEW_HINTS } from "../views/running-view-hints.js";
import { SUPERVISION_HINTS } from "../views/supervision/supervision-hints.js";
import type { Page } from "./pages-store.js";

// ---------------------------------------------------------------------------
Expand Down Expand Up @@ -71,7 +71,7 @@ const STATIC: Readonly<Record<string, readonly KeyAction[]>> = Object.freeze({
// fall back to DEFAULT_HINTS here because [?]Help and [q]Quit are
// also unwired on this screen.
spawning: Object.freeze([]),
running: RUNNING_VIEW_HINTS,
running: SUPERVISION_HINTS,
complete: COMPLETE_HINTS,
inspect: INSPECT_HINTS,

Expand Down
44 changes: 40 additions & 4 deletions src/tui/hooks/use-session-persistence.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,50 @@ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
import { dirname, join } from "node:path";
import { useCallback, useEffect, useRef, useState } from "react";
import type { ZoomLevel } from "../panels/panel-registry.js";
import type { RunningPanel } from "../screens/running-keyboard.js";

// ---------------------------------------------------------------------------
// Types
// ---------------------------------------------------------------------------

/**
* Legacy numeric values from the deleted RunningPanel enum.
* Used only in the migration shim inside readViewState().
*/
type LegacyRunningPanelNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;

/** String identifiers for the drill panel — successor to the numeric RunningPanel enum. */
export type DrillTab =
| "feed"
| "agents"
| "dag"
| "terminal"
| "trace"
| "handoffs"
| "sessions"
| "tasks"
| "reviews";

/**
* Map legacy RunningPanel numeric enum values to DrillTab string identifiers.
* Values not listed here return undefined (panel collapsed).
*/
function migrateRunningPanel(n: number): DrillTab | undefined {
switch (n as LegacyRunningPanelNumber) {
case 0:
return "feed";
case 2:
return "dag";
case 3:
return "terminal";
default:
return undefined;
}
}

/** Per-session TUI view state that is persisted and restored on resume. */
export interface TuiViewState {
/** Which panel is currently focused/expanded, or null for feed-only. */
readonly expandedPanel?: RunningPanel | null | undefined;
readonly expandedPanel?: DrillTab | null | undefined;
/** Zoom level of the expanded panel. */
readonly zoomLevel?: ZoomLevel | undefined;
/** Index of the selected agent in the trace view. */
Expand Down Expand Up @@ -82,8 +116,10 @@ export async function readViewState(
json.expandedPanel === null
? null
: typeof json.expandedPanel === "number"
? (json.expandedPanel as RunningPanel)
: undefined,
? migrateRunningPanel(json.expandedPanel)
: typeof json.expandedPanel === "string"
? (json.expandedPanel as DrillTab)
: undefined,
zoomLevel: typeof json.zoomLevel === "string" ? (json.zoomLevel as ZoomLevel) : undefined,
traceSelectedAgent:
typeof json.traceSelectedAgent === "number" ? json.traceSelectedAgent : undefined,
Expand Down
63 changes: 0 additions & 63 deletions src/tui/screens/running-cmd-mode.test.ts

This file was deleted.

44 changes: 0 additions & 44 deletions src/tui/screens/running-cmd-mode.ts

This file was deleted.

Loading
Loading