Add proper lifecycle and superseding support for Architectural Decision Records

This commit is contained in:
Riz Ashraf committed 2026-09-27 10:01:46 +01:00
1 parent 70edfa4389
commit 54aead2151
4 files changed
+28 -3

No files matched your search

+5 -3
View File
@@ -1085,10 +1085,12 @@
`);
loadGenericList('/api/adrs', 'adrs-container', item => `
<strong>${item.title}</strong>
<div style="font-size:0.9em; margin-bottom:8px;"><em>Context:</em> ${item.context || ''}</div>
<strong>${item.id} | ${item.title}</strong>
<span style="float:right; background:var(--canvas-bg); padding:2px 6px; border-radius:4px; font-size:0.8em; border:1px solid var(--border-color); ${item.status === 'superseded' ? 'text-decoration: line-through; color:var(--error-color);' : 'color:var(--success-color);'}">${item.status}</span>
<div style="font-size:0.9em; margin-bottom:8px; margin-top:8px;"><em>Context:</em> ${item.context || ''}</div>
<div style="font-size:0.9em; margin-bottom:8px;"><em>Decision:</em> ${item.decision || ''}</div>
<div style="font-size:0.9em;"><em>Consequences:</em> ${item.consequences || ''}</div>
<div style="font-size:0.9em; margin-bottom:8px;"><em>Consequence:</em> ${item.consequence || ''}</div>
${item.supersedes ? `<div style="font-size:0.9em; font-weight:bold; color:var(--warning-color);">Supersedes: ${item.supersedes}</div>` : ''}
`);
loadGenericList('/api/context_workspaces', 'workspaces-container', item => `
+13
View File
@@ -25,6 +25,17 @@ impl McpTool for LogDecisionHandler {
let mut final_id = String::new();
state.adrs.modify(|adrs| {
if let Some(superseded_id) = &req.supersedes {
for old_adr in adrs.iter_mut() {
if old_adr.id == *superseded_id {
old_adr.status = "superseded".to_string();
// Re-index the modified old ADR
drop(idx.index_adr(old_adr));
break;
}
}
}
final_id = format!("ADR-{:04}", adrs.len() + 1);
let a = Adr {
id: final_id.clone(),
@@ -32,6 +43,8 @@ impl McpTool for LogDecisionHandler {
context: req.context,
decision: req.decision,
consequence: req.consequence,
status: "accepted".to_string(),
supersedes: req.supersedes,
timestamp: crate::handlers::utils::now_secs(),
};
+8
View File
@@ -82,8 +82,16 @@ pub struct Adr {
pub context: String,
pub decision: String,
pub consequence: String,
#[serde(default = "default_adr_status")]
pub status: String,
#[serde(default)]
pub supersedes: Option<String>,
pub timestamp: u64,
}
fn default_adr_status() -> String {
"accepted".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Preference {
pub key: String,
+2
View File
@@ -220,6 +220,8 @@ pub struct LogDecisionTool {
pub decision: String,
/// The consequence of the decision.
pub consequence: String,
/// The ID of an older ADR this decision supersedes, if any.
pub supersedes: Option<String>,
}
/// Query architectural decision records.