import type { PipelineState, DecisionEntry, MetaPromptFile } from '../types/index.js'; export interface DashboardStep { slug: string; status: 'completed' | 'skipped' | 'pending' | 'in_progress'; phase: string | null; depth: number | null; completedAt: string | null; completedBy: string | null; description: string; summary: string | null; dependencies: string[]; outputs: string[]; order: number | null; conditional: 'if-needed' | null; metaPromptBody: string; } export interface DashboardPhase { number: number; slug: string; displayName: string; description: string; steps: DashboardStep[]; counts: { completed: number; skipped: number; pending: number; inProgress: number; total: number; }; } export interface DashboardDecision { id: string; step: string; decision: string; timestamp: string; provisional: boolean; } export interface DashboardData { generatedAt: string; methodology: string; scaffoldVersion: string; phases: DashboardPhase[]; steps: DashboardStep[]; progress: { total: number; completed: number; skipped: number; pending: number; inProgress: number; percentage: number; }; nextEligible: { slug: string; summary: string | null; description: string; command: string; } | null; decisions: DashboardDecision[]; } export interface GeneratorOptions { state: PipelineState; decisions: DecisionEntry[]; methodology: string; metaPrompts?: Map; } export declare function generateDashboardData(opts: GeneratorOptions): DashboardData; export declare function generateHtml(data: DashboardData): string; /** A node in the service dependency graph. One per service. */ export interface DependencyGraphNode { /** Service name (kebab-case, matches config). */ name: string; /** Project type — used for styling consistency with service cards. */ projectType: string; /** Depth in the topological ordering (0 = no upstream or orphan). */ layer: number; /** Layout-computed x,y in the SVG viewBox. Filled by layoutGraph, not the builder. */ x: number; y: number; } /** A step-level cross-read relationship, aggregated into a service-level edge. */ export interface StepEdgeDetail { consumerStep: string; producerStep: string; /** Readiness from CrossReadStatus taxonomy (src/core/assembly/cross-reads.ts:177). * service-unknown is filtered upstream (§2.1 of spec) so cannot appear here in practice. */ status: 'completed' | 'pending' | 'not-bootstrapped' | 'read-error' | 'service-unknown' | 'not-exported'; } /** A service-level aggregate edge: consumer depends on producer. */ export interface DependencyGraphEdge { consumer: string; producer: string; /** Step-level detail rolled up into this edge — rendered as tooltip rows. */ steps: StepEdgeDetail[]; /** SVG path string (cubic bezier) computed by layoutGraph. */ svgPath: string; } export interface DependencyGraphData { nodes: DependencyGraphNode[]; edges: DependencyGraphEdge[]; /** SVG viewBox dimensions — computed by layoutGraph. */ viewBox: { width: number; height: number; }; } export interface ServiceSummary { /** Service id from config (kebab-case). */ name: string; /** Project type — backend / web-app / library / etc. */ projectType: string; /** (completed + skipped) / total, 0-100. */ percentage: number; completed: number; skipped: number; pending: number; inProgress: number; total: number; /** Lowest-numbered phase with at least one pending or in_progress step. Null if pipeline complete. */ currentPhaseNumber: number | null; /** Display name of the current phase. Null if complete. */ currentPhaseName: string | null; /** state.next_eligible[0] or null. */ nextEligibleSlug: string | null; /** Meta-prompt frontmatter.summary (fallback: description) of the next eligible step. */ nextEligibleSummary: string | null; } export interface MultiServiceAggregate { totalServices: number; /** Mean of service percentages, rounded. 0 for empty input. */ averagePercentage: number; /** Count of services at 100%. */ servicesComplete: number; /** * Service count that has reached or passed each phase. A service "reached" * phase N if it has any step in phase N that is completed or skipped. */ servicesByPhase: Array<{ phaseSlug: string; phaseName: string; phaseNumber: number; reachedCount: number; }>; } export interface MultiServiceDashboardData { generatedAt: string; methodology: string; scaffoldVersion: string; /** Preserves input order. */ services: ServiceSummary[]; aggregate: MultiServiceAggregate; /** * Optional. null or absent when zero cross-service edges exist (graph * section omitted per §4). Optional (not required-nullable) preserves * source compatibility with hand-written literals in multi-service.test.ts. */ dependencyGraph?: DependencyGraphData | null; } export interface MultiServiceGeneratorOptions { services: Array<{ name: string; projectType: string; state: PipelineState; metaPrompts?: Map; }>; methodology: string; /** Optional. Pass pre-built DependencyGraphData; generator normalizes null/undefined to null on output. */ dependencyGraph?: DependencyGraphData | null; } export declare function generateMultiServiceDashboardData(opts: MultiServiceGeneratorOptions): MultiServiceDashboardData; export declare function generateMultiServiceHtml(data: MultiServiceDashboardData): string; //# sourceMappingURL=generator.d.ts.map