Axe 3 (#52) : templates embarqués dans le binaire (web, python, rust, cli) - am init --template <stack> génère une config pré-remplie : groupe dev, profil par défaut, hooks projet (npm install / uv sync / cargo fetch) - substitution {project} {dir} au rendu ; --template list pour lister - fallback détection automatique de stack quand aucun template - config générée validée (parse YAML + validate) par les tests Axe 4 (#53) : am sessions export + rétention configurable - am sessions --export <id> [--output <fichier>] : JSON complet et reproductible (métadonnées + commandes history/<id>.jsonl + extrait de log 4 Ko + rendu lisible 'readable'), compatible archivage manuel - settings.sessions_retention_days (défaut 90) : purge au démarrage (silencieuse) et am sessions --retention <jours> - purge limitée à l'index dérivé sessions.json — le journal d'événements primaire n'est jamais touché ; EventKind::Prune journalisé (visibilité am audit) - sessions en cours (running) jamais purgées ; erreur claire si id inconnu REPL : sessions --export/--retention/--output + init --template ; help specs, tip cheat sheet, config.yaml, README, man pages régénérées. Version 0.4.7, ROADMAP cochée, 276 tests verts.
91 lines
3.1 KiB
Rust
91 lines
3.1 KiB
Rust
//! sessions command and session registry: lifecycle, counter, reconciliation
|
|
//! and CLI parsing.
|
|
|
|
mod common;
|
|
|
|
use agent_manager::cli::{Cli, Command};
|
|
use agent_manager::commands::sessions_cmd;
|
|
use agent_manager::sessions;
|
|
use clap::Parser;
|
|
|
|
#[test]
|
|
fn cli_parses_sessions() {
|
|
let cli = Cli::parse_from(["am", "sessions", "--status", "failed", "--show", "abc"]);
|
|
match &cli.command {
|
|
Some(Command::Sessions {
|
|
agent,
|
|
status,
|
|
show,
|
|
..
|
|
}) => {
|
|
assert!(agent.is_none());
|
|
assert_eq!(status.as_deref(), Some("failed"));
|
|
assert_eq!(show.as_deref(), Some("abc"));
|
|
}
|
|
other => panic!("unexpected command: {other:?}"),
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn agent_session_roundtrip_and_counter() {
|
|
let app = common::test_app("sess", &["sessions"]);
|
|
let id = sessions::start_agent(
|
|
&app,
|
|
"claude-code",
|
|
4242,
|
|
Some("/tmp".to_string()),
|
|
None,
|
|
vec![],
|
|
vec![],
|
|
None,
|
|
)
|
|
.unwrap();
|
|
let sf = sessions::load(&app).unwrap();
|
|
let r = sf.sessions.get(&id).unwrap();
|
|
assert_eq!(r.status, "running");
|
|
assert_eq!(r.agent.as_deref(), Some("claude-code"));
|
|
assert_eq!(app.state.load().unwrap().sessions_count, 1);
|
|
|
|
sessions::finish_agent(&app, "claude-code", Some(4242), 0, true).unwrap();
|
|
let sf = sessions::load(&app).unwrap();
|
|
let r = sf.sessions.get(&id).unwrap();
|
|
assert_eq!(r.status, "stopped");
|
|
assert_eq!(r.exit_code, Some(0));
|
|
assert!(r.ended_at.is_some());
|
|
}
|
|
|
|
#[test]
|
|
fn command_lists_sessions() {
|
|
let app = common::test_app("sesscmd", &["sessions"]);
|
|
sessions::start_agent(&app, "aider", 4242, None, None, vec![], vec![], None).unwrap();
|
|
let code = sessions_cmd::run(&app, None, None, None, None, None, None, None, None).unwrap();
|
|
assert_eq!(code, 0);
|
|
// --json path returns the row set without error.
|
|
sessions::finish_agent(&app, "aider", Some(4242), 0, true).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn resume_unknown_or_repl_session_errors() {
|
|
let app = common::test_app("resume", &["sessions"]);
|
|
assert!(sessions_cmd::run(&app, None, None, None, None, Some("inconnue"), None, None, None).is_err());
|
|
sessions::start_repl(&app, "r1", None).unwrap();
|
|
assert!(sessions_cmd::run(&app, None, None, None, None, Some("r1"), None, None, None).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn resume_dry_run_announces() {
|
|
let app = common::test_app("resumedry", &["sessions", "--dry-run"]);
|
|
let id = sessions::start_agent(&app, "claude-code", 4242, None, None, vec![], vec![], None).unwrap();
|
|
sessions::finish_agent(&app, "claude-code", Some(4242), 0, true).unwrap();
|
|
let code = sessions_cmd::run(&app, None, None, None, None, Some(&id), None, None, None).unwrap();
|
|
assert_eq!(code, 0, "dry-run resume");
|
|
}
|
|
|
|
#[test]
|
|
fn show_one_accepts_known_id() {
|
|
let app = common::test_app("sessshow", &["sessions"]);
|
|
let id = sessions::start_agent(&app, "jcode", 99, None, None, vec![], vec![], None).unwrap();
|
|
let code = sessions_cmd::run(&app, None, None, None, Some(&id), None, None, None, None).unwrap();
|
|
assert_eq!(code, 0);
|
|
}
|