fabro(01KN4JD6GJTC3PHC8G80EA950B): simplify_opus (success)

Fabro-Run: 01KN4JD6GJTC3PHC8G80EA950B
Fabro-Completed: 6
Fabro-Checkpoint: 79e6a6aac2

⚒️ Generated with [Fabro](https://fabro.sh)
This commit is contained in:
Fabro 2026-04-01 13:22:06 +00:00
parent 964ceff724
commit 081b46e502
2 changed files with 42 additions and 80 deletions

View file

@ -242,46 +242,57 @@ pub(crate) fn check_config(
}
}
pub(crate) fn check_storage_dir(path: &Path, readable: bool, writable: bool) -> CheckResult {
let summary = path.display().to_string();
let exists = path.is_dir();
pub(crate) fn check_storage_dir(path: &Path) -> CheckResult {
let display = path.display();
let summary = display.to_string();
let name = "Storage directory".to_string();
let mut details = vec![
CheckDetail::new(format!("Exists: {}", if exists { "yes" } else { "no" })),
CheckDetail::new(format!("Readable: {}", if readable { "yes" } else { "no" })),
CheckDetail::new(format!("Writable: {}", if writable { "yes" } else { "no" })),
];
if !exists {
return CheckResult {
name: "Storage directory".to_string(),
status: CheckStatus::Error,
summary,
details,
remediation: Some(format!("Create the directory: mkdir -p {}", path.display())),
let readable = std::fs::read_dir(path).is_ok();
if !readable {
// read_dir fails for both non-existent and permission-denied
let exists = path.is_dir();
let details = vec![CheckDetail::new(format!(
"Exists: {}",
if exists { "yes" } else { "no" }
))];
return if exists {
CheckResult {
name,
status: CheckStatus::Error,
summary,
details,
remediation: Some(format!("Fix permissions on {display}")),
}
} else {
CheckResult {
name,
status: CheckStatus::Error,
summary,
details,
remediation: Some(format!("Create the directory: mkdir -p {display}")),
}
};
}
if !readable || !writable {
let mut issues = Vec::new();
if !readable {
issues.push("not readable");
}
if !writable {
issues.push("not writable");
}
details.push(CheckDetail::new(format!("Issues: {}", issues.join(", "))));
let writable = tempfile::tempfile_in(path).is_ok();
let details = vec![
CheckDetail::new("Exists: yes".to_string()),
CheckDetail::new("Readable: yes".to_string()),
CheckDetail::new(format!("Writable: {}", if writable { "yes" } else { "no" })),
];
if !writable {
return CheckResult {
name: "Storage directory".to_string(),
name,
status: CheckStatus::Error,
summary,
details,
remediation: Some(format!("Fix permissions on {}", path.display())),
remediation: Some(format!("Fix permissions on {display}")),
};
}
CheckResult {
name: "Storage directory".to_string(),
name,
status: CheckStatus::Pass,
summary,
details,
@ -1031,8 +1042,6 @@ pub(crate) async fn run_doctor(
.storage_dir
.clone()
.unwrap_or_else(|| cli_settings.storage_dir());
let storage_readable = std::fs::read_dir(&storage_dir).is_ok();
let storage_writable = tempfile::tempfile_in(&storage_dir).is_ok();
let llm_statuses: Vec<(Provider, bool)> = Provider::ALL
.iter()
@ -1245,7 +1254,7 @@ pub(crate) async fn run_doctor(
None
},
),
check_storage_dir(&storage_dir, storage_readable, storage_writable),
check_storage_dir(&storage_dir),
check_llm_providers(&llm_statuses, llm_live_results.as_deref()),
check_github_app(&github_status),
],
@ -1334,7 +1343,7 @@ mod tests {
#[test]
fn check_storage_dir_pass() {
let dir = tempfile::tempdir().unwrap();
let result = check_storage_dir(dir.path(), true, true);
let result = check_storage_dir(dir.path());
assert_eq!(result.status, CheckStatus::Pass);
assert!(result.summary.contains(dir.path().to_str().unwrap()));
assert!(result.remediation.is_none());
@ -1343,26 +1352,12 @@ mod tests {
#[test]
fn check_storage_dir_not_exists() {
let path = PathBuf::from("/tmp/nonexistent-fabro-doctor-test-xyz");
let result = check_storage_dir(&path, false, false);
let result = check_storage_dir(&path);
assert_eq!(result.status, CheckStatus::Error);
assert!(result.summary.contains("nonexistent-fabro-doctor-test-xyz"));
assert!(result.remediation.as_deref().unwrap().contains("mkdir -p"));
}
#[test]
fn check_storage_dir_not_writable() {
let dir = tempfile::tempdir().unwrap();
let result = check_storage_dir(dir.path(), true, false);
assert_eq!(result.status, CheckStatus::Error);
assert!(
result
.remediation
.as_deref()
.unwrap()
.contains("Fix permissions")
);
}
// -- check_llm_providers --
#[test]

View file

@ -64,39 +64,6 @@ fn dry_run_flag() {
");
}
#[test]
fn storage_dir_shown_in_output() {
let context = test_context!();
let mut cmd = context.doctor();
cmd.arg("--dry-run");
cmd.env("ANTHROPIC_API_KEY", "sk-test-dummy");
fabro_snapshot!(context.filters(), cmd, @"
success: true
exit_code: 0
----- stdout -----
Fabro Doctor
Required
[!] Configuration (no user config file found)
[✓] Storage directory ([STORAGE_DIR])
[✓] LLM providers (1 configured)
[!] GitHub App (not configured)
Optional
[!] Cloud sandbox (no sandbox configured)
[!] Brave Search (not configured)
Found issues in 4 categories.
Warnings:
• Configuration — Create ~/.fabro/user.toml
• GitHub App — Configure GitHub App in server.toml and set env vars to enable GitHub integration
• Cloud sandbox — Set DAYTONA_API_KEY to enable cloud sandbox execution
• Brave Search — Set BRAVE_SEARCH_API_KEY to enable web search
----- stderr -----
");
}
#[test]
fn storage_dir_missing_shows_error() {
let context = test_context!();