story-kit: merge 166_story_add_done_column_to_pipeline_board

Add Done column to pipeline board. Adds the 'done' stage to
PipelineState, exposes it via the WebSocket and REST API, and
renders a Done column in the frontend pipeline board view.

Squash merge from feature/story-166_story_add_done_column_to_pipeline_board.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dave
2026-02-24 23:42:59 +00:00
parent d442dbeae8
commit 150f654e04
6 changed files with 29 additions and 1 deletions

View File

@@ -266,6 +266,7 @@ describe("ChatWebSocket", () => {
current: [],
qa: [],
merge: [],
done: [],
};
instances[1].simulateMessage({ type: "pipeline_state", ...freshState });

View File

@@ -32,6 +32,7 @@ export interface PipelineState {
current: PipelineStageItem[];
qa: PipelineStageItem[];
merge: PipelineStageItem[];
done: PipelineStageItem[];
}
export type WsResponse =
@@ -45,6 +46,7 @@ export type WsResponse =
current: PipelineStageItem[];
qa: PipelineStageItem[];
merge: PipelineStageItem[];
done: PipelineStageItem[];
}
| {
type: "permission_request";
@@ -346,6 +348,7 @@ export class ChatWebSocket {
current: data.current,
qa: data.qa,
merge: data.merge,
done: data.done,
});
if (data.type === "permission_request")
this.onPermissionRequest?.(

View File

@@ -72,6 +72,7 @@ export function Chat({ projectPath, onCloseProject }: ChatProps) {
current: [],
qa: [],
merge: [],
done: [],
});
const [claudeSessionId, setClaudeSessionId] = useState<string | null>(null);
const [activityStatus, setActivityStatus] = useState<string | null>(null);
@@ -1074,6 +1075,7 @@ export function Chat({ projectPath, onCloseProject }: ChatProps) {
stateVersion={agentStateVersion}
/>
<StagePanel title="Done" items={pipeline.done} />
<StagePanel title="To Merge" items={pipeline.merge} />
<StagePanel title="QA" items={pipeline.qa} />
<StagePanel title="Current" items={pipeline.current} />

View File

@@ -13,6 +13,7 @@ function makePipeline(overrides: Partial<PipelineState> = {}): PipelineState {
current: [],
qa: [],
merge: [],
done: [],
...overrides,
};
}