/**
 * Shared helpers for the roster exporters.
 *
 * Exporters are deterministic and Dataset-free: they read the Roster only and
 * regenerate format-specific decoration (display names, Char-slot numbering,
 * displayed unit totals) from what's stored. Anything the Roster doesn't model
 * — char-slot numbers, the detachment "<X> Character" keyword, secondary-
 * objective summaries — is either derived heuristically here or dropped.
 *
 * @packageDocumentation
 */
import type { Roster, RosterUnit } from "../import/types.js";
/** Convert a kebab-case entity id ("chaos-knights") to a Title Case display
 * name ("Chaos Knights"). This is the round-trip best-effort when the Roster
 * doesn't store the source's raw faction/detachment name. */
export declare function titleCaseId(id: string | null): string | null;
/** Sum of unit base pts + enhancement pts (= the figure most text formats display). */
export declare function displayedUnitPoints(u: RosterUnit): number | null;
/** Sum of every unit's displayed total + every enhancement cost line. */
export declare function totalArmyPoints(roster: Roster): number;
/**
 * Heuristic re-derivation of which units would carry a `CharN:` prefix on
 * export to a wtc text format. The Roster doesn't track unit categories, so we
 * approximate "is a character" as "is the warlord OR has an enhancement OR has
 * a leader attachment". CharN: numbering follows declaration order.
 *
 * Returns a parallel array: `slot[i]` is the 1-based char index for unit i, or
 * `null` if that unit doesn't get a CharN: prefix.
 */
export declare function charSlotAssignment(units: readonly RosterUnit[]): (number | null)[];
/** Pretty JSON with a trailing newline — matches the repo's 2-space convention. */
export declare function prettyJson(value: unknown): string;
//# sourceMappingURL=helpers.d.ts.map