/** * Bidirectional translator between an ADP-style Markdown ADR and the * setup-agents `SetupAgentsDecisionRecord` (JSONL) shape (GH-597 slice S4). * * ADP ADR sections: a `# ` heading, then `## Context`, `## Decision`, * `## Consequences`, `## Alternatives`. The record has no dedicated slot for * every ADR section, so section text without a direct field is carried inside * `rationale` under a delimiter block. This makes both round-trips stable: * record to markdown to record, and markdown to record to markdown. */ import type { SetupAgentsDecisionRecord } from '../types/index.js'; /** * Delimiter that separates the free-form rationale (the ADR Context section) * from carry-over fields that have no dedicated record slot. Everything after * this marker inside `rationale` is machine-managed and re-expanded on the way * back to Markdown; a human editing `rationale` should stay above it. */ export declare const ADR_CARRY_DELIMITER = "<!-- adr-carry -->"; /** * Convert an ADP-style Markdown ADR into a `SetupAgentsDecisionRecord`. * * Section mapping: * - `# title` → `summary` * - `## Context` → `rationale` body (also carried verbatim for round-trip) * - `## Decision` → `outcome` * - `## Consequences` → carried under the rationale delimiter (no record slot) * - `## Alternatives` → `alternatives[]` * * `owner`, `id`, `createdAt`, `taskIds` are filled from options or defaults. */ export declare function adrMarkdownToRecord(md: string, options?: { owner?: string; id?: string; createdAt?: string; taskIds?: string[]; evidenceIds?: string[]; }): SetupAgentsDecisionRecord; /** * Render a `SetupAgentsDecisionRecord` back into an ADP-style Markdown ADR. * * Prefers carried values (from a prior `adrMarkdownToRecord`) so that * `markdown → record → markdown` reproduces the original document, and falls * back to the plain record fields (`summary`, `rationale`, `outcome`, * `alternatives`) for records that never came from an ADR. */ export declare function recordToAdrMarkdown(record: SetupAgentsDecisionRecord): string;