@@ -319,7 +319,6 @@ impl ServerHandler for DeveloperServer {
|
|||||||
**Important**: Each shell command runs in its own process. Things like directory changes or
|
**Important**: Each shell command runs in its own process. Things like directory changes or
|
||||||
sourcing files do not persist between tool calls. So you may need to repeat them each time by
|
sourcing files do not persist between tool calls. So you may need to repeat them each time by
|
||||||
stringing together commands.
|
stringing together commands.
|
||||||
- Pathnames: Use absolute paths and avoid cd unless explicitly requested
|
|
||||||
"#};
|
"#};
|
||||||
|
|
||||||
let windows_specific = indoc! {r#"
|
let windows_specific = indoc! {r#"
|
||||||
@@ -1166,19 +1165,12 @@ impl DeveloperServer {
|
|||||||
let expanded = expand_path(path_str);
|
let expanded = expand_path(path_str);
|
||||||
let path = Path::new(&expanded);
|
let path = Path::new(&expanded);
|
||||||
|
|
||||||
let suggestion = cwd.join(path);
|
// If the path is absolute, return it as-is
|
||||||
|
if is_absolute_path(&expanded) {
|
||||||
match is_absolute_path(&expanded) {
|
Ok(path.to_path_buf())
|
||||||
true => Ok(path.to_path_buf()),
|
} else {
|
||||||
false => Err(ErrorData::new(
|
// For relative paths, resolve them relative to the current working directory
|
||||||
ErrorCode::INVALID_PARAMS,
|
Ok(cwd.join(path))
|
||||||
format!(
|
|
||||||
"The path {} is not an absolute path, did you possibly mean {}?",
|
|
||||||
path_str,
|
|
||||||
suggestion.to_string_lossy(),
|
|
||||||
),
|
|
||||||
None,
|
|
||||||
)),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3317,4 +3309,88 @@ Additional instructions here.
|
|||||||
assert!(!instructions.contains(".goosehints")); // Make sure it's not loading the default
|
assert!(!instructions.contains(".goosehints")); // Make sure it's not loading the default
|
||||||
std::env::remove_var("CONTEXT_FILE_NAMES");
|
std::env::remove_var("CONTEXT_FILE_NAMES");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[serial]
|
||||||
|
async fn test_resolve_path_absolute() {
|
||||||
|
let temp_dir = tempfile::tempdir().unwrap();
|
||||||
|
std::env::set_current_dir(&temp_dir).unwrap();
|
||||||
|
|
||||||
|
let server = create_test_server();
|
||||||
|
let absolute_path = temp_dir.path().join("test.txt");
|
||||||
|
let absolute_path_str = absolute_path.to_str().unwrap();
|
||||||
|
|
||||||
|
let resolved = server.resolve_path(absolute_path_str).unwrap();
|
||||||
|
assert_eq!(resolved, absolute_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[serial]
|
||||||
|
async fn test_resolve_path_relative() {
|
||||||
|
let temp_dir = tempfile::tempdir().unwrap();
|
||||||
|
std::env::set_current_dir(&temp_dir).unwrap();
|
||||||
|
|
||||||
|
let server = create_test_server();
|
||||||
|
let relative_path = "subdir/test.txt";
|
||||||
|
|
||||||
|
let resolved = server.resolve_path(relative_path).unwrap();
|
||||||
|
let expected = std::env::current_dir().unwrap().join("subdir/test.txt");
|
||||||
|
assert_eq!(resolved, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[serial]
|
||||||
|
async fn test_text_editor_with_absolute_path() {
|
||||||
|
let temp_dir = tempfile::tempdir().unwrap();
|
||||||
|
std::env::set_current_dir(&temp_dir).unwrap();
|
||||||
|
|
||||||
|
let server = create_test_server();
|
||||||
|
let absolute_path = temp_dir.path().join("absolute_test.txt");
|
||||||
|
let absolute_path_str = absolute_path.to_str().unwrap();
|
||||||
|
|
||||||
|
let write_params = Parameters(TextEditorParams {
|
||||||
|
path: absolute_path_str.to_string(),
|
||||||
|
command: "write".to_string(),
|
||||||
|
view_range: None,
|
||||||
|
file_text: Some("Absolute path test".to_string()),
|
||||||
|
old_str: None,
|
||||||
|
new_str: None,
|
||||||
|
insert_line: None,
|
||||||
|
diff: None,
|
||||||
|
});
|
||||||
|
|
||||||
|
let result = server.text_editor(write_params).await;
|
||||||
|
assert!(result.is_ok());
|
||||||
|
|
||||||
|
let content = fs::read_to_string(&absolute_path).unwrap();
|
||||||
|
assert_eq!(content.trim(), "Absolute path test");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[serial]
|
||||||
|
async fn test_text_editor_with_relative_path() {
|
||||||
|
let temp_dir = tempfile::tempdir().unwrap();
|
||||||
|
std::env::set_current_dir(&temp_dir).unwrap();
|
||||||
|
|
||||||
|
let server = create_test_server();
|
||||||
|
let relative_path = "relative_test.txt";
|
||||||
|
|
||||||
|
let write_params = Parameters(TextEditorParams {
|
||||||
|
path: relative_path.to_string(),
|
||||||
|
command: "write".to_string(),
|
||||||
|
view_range: None,
|
||||||
|
file_text: Some("Relative path test".to_string()),
|
||||||
|
old_str: None,
|
||||||
|
new_str: None,
|
||||||
|
insert_line: None,
|
||||||
|
diff: None,
|
||||||
|
});
|
||||||
|
|
||||||
|
let result = server.text_editor(write_params).await;
|
||||||
|
assert!(result.is_ok());
|
||||||
|
|
||||||
|
let absolute_path = temp_dir.path().join(relative_path);
|
||||||
|
let content = fs::read_to_string(&absolute_path).unwrap();
|
||||||
|
assert_eq!(content.trim(), "Relative path test");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user