style: replace emojis with clean minimal terminal symbols
This commit is contained in:
parent
e8dd01509c
commit
659de0dc04
3 changed files with 21 additions and 21 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
# BrokeCrew 🤖⚡
|
# BrokeCrew
|
||||||
|
|
||||||
[](https://github.com/oiupoyt/brokecrew/actions)
|
[](https://github.com/oiupoyt/brokecrew/actions)
|
||||||
[](LICENSE-MIT)
|
[](LICENSE-MIT)
|
||||||
|
|
@ -31,8 +31,8 @@ Simply run `brokecrew` to enter the rich, full-screen interactive TUI:
|
||||||
brokecrew
|
brokecrew
|
||||||
```
|
```
|
||||||
|
|
||||||
- **Live Team View**: Color-coded persona avatars (`⚡ coder`, `🔍 reviewer`, `🏛️ architect`), token streaming with markdown & syntax formatting.
|
- **Live Team View**: Color-coded persona indicators (`● coder`, `● reviewer`, `● architect`), token streaming with markdown & syntax formatting.
|
||||||
- **Quota & Budget Monitor**: Real-time headers displaying rolling minute and 24h limits (`⏱ 1m: 2/20`, `📅 24h: 14/50`).
|
- **Quota & Budget Monitor**: Real-time headers displaying rolling minute and 24h limits (`1m: 2/20`, `24h: 14/50`).
|
||||||
- **Interactive Modals**:
|
- **Interactive Modals**:
|
||||||
- `[Tab]` — Open Persona Selector (switch between intelligent Stage A/B `Auto-Route` and dedicated personas).
|
- `[Tab]` — Open Persona Selector (switch between intelligent Stage A/B `Auto-Route` and dedicated personas).
|
||||||
- `[Ctrl+P]` — Open Pipeline Selector (execute multi-agent pipelines like `build-and-review`).
|
- `[Ctrl+P]` — Open Pipeline Selector (execute multi-agent pipelines like `build-and-review`).
|
||||||
|
|
|
||||||
18
src/main.rs
18
src/main.rs
|
|
@ -144,7 +144,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
.map_err(|e| format!("Failed to save API key to OS credential store: {e}"))?;
|
.map_err(|e| format!("Failed to save API key to OS credential store: {e}"))?;
|
||||||
println!(
|
println!(
|
||||||
"{}",
|
"{}",
|
||||||
"✔ OpenRouter API key saved securely in OS credential store."
|
"✓ OpenRouter API key saved securely in OS credential store."
|
||||||
.bright_green()
|
.bright_green()
|
||||||
.bold()
|
.bold()
|
||||||
);
|
);
|
||||||
|
|
@ -263,7 +263,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
);
|
);
|
||||||
println!(" Daily requests today: {}", daily_color);
|
println!(" Daily requests today: {}", daily_color);
|
||||||
if status.approaching_daily_limit {
|
if status.approaching_daily_limit {
|
||||||
println!(" {}", "⚠ Notice: Approaching daily free-tier limit. Non-urgent calls may be deferred.".yellow().bold());
|
println!(" {}", "! Notice: Approaching daily free-tier limit. Non-urgent calls may be deferred.".yellow().bold());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
|
@ -323,7 +323,7 @@ fn ensure_api_key(config: &AppConfig) -> Result<String, Box<dyn std::error::Erro
|
||||||
if io::stdin().is_terminal() {
|
if io::stdin().is_terminal() {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"{}",
|
"{}",
|
||||||
"⚡ Welcome to BrokeCrew! No OpenRouter API key found in keyring, env, or config."
|
":: Welcome to BrokeCrew! No OpenRouter API key found in keyring, env, or config."
|
||||||
.bright_cyan()
|
.bright_cyan()
|
||||||
.bold()
|
.bold()
|
||||||
);
|
);
|
||||||
|
|
@ -339,7 +339,7 @@ fn ensure_api_key(config: &AppConfig) -> Result<String, Box<dyn std::error::Erro
|
||||||
let _ = AppConfig::save_api_key_to_keyring(&trimmed);
|
let _ = AppConfig::save_api_key_to_keyring(&trimmed);
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"{}",
|
"{}",
|
||||||
"✔ OpenRouter API key saved securely in OS credential store."
|
"✓ OpenRouter API key saved securely in OS credential store."
|
||||||
.bright_green()
|
.bright_green()
|
||||||
.bold()
|
.bold()
|
||||||
);
|
);
|
||||||
|
|
@ -454,7 +454,7 @@ async fn execute_prompt(
|
||||||
if status.approaching_daily_limit {
|
if status.approaching_daily_limit {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"{} Daily usage: {}/{}",
|
"{} Daily usage: {}/{}",
|
||||||
"⚠ Budget notice: Approaching daily ceiling.".yellow(),
|
"! Budget notice: Approaching daily ceiling.".yellow(),
|
||||||
status.daily_requests,
|
status.daily_requests,
|
||||||
status.daily_limit
|
status.daily_limit
|
||||||
);
|
);
|
||||||
|
|
@ -526,7 +526,7 @@ async fn execute_prompt(
|
||||||
if let Some(info) = route_info {
|
if let Some(info) = route_info {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"{}",
|
"{}",
|
||||||
format!("⚡ [BrokeCrew: {info} ➔ {}]", target_persona).dimmed()
|
format!("› [BrokeCrew: {info} ➔ {}]", target_persona).dimmed()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -567,7 +567,7 @@ async fn execute_prompt(
|
||||||
if res.fell_back {
|
if res.fell_back {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"{}",
|
"{}",
|
||||||
format!("⚠ Candidate fallback: served by {}", res.model_used).yellow()
|
format!("! Candidate fallback: served by {}", res.model_used).yellow()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// Record budget for each failed attempt plus the successful one
|
// Record budget for each failed attempt plus the successful one
|
||||||
|
|
@ -597,7 +597,7 @@ async fn run_pipeline(
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
println!(
|
println!(
|
||||||
"\n{} Starting pipeline '{}' ({} steps)",
|
"\n{} Starting pipeline '{}' ({} steps)",
|
||||||
"⚡".bright_cyan(),
|
"›".bright_cyan(),
|
||||||
pipeline.name.bold(),
|
pipeline.name.bold(),
|
||||||
pipeline.steps.len()
|
pipeline.steps.len()
|
||||||
);
|
);
|
||||||
|
|
@ -667,7 +667,7 @@ async fn run_pipeline(
|
||||||
}
|
}
|
||||||
println!();
|
println!();
|
||||||
if fell_back {
|
if fell_back {
|
||||||
eprintln!("{}", "⚠ Fallback occurred during step execution".yellow());
|
eprintln!("{}", "! Fallback occurred during step execution".yellow());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -603,7 +603,7 @@ fn render_minimal_messages(frame: &mut Frame, app: &AppState, area: Rect, palett
|
||||||
let mut header_spans = vec![
|
let mut header_spans = vec![
|
||||||
Span::raw(" "),
|
Span::raw(" "),
|
||||||
Span::styled(
|
Span::styled(
|
||||||
format!("⚡ {name}"),
|
format!("● {name}"),
|
||||||
Style::default().fg(persona_color).bold(),
|
Style::default().fg(persona_color).bold(),
|
||||||
),
|
),
|
||||||
Span::styled(
|
Span::styled(
|
||||||
|
|
@ -614,7 +614,7 @@ fn render_minimal_messages(frame: &mut Frame, app: &AppState, area: Rect, palett
|
||||||
if msg.fell_back {
|
if msg.fell_back {
|
||||||
header_spans.push(Span::raw(" "));
|
header_spans.push(Span::raw(" "));
|
||||||
header_spans.push(Span::styled(
|
header_spans.push(Span::styled(
|
||||||
"⚠ fallback",
|
"[fallback]",
|
||||||
Style::default().fg(Color::Yellow).bold(),
|
Style::default().fg(Color::Yellow).bold(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
@ -640,7 +640,7 @@ fn render_minimal_messages(frame: &mut Frame, app: &AppState, area: Rect, palett
|
||||||
let mut header_spans = vec![
|
let mut header_spans = vec![
|
||||||
Span::raw(" "),
|
Span::raw(" "),
|
||||||
Span::styled(
|
Span::styled(
|
||||||
format!("⚡ Step {}/{}: {persona}", step_index + 1, total_steps),
|
format!("● Step {}/{}: {persona}", step_index + 1, total_steps),
|
||||||
Style::default().fg(persona_color).bold(),
|
Style::default().fg(persona_color).bold(),
|
||||||
),
|
),
|
||||||
Span::styled(
|
Span::styled(
|
||||||
|
|
@ -651,7 +651,7 @@ fn render_minimal_messages(frame: &mut Frame, app: &AppState, area: Rect, palett
|
||||||
if msg.fell_back {
|
if msg.fell_back {
|
||||||
header_spans.push(Span::raw(" "));
|
header_spans.push(Span::raw(" "));
|
||||||
header_spans.push(Span::styled(
|
header_spans.push(Span::styled(
|
||||||
"⚠ fallback",
|
"[fallback]",
|
||||||
Style::default().fg(Color::Yellow).bold(),
|
Style::default().fg(Color::Yellow).bold(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
@ -986,7 +986,7 @@ fn render_workings_pane(frame: &mut Frame, app: &AppState, area: Rect, palette:
|
||||||
lines.push(Line::from(vec![
|
lines.push(Line::from(vec![
|
||||||
Span::raw(" "),
|
Span::raw(" "),
|
||||||
Span::styled(
|
Span::styled(
|
||||||
format!("⚡ pipeline: {pipe_name}"),
|
format!("› pipeline: {pipe_name}"),
|
||||||
Style::default().fg(palette.accent).bold(),
|
Style::default().fg(palette.accent).bold(),
|
||||||
),
|
),
|
||||||
]));
|
]));
|
||||||
|
|
@ -1035,7 +1035,7 @@ fn render_workings_pane(frame: &mut Frame, app: &AppState, area: Rect, palette:
|
||||||
} else if step.is_completed {
|
} else if step.is_completed {
|
||||||
lines.push(Line::from(vec![
|
lines.push(Line::from(vec![
|
||||||
Span::raw(" "),
|
Span::raw(" "),
|
||||||
Span::styled("[✔] ", Style::default().fg(Color::LightGreen).bold()),
|
Span::styled("[✓] ", Style::default().fg(Color::LightGreen).bold()),
|
||||||
Span::styled(
|
Span::styled(
|
||||||
format!("{}. {}", idx + 1, step.persona),
|
format!("{}. {}", idx + 1, step.persona),
|
||||||
Style::default().fg(Color::White).bold(),
|
Style::default().fg(Color::White).bold(),
|
||||||
|
|
@ -1084,7 +1084,7 @@ fn render_workings_pane(frame: &mut Frame, app: &AppState, area: Rect, palette:
|
||||||
if let Some(stage) = &app.workings.route_stage {
|
if let Some(stage) = &app.workings.route_stage {
|
||||||
lines.push(Line::from(vec![
|
lines.push(Line::from(vec![
|
||||||
Span::raw(" "),
|
Span::raw(" "),
|
||||||
Span::styled("⚡ ", Style::default().fg(palette.accent).bold()),
|
Span::styled("● ", Style::default().fg(palette.accent).bold()),
|
||||||
Span::styled(stage.clone(), Style::default().fg(palette.accent).bold()),
|
Span::styled(stage.clone(), Style::default().fg(palette.accent).bold()),
|
||||||
]));
|
]));
|
||||||
if let Some(details) = &app.workings.route_details {
|
if let Some(details) = &app.workings.route_details {
|
||||||
|
|
@ -1132,7 +1132,7 @@ fn render_workings_pane(frame: &mut Frame, app: &AppState, area: Rect, palette:
|
||||||
let (icon, color) = if att.is_success {
|
let (icon, color) = if att.is_success {
|
||||||
("•", Color::LightGreen)
|
("•", Color::LightGreen)
|
||||||
} else if att.is_error {
|
} else if att.is_error {
|
||||||
("✖", Color::LightRed)
|
("×", Color::LightRed)
|
||||||
} else {
|
} else {
|
||||||
(sp, Color::Yellow)
|
(sp, Color::Yellow)
|
||||||
};
|
};
|
||||||
|
|
@ -1231,7 +1231,7 @@ fn render_workings_pane(frame: &mut Frame, app: &AppState, area: Rect, palette:
|
||||||
]));
|
]));
|
||||||
for pipe in &app.pipelines {
|
for pipe in &app.pipelines {
|
||||||
lines.push(Line::from(vec![
|
lines.push(Line::from(vec![
|
||||||
Span::raw(" ⚡ "),
|
Span::raw(" › "),
|
||||||
Span::styled(&pipe.name, Style::default().fg(Color::Yellow)),
|
Span::styled(&pipe.name, Style::default().fg(Color::Yellow)),
|
||||||
]));
|
]));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue