ralph-workflow 0.7.18

PROMPT-driven multi-agent orchestrator for git repos
Documentation
enum CommitExtractionOutcome {
    MissingFile(String),
    InvalidXml(String),
    Valid {
        extracted: CommitExtractionResult,
        files: Vec<String>,
        excluded_files: Vec<crate::reducer::state::pipeline::ExcludedFile>,
    },
    Skipped(String),
}

pub(crate) enum ParsedCommitXmlOutcome {
    Skipped(String),
    Invalid(String),
    Valid {
        message: String,
        files: Vec<String>,
        excluded_files: Vec<crate::reducer::state::pipeline::ExcludedFile>,
    },
}

pub(crate) fn parse_commit_xml_document(xml_content: &str) -> ParsedCommitXmlOutcome {
    let (message, skip_reason, files, excluded_files, detail) =
        try_extract_xml_commit_document_with_trace(xml_content);

    if let Some(reason) = skip_reason {
        return ParsedCommitXmlOutcome::Skipped(reason);
    }

    message.map_or(ParsedCommitXmlOutcome::Invalid(detail), |message| {
        ParsedCommitXmlOutcome::Valid {
            message,
            files,
            excluded_files,
        }
    })
}

pub(crate) fn commit_outcome_event_from_validated(
    message: Option<String>,
    reason: Option<String>,
    attempt: u32,
) -> crate::reducer::event::PipelineEvent {
    match (message, reason) {
        (Some(message), _) => {
            crate::reducer::event::PipelineEvent::commit_message_generated(message, attempt)
        }
        (None, Some(reason)) => {
            crate::reducer::event::PipelineEvent::commit_message_validation_failed(reason, attempt)
        }
        (None, None) => crate::reducer::event::PipelineEvent::commit_generation_failed(
            "Commit validation outcome missing message and reason".to_string(),
        ),
    }
}

fn extract_commit_message_from_file_with_workspace(
    workspace: &dyn Workspace,
) -> CommitExtractionOutcome {
    let Ok(xml) = workspace.read(Path::new(xml_paths::COMMIT_MESSAGE_XML)) else {
        return CommitExtractionOutcome::MissingFile(
            "XML output missing or invalid; agent must write .agent/tmp/commit_message.xml"
                .to_string(),
        );
    };

    match parse_commit_xml_document(&xml) {
        ParsedCommitXmlOutcome::Skipped(reason) => CommitExtractionOutcome::Skipped(reason),
        ParsedCommitXmlOutcome::Invalid(detail) => CommitExtractionOutcome::InvalidXml(detail),
        ParsedCommitXmlOutcome::Valid {
            message,
            files,
            excluded_files,
        } => CommitExtractionOutcome::Valid {
            extracted: CommitExtractionResult::new(message),
            files,
            excluded_files,
        },
    }
}