Spike 61: filesystem watcher and UI simplification

Add notify-based filesystem watcher for .story_kit/work/ that
auto-commits changes with deterministic messages and broadcasts
events over WebSocket. Push full pipeline state (Upcoming, Current,
QA, To Merge) to frontend on connect and after every watcher event.

Strip dead UI: remove ReviewPanel, GatePanel, TodoPanel,
UpcomingPanel and all associated REST polling. Replace with 4
generic StagePanel components driven by WebSocket. Simplify
AgentPanel to roster-only.

Delete all 11 workflow HTTP endpoints and 16 request/response types
from the server. Clean dead code from workflow module. MCP tools
call Rust functions directly and need none of the HTTP layer.

Net: ~4,100 lines deleted, ~400 added.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dave
2026-02-20 19:39:19 +00:00
parent 65b104edc5
commit 810608d3d8
29 changed files with 1041 additions and 4526 deletions

View File

@@ -58,13 +58,7 @@ describe("AgentPanel diff command", () => {
];
mockedAgents.listAgents.mockResolvedValue(agentList);
render(
<AgentPanel
stories={[
{ story_id: "33_diff_commands", name: "Diff Commands", error: null },
]}
/>,
);
render(<AgentPanel />);
// Expand the agent detail by clicking the expand button
const expandButton = await screen.findByText("▶");
@@ -99,13 +93,7 @@ describe("AgentPanel diff command", () => {
];
mockedAgents.listAgents.mockResolvedValue(agentList);
render(
<AgentPanel
stories={[
{ story_id: "33_diff_commands", name: "Diff Commands", error: null },
]}
/>,
);
render(<AgentPanel />);
const expandButton = await screen.findByText("▶");
await userEvent.click(expandButton);
@@ -135,13 +123,7 @@ describe("AgentPanel diff command", () => {
];
mockedAgents.listAgents.mockResolvedValue(agentList);
render(
<AgentPanel
stories={[
{ story_id: "33_diff_commands", name: "Diff Commands", error: null },
]}
/>,
);
render(<AgentPanel />);
const expandButton = await screen.findByText("▶");
await userEvent.click(expandButton);
@@ -164,13 +146,7 @@ describe("AgentPanel diff command", () => {
];
mockedAgents.listAgents.mockResolvedValue(agentList);
render(
<AgentPanel
stories={[
{ story_id: "33_diff_commands", name: "Diff Commands", error: null },
]}
/>,
);
render(<AgentPanel />);
const expandButton = await screen.findByText("▶");
await userEvent.click(expandButton);