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:
+27
-14
@@ -14,6 +14,7 @@
|
||||
pub mod app;
|
||||
pub mod backup;
|
||||
pub mod catalog;
|
||||
pub mod templates;
|
||||
pub mod catalog_remote;
|
||||
pub mod cli;
|
||||
pub mod commands;
|
||||
@@ -79,21 +80,33 @@ fn real_main() -> i32 {
|
||||
}
|
||||
let cli = cli::Cli::parse();
|
||||
match app::App::from_cli(cli) {
|
||||
Ok(app) => match commands::execute(&app) {
|
||||
Ok(code) => code,
|
||||
Err(err) => {
|
||||
if app.json() {
|
||||
let payload = serde_json::json!({
|
||||
"error": format!("{:#}", err),
|
||||
});
|
||||
let _ = serde_json::to_writer_pretty(std::io::stdout(), &payload);
|
||||
let _ = writeln!(std::io::stdout());
|
||||
} else {
|
||||
eprintln!("{} {}", "error:".red().bold(), format!("{:#}", err));
|
||||
}
|
||||
1
|
||||
Ok(app) => {
|
||||
// Issue #53: enforce the session retention at every startup
|
||||
// (silent; the primary event journal is never touched).
|
||||
let days = app
|
||||
.config
|
||||
.settings
|
||||
.sessions_retention_days
|
||||
.unwrap_or(sessions::DEFAULT_RETENTION_DAYS);
|
||||
if let Err(e) = sessions::purge_expired(&app, days) {
|
||||
app.log.verbose(&format!("session retention skipped: {e:#}"));
|
||||
}
|
||||
},
|
||||
match commands::execute(&app) {
|
||||
Ok(code) => code,
|
||||
Err(err) => {
|
||||
if app.json() {
|
||||
let payload = serde_json::json!({
|
||||
"error": format!("{:#}", err),
|
||||
});
|
||||
let _ = serde_json::to_writer_pretty(std::io::stdout(), &payload);
|
||||
let _ = writeln!(std::io::stdout());
|
||||
} else {
|
||||
eprintln!("{} {}", "error:".red().bold(), format!("{:#}", err));
|
||||
}
|
||||
1
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
// Config could not even be loaded: fall back to plain stderr output.
|
||||
eprintln!("{} {}", "error:".red().bold(), format!("{:#}", err));
|
||||
|
||||
Reference in New Issue
Block a user