huskies: merge 987

This commit is contained in:
dave
2026-05-13 16:26:09 +00:00
parent 430079ecbc
commit c3c9db3d8b
13 changed files with 662 additions and 311 deletions
+45 -30
View File
@@ -3,7 +3,7 @@
//! These functions transform a completed merge report into human-readable
//! status messages. No I/O: they are pure functions over plain data.
use crate::agents::merge::MergeReport;
use crate::agents::merge::{MergeReport, MergeResult};
#[allow(dead_code)]
/// Derive a human-readable status message from a completed [`MergeReport`].
@@ -11,16 +11,25 @@ use crate::agents::merge::MergeReport;
/// The message explains what happened and (on failure) what the caller
/// should do next.
pub fn format_merge_status_message(report: &MergeReport) -> &'static str {
if report.success && report.gates_passed && report.conflicts_resolved {
"Merge complete: conflicts were auto-resolved and all quality gates passed. Story moved to done and worktree cleaned up."
} else if report.success && report.gates_passed {
"Merge complete: all quality gates passed. Story moved to done and worktree cleaned up."
} else if report.had_conflicts && !report.conflicts_resolved {
"Merge failed: conflicts detected that could not be auto-resolved. Merge was aborted — master is untouched. Call report_merge_failure with the conflict details so the human can resolve them. Do NOT manually move the story file or call accept_story."
} else if report.success && !report.gates_passed {
"Merge committed but quality gates failed. Review gate_output and fix issues before re-running."
} else {
"Merge failed. Review gate_output for details. Call report_merge_failure to record the failure. Do NOT manually move the story file or call accept_story."
match &report.result {
MergeResult::Success {
conflicts_resolved: true,
..
} => {
"Merge complete: conflicts were auto-resolved and all quality gates passed. Story moved to done and worktree cleaned up."
}
MergeResult::Success { .. } => {
"Merge complete: all quality gates passed. Story moved to done and worktree cleaned up."
}
MergeResult::Conflict { .. } => {
"Merge failed: conflicts detected that could not be auto-resolved. Merge was aborted — master is untouched. Call report_merge_failure with the conflict details so the human can resolve them. Do NOT manually move the story file or call accept_story."
}
MergeResult::GateFailure { .. } => {
"Merge committed but quality gates failed. Review gate_output and fix issues before re-running."
}
MergeResult::NoCommits { .. } | MergeResult::Other { .. } => {
"Merge failed. Review gate_output for details. Call report_merge_failure to record the failure. Do NOT manually move the story file or call accept_story."
}
}
}
@@ -29,23 +38,12 @@ pub fn format_merge_status_message(report: &MergeReport) -> &'static str {
#[cfg(test)]
mod tests {
use super::*;
use crate::agents::merge::MergeResult;
fn report(
success: bool,
had_conflicts: bool,
conflicts_resolved: bool,
gates_passed: bool,
) -> MergeReport {
fn make_report(result: MergeResult) -> MergeReport {
MergeReport {
story_id: String::new(),
success,
had_conflicts,
conflicts_resolved,
conflict_details: None,
gates_passed,
gate_output: String::new(),
gate_failure_kind: None,
no_commits: false,
result,
worktree_cleaned_up: false,
story_archived: false,
}
@@ -53,7 +51,11 @@ mod tests {
#[test]
fn clean_merge_message() {
let r = report(true, false, false, true);
let r = make_report(MergeResult::Success {
conflicts_resolved: false,
conflict_details: None,
gate_output: String::new(),
});
let msg = format_merge_status_message(&r);
assert!(msg.contains("quality gates passed"));
assert!(msg.contains("done"));
@@ -61,14 +63,21 @@ mod tests {
#[test]
fn conflicts_resolved_message() {
let r = report(true, true, true, true);
let r = make_report(MergeResult::Success {
conflicts_resolved: true,
conflict_details: None,
gate_output: String::new(),
});
let msg = format_merge_status_message(&r);
assert!(msg.contains("auto-resolved"));
}
#[test]
fn unresolved_conflicts_message() {
let r = report(false, true, false, false);
let r = make_report(MergeResult::Conflict {
details: None,
output: String::new(),
});
let msg = format_merge_status_message(&r);
assert!(msg.contains("could not be auto-resolved"));
assert!(msg.contains("report_merge_failure"));
@@ -76,14 +85,20 @@ mod tests {
#[test]
fn gates_failed_message() {
let r = report(true, false, false, false);
let r = make_report(MergeResult::GateFailure {
output: String::new(),
failure_kind: None,
});
let msg = format_merge_status_message(&r);
assert!(msg.contains("quality gates failed"));
}
#[test]
fn general_failure_message() {
let r = report(false, false, false, false);
let r = make_report(MergeResult::Other {
output: String::new(),
conflict_details: None,
});
let msg = format_merge_status_message(&r);
assert!(msg.contains("Merge failed"));
assert!(msg.contains("report_merge_failure"));