v0.4.1 : Phase 1 complete (17/17) - dashboard TUI (#33), favoris/notes/tags (#39), profils d'environnement (#40), completions dynamiques + man pages (#41), packaging officiel + CI (#42), self-update Gitea, state v3, 212 tests
release / linux (push) Failing after 23s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s

This commit is contained in:
2026-08-17 10:50:13 -04:00
parent 4f4cd034b2
commit 56732d672b
93 changed files with 9412 additions and 1270 deletions
+48
View File
@@ -20,6 +20,12 @@ struct InfoJson {
pid: Option<u32>,
installable: bool,
note: Option<String>,
/// Personal note (issue #39).
personal_note: Option<String>,
/// Personal tags (issue #39).
personal_tags: Vec<String>,
/// Favorite (issue #39).
favorite: bool,
platforms: Vec<String>,
run: Option<String>,
args: Vec<String>,
@@ -83,6 +89,9 @@ pub fn run(app: &App, name: &str) -> Result<i32> {
pid: if running { entry.as_ref().and_then(|e| e.pid) } else { None },
installable: agent.installable,
note: agent.note.clone(),
personal_note: annotations_note(app, &agent.name),
personal_tags: annotations_tags(app, &agent.name),
favorite: annotations_favorite(app, &agent.name),
platforms: agent.platforms.clone(),
run: agent.run.clone(),
args: agent.args.clone(),
@@ -274,9 +283,48 @@ pub fn run(app: &App, name: &str) -> Result<i32> {
println!();
println!(" {}", dim(&format!("note {n}")));
}
// --- Personal annotations (issue #39) -------------------------------------
let p_note = annotations_note(app, &agent.name);
let p_tags = annotations_tags(app, &agent.name);
let p_fav = annotations_favorite(app, &agent.name);
if p_fav || p_tags.iter().any(|t| !agent.tags.contains(t)) || p_note.is_some() {
println!();
println!(" {}", bold("personal"));
if p_fav {
println!(" {} {}", dim("● favorite"), "★");
}
if !p_tags.is_empty() {
println!(
" {} {}",
dim("● tags"),
p_tags
.iter()
.map(|t| format!("#{t}"))
.collect::<Vec<_>>()
.join(" ")
);
}
if let Some(n) = &p_note {
println!(" {} {}", dim("● note"), n);
}
}
Ok(0)
}
// Personal annotations helpers (issue #39) — never fail.
fn annotations_note(app: &App, name: &str) -> Option<String> {
app.state.annotation(name).ok().and_then(|a| a.note)
}
fn annotations_tags(app: &App, name: &str) -> Vec<String> {
app.state.annotation(name).map(|a| a.tags).unwrap_or_default()
}
fn annotations_favorite(app: &App, name: &str) -> bool {
app.state
.annotation(name)
.map(|a| a.favorite)
.unwrap_or(false)
}
fn external_path(agent: &AgentDef) -> Option<std::path::PathBuf> {
let first = agent.first_token()?;
which::which(first).ok()