import type { ReadinessReport } from "./readiness.js"; export type PlanEffort = "S" | "M" | "L"; export interface PlanLocation { line: number; excerpt: string; } export interface PlanWorkItem { /** File (abapGit-style) the work happens in. */ object: string; /** Readiness category (or "broken-at-baseline" / "released-api"). */ category: string; effort: PlanEffort; /** Total findings behind this item (locations is a sample). */ findingCount: number; recipe: string; /** Curated before/after skeleton of the canonical Cloud rewrite, when one exists. */ example?: { before: string; after: string; }; /** Up to five sample locations; findingCount carries the full total. */ locations: PlanLocation[]; } export interface PlanPhase { /** 1-based position in execution order. */ phase: number; kind: "baseline" | "migration" | "released-api"; title: string; goal: string; /** Highest effort band among the phase's items. */ effort: PlanEffort; itemCount: number; findingCount: number; items: PlanWorkItem[]; /** Objective, re-checkable condition for calling the phase done. */ exitCriteria: string; } export interface MigrationPlan { summary: { verdict: ReadinessReport["verdict"]; score: number; grade: ReadinessReport["grade"]; cloudBlockerCount: number; fileCount: number; phaseCount: number; workItemCount: number; /** Effort-band tally across all work items, e.g. "3×S, 2×M, 1×L". */ estimatedEffort: string; }; phases: PlanPhase[]; /** How to execute an item and prove it: the fix → compare → re-check loop. */ suggestedLoop: string; releasedApiSnapshotDate: string; scopeNote: string; } /** * Arrange a readiness report into the phased migration backlog. Deterministic: * the same report always yields the same plan; every findingCount sums back to * the report's own numbers (migration phases ↔ cloudBlockerCount). */ export declare function planCloudMigration(report: ReadinessReport): MigrationPlan;