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.
This commit is contained in:
+5
-5
@@ -19,21 +19,21 @@ fn context_detects_stack_from_markers() {
|
||||
fn generate_writes_valid_config_and_refuses_overwrite() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
std::fs::write(dir.path().join("Cargo.toml"), "[package]").unwrap();
|
||||
let path = init_cmd::generate(dir.path(), false).unwrap();
|
||||
let path = init_cmd::generate(dir.path(), false, None).unwrap();
|
||||
assert!(path.ends_with("agent-manager.yaml"));
|
||||
let text = std::fs::read_to_string(&path).unwrap();
|
||||
assert!(text.contains(r#"version: "1.0""#), "config valide: {text}");
|
||||
assert!(text.contains("smelt"), "agent recommande pour rust: {text}");
|
||||
// Un second appel sans --force échoue.
|
||||
assert!(init_cmd::generate(dir.path(), false).is_err());
|
||||
assert!(init_cmd::generate(dir.path(), false, None).is_err());
|
||||
// Avec --force, il écrase.
|
||||
assert!(init_cmd::generate(dir.path(), true).is_ok());
|
||||
assert!(init_cmd::generate(dir.path(), true, None).is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn generate_uses_default_for_empty_dir() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let path = init_cmd::generate(dir.path(), false).unwrap();
|
||||
let path = init_cmd::generate(dir.path(), false, None).unwrap();
|
||||
let text = std::fs::read_to_string(&path).unwrap();
|
||||
assert!(text.contains("claude-code"), "default agent: {text}");
|
||||
}
|
||||
@@ -41,6 +41,6 @@ fn generate_uses_default_for_empty_dir() {
|
||||
#[test]
|
||||
fn command_runs_dry() {
|
||||
let app = common::test_app("initdry", &["init", "--dry-run"]);
|
||||
let code = init_cmd::run(&app, false).unwrap();
|
||||
let code = init_cmd::run(&app, false, None).unwrap();
|
||||
assert_eq!(code, 0);
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ fn agent_session_roundtrip_and_counter() {
|
||||
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).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();
|
||||
@@ -67,9 +67,9 @@ fn command_lists_sessions() {
|
||||
#[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")).is_err());
|
||||
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")).is_err());
|
||||
assert!(sessions_cmd::run(&app, None, None, None, None, Some("r1"), None, None, None).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -77,7 +77,7 @@ 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)).unwrap();
|
||||
let code = sessions_cmd::run(&app, None, None, None, None, Some(&id), None, None, None).unwrap();
|
||||
assert_eq!(code, 0, "dry-run resume");
|
||||
}
|
||||
|
||||
@@ -85,6 +85,6 @@ fn resume_dry_run_announces() {
|
||||
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).unwrap();
|
||||
let code = sessions_cmd::run(&app, None, None, None, Some(&id), None, None, None, None).unwrap();
|
||||
assert_eq!(code, 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user