export interface EpisodeStatus { episode: number; title?: string; hasScript: boolean; shotCount: number; scriptApproved: boolean; qaReported: boolean; qaApproved: boolean; /** video-qa-report.json exists (post-render QA on the rendered units). */ videoQaReported: boolean; panelCount: number; videoCount: number; hasMusic: boolean; dialogueCount: number; hasFinalCut: boolean; /** Short stage name, e.g. 'storyboard', 'qa gate', 'rendering'. */ stage: string; /** Literal command to run next, or undefined when the episode is done. */ nextCommand?: string; /** * Loop mode is a gate-skipping alternate path (see PIPELINE_BRANCHES): the * moment a shot script exists, `venice-video loop` can render + watch/gather * takes without the storyboard/QA gates. `status` surfaces it so an agent * following "next command" learns the branch exists. */ loopAvailable: boolean; } export interface ProjectStatus { projectDir: string; name: string; slug: string; aestheticSet: boolean; characterCount: number; lockedVoiceCount: number; locationCount: number; episodes: EpisodeStatus[]; /** Command to run next at the project level (aesthetic, cast) if any. */ nextCommand?: string; /** * The `loop` command for the first episode with a shot script, if any. An * alternate path to the linear `nextCommand`, not a replacement for it. */ loopCommand?: string; } /** * Turn a shell-form suggestion (`qa-storyboard -e 3`) into one that also works * pasted into a plain terminal (`qa-storyboard -p "