- Rebrand commits already in history (gsd → forge) - Sync pre-existing doc, docker, and CI config updates - All rebrand artifacts verified in place: * Native crates: forge-engine, forge-ast, forge-grep * Log prefixes: [forge] across 22+ files * Binary: ~/bin/sf-run * Workspace scopes: @sf-run/*, @singularity-forge/* * Nix flake: Rust toolchain ready System ready for: nix develop && bun run build:native Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import type {
|
|
WorkspaceMilestoneTarget,
|
|
WorkspaceSliceTarget,
|
|
WorkspaceTaskTarget,
|
|
} from "./workspace-types.js"
|
|
|
|
export type ItemStatus = "done" | "in-progress" | "pending"
|
|
|
|
export function getMilestoneStatus(
|
|
milestone: WorkspaceMilestoneTarget,
|
|
active: { milestoneId?: string },
|
|
): ItemStatus {
|
|
// Prefer authoritative milestone status from SF state registry (#2807)
|
|
if (milestone.status) {
|
|
switch (milestone.status) {
|
|
case "complete":
|
|
return "done"
|
|
case "active":
|
|
return "in-progress"
|
|
case "pending":
|
|
case "parked":
|
|
return "pending"
|
|
}
|
|
}
|
|
|
|
// Fallback: infer from slice completion (legacy / no status field)
|
|
if (milestone.slices.length > 0 && milestone.slices.every((slice: WorkspaceSliceTarget) => slice.done)) {
|
|
return "done"
|
|
}
|
|
if (active.milestoneId === milestone.id) {
|
|
return "in-progress"
|
|
}
|
|
return milestone.slices.some((slice: WorkspaceSliceTarget) => slice.done) ? "in-progress" : "pending"
|
|
}
|
|
|
|
export function getSliceStatus(
|
|
milestoneId: string,
|
|
slice: WorkspaceSliceTarget,
|
|
active: { milestoneId?: string; sliceId?: string },
|
|
): ItemStatus {
|
|
if (slice.done) return "done"
|
|
if (active.milestoneId === milestoneId && active.sliceId === slice.id) return "in-progress"
|
|
return "pending"
|
|
}
|
|
|
|
export function getTaskStatus(
|
|
milestoneId: string,
|
|
sliceId: string,
|
|
task: WorkspaceTaskTarget,
|
|
active: { milestoneId?: string; sliceId?: string; taskId?: string },
|
|
): ItemStatus {
|
|
if (task.done) return "done"
|
|
if (active.milestoneId === milestoneId && active.sliceId === sliceId && active.taskId === task.id) return "in-progress"
|
|
return "pending"
|
|
}
|