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

@@ -36,9 +36,10 @@ pub struct PipelineState {
pub current: Vec<UpcomingStory>,
pub qa: Vec<UpcomingStory>,
pub merge: Vec<UpcomingStory>,
pub done: Vec<UpcomingStory>,
}
/// Load the full pipeline state (all 4 active stages).
/// Load the full pipeline state (all 5 active stages).
pub fn load_pipeline_state(ctx: &AppContext) -> Result<PipelineState, String> {
let agent_map = build_active_agent_map(ctx);
Ok(PipelineState {
@@ -46,6 +47,7 @@ pub fn load_pipeline_state(ctx: &AppContext) -> Result<PipelineState, String> {
current: load_stage_items(ctx, "2_current", &agent_map)?,
qa: load_stage_items(ctx, "3_qa", &agent_map)?,
merge: load_stage_items(ctx, "4_merge", &agent_map)?,
done: load_stage_items(ctx, "5_done", &HashMap::new())?,
})
}
@@ -607,6 +609,7 @@ mod tests {
("2_current", "20_story_current"),
("3_qa", "30_story_qa"),
("4_merge", "40_story_merge"),
("5_done", "50_story_done"),
] {
let dir = root.join(".story_kit").join("work").join(stage);
fs::create_dir_all(&dir).unwrap();
@@ -631,6 +634,9 @@ mod tests {
assert_eq!(state.merge.len(), 1);
assert_eq!(state.merge[0].story_id, "40_story_merge");
assert_eq!(state.done.len(), 1);
assert_eq!(state.done[0].story_id, "50_story_done");
}
#[test]