refactor: eradicate deprecated tools (sticky_notes, pinned_files, context_workspaces, pr_checklist, preferences) and dead code

This commit is contained in:
Riz Ashraf committed 2026-10-07 11:12:42 +01:00
1 parent d80915635f
commit 79209da711
31 files changed
+1230 -3920

No files matched your search

+26 -207
View File
@@ -261,21 +261,9 @@ impl McpResource for SessionDeltaResource {
.unwrap_or_else(|e| e.into_inner());
let active_tasks: Vec<_> = tasks.iter().filter(|t| t.is_active()).collect();
let notes = state
.code
.sticky
.cache
.read()
.unwrap_or_else(|e| e.into_inner());
let active_notes: Vec<_> = notes
.iter()
.filter(|n| n.expires_at.map_or(true, |exp| exp > now))
.collect();
let delta = serde_json::json!({
"recent_changes": recent_changes,
"active_tasks": active_tasks,
"active_sticky_notes": active_notes,
"timestamp": now,
});
@@ -291,7 +279,7 @@ impl McpPrompt for ContextWarmupPrompt {
}
fn description(&self) -> Option<&'static str> {
Some(
"Consolidated context warmup prompt providing active tasks, pinned files, open tech debt, and sticky notes",
"Consolidated context warmup prompt providing active tasks, active decisions, and unresolved tech debt",
)
}
async fn get(
@@ -305,7 +293,7 @@ impl McpPrompt for ContextWarmupPrompt {
"role": "user",
"content": {
"type": "text",
"text": "Perform a complete context warmup. Please read memory://session/delta, memory://tasks/active, memory://tech_debt/active, and memory://pinned_files to synthesize current project focus and active workspace constraints."
"text": "Perform a complete context warmup. Please read memory://session/delta, memory://tasks/active, memory://decisions/active, and memory://tech_debt/unresolved to synthesize current project focus and active workspace constraints."
}
}
]
@@ -397,28 +385,6 @@ impl MemoryHandler {
Ok(serde_json::to_string_pretty(&*items)?)
}
}
struct PinnedFilesResource;
#[async_trait]
impl McpResource for PinnedFilesResource {
fn uri(&self) -> &'static str {
"memory://pinned_files"
}
fn name(&self) -> &'static str {
"Pinned Files"
}
fn description(&self) -> Option<&'static str> {
Some("Currently pinned files in the workspace")
}
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
let items = state
.project
.pinned_files
.cache
.read()
.unwrap_or_else(|e| e.into_inner());
Ok(serde_json::to_string_pretty(&*items)?)
}
}
struct MilestonesResource;
#[async_trait]
@@ -473,7 +439,6 @@ impl MemoryHandler {
register_resource!(TerminalHistoryResource);
register_resource!(RecentActivitiesResource);
register_resource!(PinnedFilesResource);
register_resource!(MilestonesResource);
struct ArchiveRoutinePrompt;
#[async_trait]
@@ -529,8 +494,6 @@ impl MemoryHandler {
register!(tasks::TasksHandler);
register!(tasks::MilestonesHandler);
register!(notes::StickyNotesHandler);
register!(notes::HandoffMemosHandler);
register!(notes::AddSessionSummaryHandler);
register!(notes::GenerateStandupReportHandler);
@@ -542,16 +505,11 @@ impl MemoryHandler {
register!(meta::SearchErrorFixesHandler);
register!(meta::LogCodeChangeHandler);
register!(meta::QueryRecentChangesHandler);
register!(meta::LearnPreferenceHandler);
register!(meta::ReadPreferencesHandler);
register!(meta::OmniSearchHandler);
register!(meta::GetProjectHealthHandler);
register!(env::EnvironmentHandler);
register!(workspaces::PinnedFilesHandler);
register!(workspaces::ContextWorkspacesHandler);
register!(workspaces::PrChecklistHandler);
register!(workspaces::SnippetsHandler);
register!(vision::ClipboardHandler);
@@ -574,7 +532,6 @@ impl MemoryHandler {
register!(meta::GetNextActionableTasksHandler);
register!(meta::LogHypothesisHandler);
register!(meta::QueryHypothesesHandler);
register!(workspaces::DiffContextWorkspacesHandler);
register!(meta::GetPreflightContextHandler);
register!(graph::ResolveStaleSymbolsHandler);
register!(graph::SummarizeSubgraphHandler);
@@ -774,14 +731,13 @@ impl MemoryHandler {
"log_error_fix" => "ERROR_FIX",
"tech_debt" => "TECH_DEBT",
"tasks" | "milestones" => "TASK",
"sticky_notes" | "handoff_memos" => "STICKY_NOTE",
"handoff_memos" => "STICKY_NOTE",
"manage_checkpoint" => "CHECKPOINT",
"manage_subagent_namespace" => "SUBAGENT",
"snippets" => "SNIPPET",
"search_web" => "WEB_SEARCH",
"omni_search" => "OMNI_SEARCH",
"environment" => "ENVIRONMENT",
"pinned_files" | "context_workspaces" | "pr_checklist" => "WORKSPACE",
_ => "TOOL",
};
@@ -880,157 +836,25 @@ pub fn format_tool_activity_description(name: &str, args: &serde_json::Value) ->
.to_string(),
)
}
"sticky_notes" => {
let act = args.get("action").and_then(|v| v.as_str()).unwrap_or("add");
let preview = args
.get("content")
.and_then(|v| v.as_str())
.map(|c| c.chars().take(40).collect::<String>())
.unwrap_or_default();
(
"Sticky Notes",
format!("{}: {}", act, preview)
.trim_end_matches(": ")
.to_string(),
)
}
"clipboard" => {
let act = args
.get("action")
.and_then(|v| v.as_str())
.unwrap_or("read");
("Clipboard", act.to_string())
}
"snippets" => {
let act = args
.get("action")
.and_then(|v| v.as_str())
.unwrap_or("search");
let q = args.get("query").and_then(|v| v.as_str()).unwrap_or("");
(
"Snippets",
format!("{}: {}", act, q).trim_end_matches(": ").to_string(),
)
}
"log_code_change" => {
let file = args
.get("file_path")
.or_else(|| args.get("file"))
.or_else(|| args.get("target_file"))
.and_then(|v| v.as_str());
let summary = args
.get("summary")
.or_else(|| args.get("description"))
.and_then(|v| v.as_str());
let d = match (file, summary) {
(Some(f), Some(s)) => format!("{}: {}", f, s),
(Some(f), None) => f.to_string(),
(None, Some(s)) => s.to_string(),
(None, None) => String::new(),
};
("Log Code Change", d)
}
"log_error_fix" => {
let d = args
.get("error")
.or_else(|| args.get("summary"))
.or_else(|| args.get("solution"))
.and_then(|v| v.as_str())
.unwrap_or("")
.to_string();
("Log Error Fix", d)
}
"create_entities" => {
let d = if let Some(entities) = args.get("entities").and_then(|v| v.as_array()) {
let names: Vec<&str> = entities
.iter()
.filter_map(|e| {
e.get("name")
.or_else(|| e.get("entity_name"))
.and_then(|n| n.as_str())
})
.take(3)
.collect();
if !names.is_empty() {
let mut s = names.join(", ");
if entities.len() > 3 {
s.push_str(&format!(" (+{} more)", entities.len() - 3));
}
s
} else {
format!("{} entity/entities", entities.len())
}
} else if let Some(name) = args
.get("name")
.or_else(|| args.get("entity_name"))
.and_then(|v| v.as_str())
{
name.to_string()
} else {
String::new()
};
("Create Entities", d)
}
"create_relations" => {
let d = if let Some(relations) = args.get("relations").and_then(|v| v.as_array()) {
if let Some(first) = relations.first() {
let from = first.get("from").and_then(|v| v.as_str()).unwrap_or("?");
let to = first.get("to").and_then(|v| v.as_str()).unwrap_or("?");
let pred = first
.get("relation_type")
.or_else(|| first.get("predicate"))
.and_then(|v| v.as_str())
.unwrap_or("->");
if relations.len() > 1 {
format!("{} {} {} (+{} more)", from, pred, to, relations.len() - 1)
} else {
format!("{} {} {}", from, pred, to)
}
} else {
format!("{} relation(s)", relations.len())
}
} else {
String::new()
};
("Create Relations", d)
}
"omni_search" | "search_graph" | "search_web" => {
let d = args
.get("query")
.and_then(|v| v.as_str())
.map(|q| format!("\"{}\"", q))
let names = args
.get("entities")
.and_then(|v| v.as_array())
.map(|arr| {
arr.iter()
.filter_map(|e| e.get("name").and_then(|n| n.as_str()))
.collect::<Vec<_>>()
.join(", ")
})
.unwrap_or_default();
("Search", d)
}
_ => {
let d = args
.get("title")
.or_else(|| args.get("action"))
.or_else(|| args.get("summary"))
.or_else(|| args.get("description"))
.or_else(|| args.get("name"))
.or_else(|| args.get("query"))
.or_else(|| args.get("file_path"))
.or_else(|| args.get("file"))
.or_else(|| args.get("path"))
.and_then(|v| v.as_str())
.unwrap_or("");
(name, d.to_string())
("Create Entities", names)
}
_ => return name.to_string(),
};
let mut truncated = detail.trim().to_string();
if truncated.len() > 80 {
let valid_len = truncated.floor_char_boundary(77);
truncated.truncate(valid_len);
truncated.push_str("...");
}
if !truncated.is_empty() {
format!("{}: {}", action, truncated)
if detail.is_empty() {
action.to_string()
} else {
format!("{}", action)
format!("{}: {}", action, detail)
}
}
@@ -1047,20 +871,20 @@ async fn execute_tool_span(
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
use tempfile::tempdir;
use serde_json::json;
#[test]
fn test_format_tool_activity_description() {
let msg1 = format_tool_activity_description(
"log_code_change",
&json!({ "file": "src/lib.rs", "summary": "Refactored library" }),
let msg = format_tool_activity_description(
"tasks",
&serde_json::json!({ "action": "add", "title": "Refactor router" }),
);
assert_eq!(msg1, "Log Code Change: src/lib.rs: Refactored library");
assert_eq!(msg, "Tasks: add: Refactor router");
let msg2 = format_tool_activity_description(
"create_entities",
&json!({ "entities": [{ "name": "EntityA" }, { "name": "EntityB" }] }),
&serde_json::json!({ "entities": [{ "name": "EntityA" }, { "name": "EntityB" }] }),
);
assert_eq!(msg2, "Create Entities: EntityA, EntityB");
@@ -1115,7 +939,7 @@ mod tests {
assert!(
resources_arr
.iter()
.any(|r| r["uri"] == "memory://pinned_files")
.any(|r| r["uri"] == "memory://decisions/active")
);
assert!(
resources_arr
@@ -1292,8 +1116,8 @@ mod tests {
.as_array()
.expect("tools array expected");
assert!(
tools.len() >= 40,
"Expected at least 40 registered MCP tools, found {}",
tools.len() >= 30,
"Expected at least 30 registered MCP tools, found {}",
tools.len()
);
@@ -1353,16 +1177,11 @@ mod tests {
("tasks", json!({"action": "list"})),
("decisions", json!({"action": "query"})),
("tech_debt", json!({"action": "list"})),
("sticky_notes", json!({"action": "read"})),
("pinned_files", json!({"action": "list"})),
("context_workspaces", json!({"action": "list"})),
("pr_checklist", json!({"action": "get"})),
("snippets", json!({"action": "search", "query": "test"})),
("clipboard", json!({"action": "read"})),
("environment", json!({"action": "read_fingerprint"})),
("omni_search", json!({"query": "test"})),
("get_project_health", json!({})),
("read_preferences", json!({})),
("find_orphans", json!({})),
("sweep_graph_health", json!({})),
("get_next_actionable_tasks", json!({})),