Eliminate ~500 lines of duplicate code across 31 files by extracting shared functions, helpers, and consolidating repeated patterns. Highlights: - Toast helpers (toast_info/success/warning/error) on AppStateRest - push_event() helper for turn-event queue (19 callers consolidated) - log_write_edit_tool() shared fn (turn.rs + engine.rs ~50 lines saved) - resolve_api_key() shared fn (spawn.rs + provider.rs) - LSP call_positional() helper on LspClient - lsp_cursor_params() shared schema for 4 tool files -overlay_block() helper for consistent overlay title/border styling - cycle_selected_index(), path_not_found/a_directory() helpers - mark_dirty(), save_settings() on AppStateRest - Remove redundant Err(e) => Err(e) arms in LSP tools - Consolidate generate_workspace_tree (turn.rs → workspace.rs) - Simplify background-review wrapper args in auto/mod.rs Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
58 lines
2.0 KiB
Rust
58 lines
2.0 KiB
Rust
//! `cd` tool: verify and resolve a workspace-relative directory path.
|
|
use super::super::Tool;
|
|
use super::super::ToolCtx;
|
|
use anyhow::Result;
|
|
use serde_json::{json, Value};
|
|
|
|
/// Tool that resolves a workspace-relative path and reports whether it exists and is a dir.
|
|
pub struct Cd;
|
|
|
|
impl Tool for Cd {
|
|
fn name(&self) -> &'static str {
|
|
"cd"
|
|
}
|
|
|
|
fn description(&self) -> &'static str {
|
|
"Check if a directory exists within the workspace and print its resolved path. Use this to verify a directory path before running other commands there."
|
|
}
|
|
|
|
fn parameters(&self) -> Value {
|
|
json!({
|
|
"type": "object",
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"description": "Directory path (relative to workspace root)"
|
|
}
|
|
},
|
|
"required": ["path"]
|
|
})
|
|
}
|
|
|
|
/// Resolve `path` against the workspace roots and report its status.
|
|
///
|
|
/// Flow: extract `path` → `resolve_path` (sandboxed to `ctx.workspaces`) →
|
|
/// check `exists()` and `is_dir()` → canonicalize → return canonical path.
|
|
///
|
|
/// Why: the agent has no persistent cwd between tool calls; "cd" here is purely a
|
|
/// verification + canonicalization helper rather than a state change.
|
|
///
|
|
/// Return: canonical path on success; explicit "does not exist" / "not a directory"
|
|
/// message (still `Ok`) so the model can react without treating it as an error.
|
|
fn run(&self, ctx: &ToolCtx, args: &Value) -> Result<String> {
|
|
let rel = crate::tool::arg_str(args, "path")?;
|
|
|
|
let path = super::super::resolve_path(&ctx.workspaces, &rel)?;
|
|
|
|
if !path.exists() {
|
|
return Ok(super::path_not_found(&rel, &path));
|
|
}
|
|
if !path.is_dir() {
|
|
return Ok(super::path_not_a_directory(&rel, &path));
|
|
}
|
|
|
|
let canon = path.canonicalize().unwrap_or(path);
|
|
Ok(format!("{}", canon.display()))
|
|
}
|
|
}
|