/** * The projection planner. Pure — and the purity is the point. * * This module imports no `node:fs`, no `node:child_process`, and not `gh.ts`. A test * pins that over the import graph, which is what makes "planning needs no network" a * property of the code rather than a claim about the test suite: hand the command a * runner that throws on every invocation and planning still succeeds, because the * planner never had one. * * Refusals are **values**, in a fixed order, so a tree with two problems always yields * the same message and the command layer — not this module — decides the exit code. * * Requirements: roadmap-issue-projection/AC-14 … roadmap-issue-projection/AC-32, * roadmap-issue-projection/AC-44 * * @module */ import { type BodyContext } from './body.js'; import type { SyncConfig } from './config.js'; import { type ProjectedMilestone, type RemoteMilestone } from './milestone-projection.js'; import { type Plan, type PlanLine, type ProjectableItem, type RemoteIssue, type UnprojectableRef } from './types.js'; /** GitHub's own issue-title limit. */ export declare const MAX_ISSUE_TITLE_LENGTH = 256; export interface PlanInput { config: SyncConfig; items: readonly ProjectableItem[]; unprojectable: readonly UnprojectableRef[]; issues: readonly RemoteIssue[]; retireIneligible: boolean; /** Printed in the plan header and the prompt. */ repoLabel: string; /** * Everything body rendering needs. Required rather than defaulted: a silent default * would render every body with no permalinks and no reference links, and nothing * anywhere would say so. */ bodyContext: BodyContext; /** * Milestones, while `milestones.yaml` is on. Absent is off: no milestone line, no refusal * and no issue milestone compared, so the plan is today's byte for byte * (github-milestones/AC-15). Arrives as data so this module still reads no file. */ milestones?: MilestoneInput; } export interface MilestoneInput { /** File order. */ wanted: readonly ProjectedMilestone[]; /** Item id → the milestone id it sits under, null for Unassigned. */ assigned: ReadonlyMap; remote: readonly RemoteMilestone[]; } export type PlanResult = { kind: 'ok'; plan: Plan; warnings: readonly string[]; } | { kind: 'refused'; error: string; }; export declare function planProjection(input: PlanInput): PlanResult; /** A line about a milestone itself, not about an issue's milestone. */ export declare function isMilestoneLine(l: PlanLine): boolean; //# sourceMappingURL=plan.d.ts.map