singularity-forge/web/lib/workspace-status.ts
ace-pm 35dc87ef53 chore: sync workspace state after rebrand
- 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>
2026-04-15 14:54:20 +02:00

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"
}