Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
a809bf1
fix(input): write \033[>0u instead of \033[>1u on Windows to fix Ente…
gordonlu May 14, 2026
c54ac60
Merge branch 'main' into main
Hmbown May 14, 2026
1b1ed1a
Merge remote-tracking branch 'upstream/main'
gordonlu May 26, 2026
86a940c
Merge remote-tracking branch 'upstream/main'
gordonlu May 27, 2026
567d824
feat: i18n Phase 1 — localize composer, config modal, status picker, …
gordonlu May 6, 2026
6b8500f
chore: ignore .claude/settings.json in gitignore
gordonlu May 6, 2026
8582c53
feat: i18n Phase 2 — localize approval and sandbox elevation UI (#790)
gordonlu May 6, 2026
faf4d3b
feat: i18n Phase 3 — localize queue, task, trust, LSP, and logout com…
gordonlu May 6, 2026
3412528
feat: i18n Phase 4 — migrate all CommandResult::error() calls to loca…
gordonlu May 6, 2026
339952e
feat: i18n Phase 4b — localize tool family labels, agent lifecycle, f…
gordonlu May 6, 2026
c3d6463
feat: i18n wiring + rebase compile fixes
gordonlu May 26, 2026
2d6b735
fix: rebase conflict — use error_msg() for upstream's new 1-arg error…
gordonlu May 27, 2026
51e00c1
chore: remove unused Locale/Config imports to fix CI -Dwarnings
gordonlu May 27, 2026
08ede38
fix: clippy + dead_code warnings under --all-features
gordonlu May 27, 2026
d0786ad
fix: update qa_pty assertion for AGENT/YOLO/PLAN uppercase labels
gordonlu May 27, 2026
e94676f
fix: address Gemini review — named placeholders, error_msg usage, doc…
gordonlu May 27, 2026
55435b4
fmt: cargo fmt after review fixes
gordonlu May 27, 2026
53ceaa6
fix: queue draft header {n} leak, hook/analytics use Locale::En
gordonlu May 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ apps/
# Claude Code runtime artifacts
.claude/scheduled_tasks.lock
.claude/worktrees/
.claude/settings.json
.worktrees/
.ace-tool/

Expand Down
16 changes: 8 additions & 8 deletions crates/tui/src/commands/anchor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ pub fn anchor(app: &mut App, content: Option<&str>) -> CommandResult {
let input = match content {
Some(c) => c.trim(),
None => {
return CommandResult::error(format!("Usage: {USAGE}"));
return CommandResult::error_msg(format!("Usage: {USAGE}"));
}
};

if input.is_empty() {
return CommandResult::error(format!("Usage: {USAGE}"));
return CommandResult::error_msg(format!("Usage: {USAGE}"));
}

// Parse subcommands.
Expand Down Expand Up @@ -89,20 +89,20 @@ fn add_anchor(app: &mut App, text: &str) -> CommandResult {
if let Some(parent) = path.parent()
&& let Err(e) = fs::create_dir_all(parent)
{
return CommandResult::error(format!("Failed to create anchors directory: {e}"));
return CommandResult::error_msg(format!("Failed to create anchors directory: {e}"));
}

// Append to anchors file.
let mut file = match fs::OpenOptions::new().create(true).append(true).open(&path) {
Ok(f) => f,
Err(e) => {
return CommandResult::error(format!("Failed to open anchors file: {e}"));
return CommandResult::error_msg(format!("Failed to open anchors file: {e}"));
}
};

// Write separator and anchor content.
if let Err(e) = writeln!(file, "\n---\n{text}") {
return CommandResult::error(format!("Failed to write anchor: {e}"));
return CommandResult::error_msg(format!("Failed to write anchor: {e}"));
}

CommandResult::message(format!(
Expand Down Expand Up @@ -134,7 +134,7 @@ fn remove_anchor(app: &mut App, index_str: &str) -> CommandResult {
let index: usize = match index_str.parse() {
Ok(n) if n >= 1 => n,
_ => {
return CommandResult::error(
return CommandResult::error_msg(
"Invalid index. Use /anchor list to see anchor numbers, then /anchor remove <n>.",
);
}
Expand All @@ -143,15 +143,15 @@ fn remove_anchor(app: &mut App, index_str: &str) -> CommandResult {
let mut anchors = read_anchors(app);

if index > anchors.len() {
return CommandResult::error(format!(
return CommandResult::error_msg(format!(
"Anchor #{index} does not exist. You have {} anchor(s). Use /anchor list to see them.",
anchors.len()
));
}

let removed = anchors.remove(index - 1);
if let Err(e) = write_anchors(app, &anchors) {
return CommandResult::error(e);
return CommandResult::error_msg(e);
}

CommandResult::message(format!("Removed anchor #{index}: {removed}"))
Expand Down
13 changes: 10 additions & 3 deletions crates/tui/src/commands/attachment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,27 @@ use crate::tui::app::App;

pub fn attach(app: &mut App, arg: Option<&str>) -> CommandResult {
let Some(raw_path) = arg.map(str::trim).filter(|value| !value.is_empty()) else {
return CommandResult::error("Usage: /attach <image-or-video-path>");
return CommandResult::error("Usage: /attach <image-or-video-path>", app.ui_locale);
};

let path = resolve_attachment_path(raw_path, &app.workspace);
let Ok(path) = path.canonicalize() else {
return CommandResult::error(format!("Attachment not found: {}", path.display()));
return CommandResult::error(
format!("Attachment not found: {}", path.display()),
app.ui_locale,
);
};
if !path.is_file() {
return CommandResult::error(format!("Attachment is not a file: {}", path.display()));
return CommandResult::error(
format!("Attachment is not a file: {}", path.display()),
app.ui_locale,
);
}

let Some(kind) = media_kind(&path) else {
return CommandResult::error(
"Unsupported attachment type. /attach is for image/video paths; use @path for text files or directories.",
app.ui_locale,
);
};

Expand Down
2 changes: 1 addition & 1 deletion crates/tui/src/commands/change.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ pub fn change(app: &mut App, version: Option<&str>) -> CommandResult {
Expected a line starting with `## [`."
.to_string()
};
return CommandResult::error(msg);
return CommandResult::error_msg(msg);
}
};

Expand Down
Loading
Loading