renderPlanText function
Implementation
String renderPlanText(
ChangePlan plan,
String? destination,
PlanAvailability availability,
) {
final buffer = StringBuffer()
..writeln('Change Plan ${plan.planId}')
..writeln('State: ${plan.state.name}')
..writeln(
'Project summary: recipe ${plan.recipeVersion}; engine ${plan.engineVersion}',
)
..writeln('Target path: ${destination ?? 'unavailable'}')
..writeln('Target paths: ${_values(plan.targetPaths)}')
..writeln('Project tree:')
..writeln(_lines(plan.operations.map((operation) => operation.logicalPath)))
..writeln('Files to create (${plan.operations.length}):')
..writeln('operationCount: ${plan.operations.length}');
for (final operation in plan.operations) {
buffer.writeln(
'- ${operation.logicalPath} | ${operation.ownershipClass.name} | ${operation.contentHash}',
);
if (availability.contentReviewAvailable) {
buffer
..writeln(' content:')
..writeln(availability.contents[operation.logicalPath]);
}
}
if (!availability.contentReviewAvailable) {
buffer.writeln('Content review unavailable (staging released).');
}
buffer
..writeln('Dependencies (exact resolved versions):')
..writeln(
_lines(
plan.dependencies.entries.map(
(entry) => '${entry.key}: ${entry.value}',
),
),
)
..writeln('Staging commands already run:')
..writeln(_commands(plan.stagingCommands))
..writeln('Target regeneration commands:')
..writeln(_commands(plan.regenerationCommands))
..writeln('Regeneration path set: ${_values(plan.regenerationPathSet)}')
..writeln('Toolchain exceptions:')
..writeln(
_lines(
plan.toolchainExceptions.map(
(exception) =>
'${exception.logicalPath} | ${exception.reason} | regenerated by: ${exception.regeneratedBy}',
),
),
)
..writeln('Validation plan:')
..writeln(_commands(plan.validationCommands))
..writeln('Warnings: ${_values(plan.warnings)}')
..writeln('Manual steps: ${_values(plan.manualSteps)}')
..writeln('Rollback capability/limits: ${plan.rollbackCapability.name}')
..writeln('Generation already happened; Apply will not re-run generation.');
return buffer.toString();
}