# đŸ—ïž Document d'architecture — agent-manager (`am`) > Ce document dĂ©crit la conception, le fonctionnement et les fonctionnalitĂ©s de **agent-manager** (binaire `am`), un CLI Rust multiplateforme pour gĂ©rer des agents IA de coding locaux. > > 📩 Version : `0.6.0` · 🩀 Rust 2021 · ✅ Windows · ✅ Linux · ✅ macOS --- ## 🎯 Vue d'ensemble `am` est un gestionnaire d'agents IA de coding qui permet de : - 📋 DĂ©couvrir et lister plus de **72 agents** via un catalogue YAML embarquĂ© - 📩 Les installer avec **9 mĂ©thodes** diffĂ©rentes (npm, pip, uv, cargo, go, bun, curl, binaire, git) - 🚀 Les dĂ©marrer, arrĂȘter, redĂ©marrer en avant-plan ou en arriĂšre-plan - 🔍 Observer leur Ă©tat, leurs logs, leurs statistiques d'utilisation - đŸ› ïž GĂ©rer dĂ©pendances, alias, groupes, profils, secrets, favoris et annotations Le tout sans toucher au systĂšme : chaque agent est installĂ© dans un rĂ©pertoire utilisateur isolĂ©. --- ## đŸ§© Architecture globale ```mermaid flowchart TB subgraph UI["đŸ–„ïž Interfaces utilisateur"] CLI["Ligne de commande
clap v4"] REPL["Shell interactif
rustyline"] TUI["Dashboard TUI
ratatui + crossterm"] WEB["Dashboard web
tiny_http (127.0.0.1)"] end subgraph CORE["⚙ Noyau applicatif"] APP["App
contexte partagé"] CLI_DEF["cli.rs
définition des commandes"] CMD["commands/
dispatch"] end subgraph DATA["đŸ’Ÿ DonnĂ©es persistantes"] CONFIG["Configuration YAML
embarquée + utilisateur"] CATALOG["Catalog
index agents/alias/groupes"] STATE["StateStore
state.json"] EVENTS["Journal JSONL
events-YYYYMM.jsonl"] CACHE["Probe cache
probe-cache.json"] end subgraph EXEC["🔧 ExĂ©cution"] RUNNER["Runner trait
systĂšme / mock"] INSTALLERS["installers/
9 méthodes"] DEPS["deps.rs
vérification dépendances"] PROCESS["process.rs
PID / signaux"] end subgraph OBS["đŸ‘ïž Observation"] PROBE["probe.rs
détection agents externes"] DASH["dashboard.rs
agrégation"] STATS["stats.rs
statistiques"] SESSIONS["sessions.rs
registre sessions"] end CLI --> APP REPL --> APP TUI --> APP APP --> CLI_DEF APP --> CONFIG APP --> CATALOG APP --> STATE APP --> EVENTS APP --> CACHE CMD --> RUNNER CMD --> INSTALLERS CMD --> DEPS CMD --> PROCESS CMD --> PROBE CMD --> DASH CMD --> STATS CMD --> SESSIONS ``` --- ## 🚀 Flux d'exĂ©cution d'une commande ```mermaid sequenceDiagram autonumber participant User participant main as main.rs participant lib as lib.rs participant help as help.rs participant cli as cli.rs participant app as app.rs participant cfg as config.rs participant state as state.rs participant cmd as commands/mod.rs participant impl as commands/xxx_cmd.rs User->>main: am install jcode main->>lib: main_entry() lib->>lib: spawn thread 8 Mo lib->>help: intercept(-h/--help) ? help-->>lib: None lib->>cli: Cli::parse() cli-->>lib: Cli { command: Install {...} } lib->>app: App::from_cli(cli) app->>cfg: load() config embarquĂ©e + user cfg-->>app: Config app->>state: StateStore::new() state-->>app: state.json chargĂ© app-->>lib: App lib->>cmd: commands::execute(&app) cmd->>impl: install_cmd::run(...) impl->>impl: vĂ©rifier dĂ©pendances, installer impl->>state: persister impl->>app: emit(event install) impl-->>cmd: Ok(0) cmd-->>lib: 0 lib-->>main: code sortie ``` --- ## 📁 Structure du code source ``` src/ ├── main.rs đŸšȘ Point d'entrĂ©e ├── lib.rs 🧭 main_entry(), doc du crate ├── cli.rs 📋 DĂ©finition clap de toutes les commandes ├── app.rs 🧰 Contexte App (config, state, paths, logger, theme) ├── config.rs ⚙ SchĂ©ma YAML, chargement, fusion, validation ├── catalog.rs 🔍 Index agents + recherche fuzzy + suggestions ├── state.rs đŸ’Ÿ Base JSON des installations et annotations ├── events.rs 📝 Journal d'Ă©vĂ©nements JSONL ├── runner.rs 🏃 Trait d'exĂ©cution systĂšme / mock ├── process.rs ⚙ Lancement, arrĂȘt, signaux des processus ├── deps.rs ✅ VĂ©rification et auto-installation des dĂ©pendances ├── toolchain.rs đŸ–„ïž DĂ©tection OS / gestionnaire de paquets ├── download.rs âŹ‡ïž TĂ©lĂ©chargement, checksums, extraction ├── probe.rs 🔎 DĂ©tection des agents externes sur le PATH ├── dashboard.rs 📊 DonnĂ©es agrĂ©gĂ©es du dashboard ├── ps.rs 🧼 Table des processus ├── context.rs 📂 Contexte du projet courant ├── repl.rs 💬 Shell interactif ├── shell.rs 🐚 Gestion des shells supportĂ©s ├── help.rs ❓ Aide Nushell-style ├── output.rs đŸ–šïž Logger et rendu ├── tables.rs 📋 Rendu tabulaire ├── theme.rs 🎹 ThĂšmes de couleur (REPL et tableaux) ├── web.rs 🌐 Serveur HTTP local (127.0.0.1) + API JSON + frontend embarquĂ© ├── frontend/ 📄 index.html — dashboard web (HTML5 + CSS + JS vanilla, include_str!) ├── history.rs âȘ Historique des commandes ├── sessions.rs 📅 Registre des sessions ├── projects.rs đŸ—‚ïžïž AgrĂ©gation par projet ├── hooks.rs đŸȘ Hooks de cycle de vie ├── secrets.rs 🔒 Gestion des secrets (keyring OS) ├── version.rs đŸ·ïž Informations de version ├── commands/ 📩 35 modules, un par commande └── installers/ 📩 9 installateurs spĂ©cialisĂ©s ``` --- ## ⚙ Configuration : catalogue YAML extensible ### HiĂ©rarchie de chargement ```mermaid flowchart LR EMB["📩 config.yaml
embarquĂ© dans le binaire"] --> MERGE["🔀 Fusion"] USER["đŸ‘€ ~/.config/agent-manager/config.yaml"] --> MERGE LOCAL["📂 ./agent-manager.yaml"] --> MERGE FLAG["⚡ --config "] --> MERGE MERGE --> EFFECTIVE["✅ Configuration effective"] ``` PrioritĂ© (la plus prioritaire en dernier) : 1. `config.yaml` embarquĂ© (catalogue par dĂ©faut, ~72 agents) 2. `~/.config/agent-manager/config.yaml` 3. `./agent-manager.yaml` (configuration locale par projet) 4. `--config ` ### SchĂ©ma de configuration ```yaml version: "1.0" settings: install_dir: null # ~/.local/share/agent-manager/agents log_dir: null # ~/.local/state/agent-manager/logs default_shell: null # shell utilisateur par dĂ©faut auto_install_deps: true # proposer d'installer les dĂ©pendances manquantes confirm_before_run: true # confirmer avant les scripts d'installation stop_timeout_secs: 5 # dĂ©lai SIGTERM → SIGKILL self_update_repo: Projets/agent-manager self_update_base_url: https://git.dracodev.net/api/v1 theme: null hooks: on_install: [] on_start: [] on_stop: [] on_update: [] aliases: cc: claude-code gemini: gemini-cli groups: dev: [claude-code, aider, codex] include: - ./extra-agents.yaml agents: - name: claude-code display_name: "Claude Code" description: "..." category: coding-agent website: https://github.com/anthropics/claude-code install: type: npm package: "@anthropic-ai/claude-code" dependencies: - { name: node, min_version: "18.0.0" } run: claude tags: [anthropic, assistant] profiles: dev: agent: claude-code env: { API_ENV: dev } args: [--verbose] projects: mon-projet: root: ~/projets/mon-projet default_agent: claude-code env: { KEY: value } ``` ### DĂ©finition d'un agent (`AgentDef`) | Champ | Description | |-------|-------------| | `name` | Identifiant unique (slug) | | `display_name` | Nom lisible | | `description` | Description longue | | `category` | CatĂ©gorie (coding-agent, assistant, local-first...) | | `website` | URL du projet | | `install` | SpĂ©cification d'installation | | `dependencies` | Outils requis (node, python, go...) avec version min | | `run` | Commande de lancement | | `args` | Arguments par dĂ©faut | | `env` | Variables d'environnement par dĂ©faut | | `tags` | Tags pour recherche/filtrage | | `installable` | `false` pour les agents SaaS/Desktop | | `platforms` | Restriction `linux`/`macos`/`windows` | ### MĂ©thodes d'installation supportĂ©es | Type | Fichier | Principe | |------|---------|----------| | `npm` | `installers/npm.rs` | `npm install -g --prefix ` | | `bun` | `installers/npm.rs` | `bun install -g` | | `pip` / `uv` | `installers/pipuv.rs` | virtualenv privĂ© dans `install_dir` | | `cargo` | `installers/cargo.rs` | `cargo install --root` | | `go` | `installers/golang.rs` | `go install` avec `GOBIN` local | | `curl` | `installers/script.rs` | TĂ©lĂ©charge et exĂ©cute un script | | `binary` | `installers/binary.rs` | Release GitHub/Gitea → extraction archive | | `git` | `installers/git.rs` | Clone + build + `binary_path` | --- ## đŸ’Ÿ Gestion des Ă©tats ### `state.json` — base d'installation locale Format JSON version 3, atomique (Ă©criture `.tmp` + `rename`). ```json { "version": 3, "installed": { "jcode": { "name": "jcode", "version": "0.76.0", "method": "binary", "directory": ".../agents/jcode", "binaries": ["jcode"], "pid": null, "installed_at": "...", "updated_at": "..." } }, "annotations": { "jcode": { "favorite": true, "note": "mon agent prĂ©fĂ©rĂ©", "tags": ["perso"] } } } ``` ### Journal d'Ă©vĂ©nements JSONL - Un fichier par mois : `events-YYYYMM.jsonl` - Append-only, horodatĂ© - Types d'Ă©vĂ©nements : `start`, `stop`, `run`, `install`, `update`, `uninstall`, `doctor`, `config`, `repl`, `shell`, `annotate` - Les secrets ne sont jamais journalisĂ©s - Source de vĂ©ritĂ© pour les statistiques, sessions, projets et timeline ### Cache de sondes `probe-cache.json` Ă©vite de re-scanner le PATH Ă  chaque commande pour dĂ©tecter les agents externes et leurs versions. --- ## đŸ›Ąïž Gestion des dĂ©pendances ```mermaid flowchart LR INSTALL["am install jcode"] --> CHECK["deps::check_dep"] CHECK --> MISSING{Manquant ?} MISSING -->|Oui| DETECT["toolchain::detect OS"] DETECT --> COMMANDS["toolchain::install_commands"] COMMANDS --> PROMPT["Proposer la commande"] PROMPT --> AUTO["ExĂ©cuter si --yes"] AUTO --> INSTALL2["installers::run_install"] MISSING -->|Non| INSTALL2 ``` - `deps.rs` vĂ©rifie chaque dĂ©pendance via ` --version` - `toolchain.rs` dĂ©tecte l'OS et le gestionnaire de paquets : - Windows : `scoop` → `winget` - Linux : `apt` / `dnf` / `pacman` / `apk` - macOS : `brew` - Si `auto_install_deps: true`, `am` propose et peut exĂ©cuter la commande d'installation - Les dĂ©pendances de l'agent (modules npm/pip) restent isolĂ©es dans le rĂ©pertoire `install_dir` --- ## ⚡ Gestion des processus ```mermaid flowchart TB START["am start "] --> MODE{Mode ?} MODE -->|Foreground| FG["Attache au terminal
Ctrl-C pour quitter"] MODE -->|Background| BG["spawn_background()"] BG --> LOG["Redirection stdout/stderr
vers log agent"] LOG --> PID["Enregistrement PID
dans state.json"] PID --> EVENT["Émission Ă©vĂ©nement start"] STOP["am stop "] --> SIGTERM["SIGTERM"] SIGTERM --> WAIT{"Processus terminĂ© ?"} WAIT -->|Non| SIGKILL["SIGKILL aprĂšs timeout"] WAIT -->|Oui| CLEAN["PID effacĂ©"] ``` - DĂ©marrage avant-plan (`-f`) ou arriĂšre-plan (`-b`, `--background`) - Variables d'environnement injectĂ©es via `--env KEY=VALUE` - Secrets via `--env KEY=@secret` (rĂ©solu depuis le trousseau OS) - ArrĂȘt gracieux avec timeout configurable (dĂ©faut 5 s) - Notifications desktop optionnelles (`--notify`) --- ## 📋 Commandes dĂ©taillĂ©es ### 🔍 DĂ©couvrir | Commande | Description | |----------|-------------| | `am list` | Agents installĂ©s + dĂ©tectĂ©s sur le PATH | | `am list --all` | Tout le catalogue avec Ă©tat | | `am search ` | Recherche fuzzy avec suggestions | | `am info ` | Fiche dĂ©taillĂ©e | | `am status [agent]` | État, version, PID, logs | ### 📩 Cycle de vie | Commande | Description | |----------|-------------| | `am install ` | Installe un agent et ses dĂ©pendances | | `am install --method pip` | Choisit la mĂ©thode | | `am uninstall [--purge]` | DĂ©sinstalle et nettoie | | `am update ` / `--all` | Met Ă  jour | | `am start [agent]` | Lance en avant-plan | | `am start -b` | Lance en arriĂšre-plan | | `am stop ` | ArrĂȘt gracieux | | `am restart ` | RedĂ©marrage | | `am run [args...]` | ExĂ©cution directe sans gestion de PID | ### đŸ‘ïž Observer | Commande | Description | |----------|-------------| | `am logs ` | Tail du log agent | | `am log [agent]` | Journal des Ă©vĂ©nements `am` | | `am timeline` | Vue chronologique unifiĂ©e | | `am sessions [agent]` | Registre des sessions | | `am stats [agent] --period 7d` | Statistiques d'utilisation | | `am top --period 30d` | Top 10 agents | | `am report --last-week` | Rapport markdown | | `am projects [nom]` | Agents par projet | | `am dashboard` | Dashboard TUI temps rĂ©el | | `am watch --restart` | Supervision et relance automatique | ### 🎯 Personnaliser | Commande | Description | |----------|-------------| | `am favorite ` | Marquer comme favori | | `am note ` | Ajouter une note | | `am tag ` | Taguer | | `am tags [agent]` | Lister les tags | | `am profile list/show ` | Profils d'environnement | | `am alias add ` | CrĂ©er un alias | | `am secret set --agent --value ` | Secret dans le trousseau | ### đŸ› ïž SystĂšme | Commande | Description | |----------|-------------| | `am doctor [--fix]` | Diagnostic environnement | | `am config show/path/edit/validate/set` | Gestion config | | `am completion ` | Script de complĂ©tion | | `am man [commande]` | Page de manuel | | `am open ` | Ouvrir le rĂ©pertoire d'installation | | `am export/import` | Sauvegarde/restauration | | `am self-update [--check]` | Mise Ă  jour de `am` | | `am self-uninstall` | DĂ©sinstallation complĂšte | | `am version` | Version et build | | `am` (sans commande) | REPL interactif | --- ## 🌐 Options globales Disponibles avant ou aprĂšs la sous-commande. | Option | Effet | |--------|-------| | `-c, --config ` | Fichier de configuration alternatif | | `-v, --verbose` | Affiche chaque commande exĂ©cutĂ©e | | `-q, --quiet` | Seules les erreurs sont affichĂ©es | | `-y, --yes` | Oui Ă  toutes les confirmations | | `--dry-run` | Simulation sans modification | | `--json` | Sortie JSON structurĂ©e | | `--no-color` | DĂ©sactive les couleurs | | `--theme ` | ThĂšme de couleur | --- ## 🎹 FonctionnalitĂ©s avancĂ©es ### Alias ```yaml aliases: cc: claude-code gemini: gemini-cli ``` `am start cc` dĂ©marre `claude-code`. ### Groupes ```yaml groups: dev: [claude-code, aider, codex] ``` `am start group:dev` dĂ©marre tous les agents du groupe en arriĂšre-plan. ### Profils d'environnement ```yaml profiles: dev: agent: claude-code env: { API_ENV: dev } args: [--verbose] ``` `am start --profile dev` lance `claude-code` avec les variables et arguments du profil. ### Projets ```yaml projects: mon-projet: root: ~/projets/mon-projet default_agent: claude-code ``` Dans le rĂ©pertoire du projet, `am start` sans argument lance l'agent par dĂ©faut du projet. ### Secrets Les secrets sont stockĂ©s dans le trousseau du systĂšme d'exploitation (via `keyring`), jamais en clair dans la config. ```bash am secret set OPENAI_API_KEY --agent claude-code --value sk-... am start claude-code --env OPENAI_API_KEY=@secret ``` ### Hooks Commandes exĂ©cutĂ©es automatiquement aux Ă©tapes clĂ©s du cycle de vie : - `on_install` - `on_start` - `on_stop` - `on_update` DĂ©finissables globalement dans `settings.hooks` ou par projet. ### Shell interactif (REPL) LancĂ© par `am` sans sous-commande : - ComplĂ©tion Tab personnalisĂ©e (commandes, agents, alias, groupes, flags, shells, thĂšmes) - Historique des commandes - Passerelle systĂšme : commandes inconnues exĂ©cutĂ©es dans le shell actif - Commandes internes : `ls`, `dir`, `cd`, `ps`, `where`, `get`, `shell`, `theme`, `exit`, `/help` - BanniĂšre ASCII art --- ## 📊 Dashboard TUI ```mermaid flowchart LR DASH["am dashboard"] --> OVER["Overview"] DASH --> ACT["ActivitĂ©"] DASH --> STATS["Statistiques"] DASH --> SESS["Sessions"] DASH --> PROJ["Projets"] ``` - Navigation : `Tab` / `←` / `→` pour les onglets - DĂ©filement : `j` / `k` ou flĂšches - Quitter : `q` - DonnĂ©es agrĂ©gĂ©es depuis `state.json`, le journal d'Ă©vĂ©nements, les sessions et les projets --- ## đŸ§Ș Tests ### Organisation - **Tests unitaires** : dans chaque module `src/*.rs` sous `#[cfg(test)]` - **Tests d'intĂ©gration** : dans `tests/` ### Fichiers de tests notables | Fichier | Couverture | |---------|------------| | `annotations_test.rs` | Favoris, notes, tags | | `config_test.rs` | Chargement/validation/fusion | | `dashboard_test.rs` | Dashboard | | `doctor_test.rs` | `am doctor` | | `dry_run_test.rs` | Mode `--dry-run` | | `events_test.rs` | Journal d'Ă©vĂ©nements | | `history_test.rs` | Historique | | `process_test.rs` | Processus | | `profiles_test.rs` | Profils | | `projects_test.rs` | Projets | | `sessions_test.rs` | Sessions | | `stats_test.rs` | Statistiques | Lancer les tests : ```bash cargo test ``` --- ## 📩 Packaging et distribution ``` dist/ Binaires prĂ©compilĂ©s ├── am-linux-x86_64 ├── am-linux-aarch64 ├── am-windows-x86_64.zip ├── am_0.4.3_amd64.deb └── ... packaging/ Scripts de packaging ├── deb/ ├── rpm/ ├── homebrew/ ├── scoop/ └── winget/ completions/ Scripts de complĂ©tion ├── _am zsh ├── _am.ps1 PowerShell ├── am.bash bash ├── am.elv elvish └── am.fish fish man/ Pages de manuel gĂ©nĂ©rĂ©es ``` - `build.rs` enregistre le commit et la branche git pour `am version` - `scripts/build-release.ps1` construit les releases multiplateformes - `scripts/render-manifests.ps1` gĂ©nĂšre les manifests de packaging --- ## đŸ—‚ïžïž Arborescence des donnĂ©es utilisateur ### Windows ``` %LOCALAPPDATA%\agent-manager\ ├── agents\ installations ├── logs\ logs agents └── state\ state.json, events-*.jsonl, probe-cache.json ``` ### Linux ``` ~/.local/share/agent-manager/ donnĂ©es ~/.local/state/agent-manager/ logs, state, events, cache ~/.config/agent-manager/ config.yaml ``` ### macOS ``` ~/Library/Application Support/agent-manager/ donnĂ©es ~/.local/state/agent-manager/ logs, state, events, cache ~/.config/agent-manager/ config.yaml ``` Variables d'environnement de dĂ©bogage/test : - `AGENT_MANAGER_DATA` : remplace le rĂ©pertoire de donnĂ©es - `AGENT_MANAGER_STATE` : remplace le rĂ©pertoire d'Ă©tat --- ## 🔐 SĂ©curitĂ© - Mode `--dry-run` universel pour simuler sans modifier - Checksums `sha256` pour les binaires tĂ©lĂ©chargĂ©s - Confirmation avant exĂ©cution des scripts d'installation - Secrets dans le trousseau OS, jamais dans les logs ni le journal - Installation isolĂ©e : aucune modification systĂšme --- ## 🔁 RĂ©sumĂ© du flux de donnĂ©es ```mermaid flowchart LR CONFIG["📄 YAML config"] --> CATALOG["📚 Catalog"] CATALOG --> INSTALL["📩 Installateurs"] INSTALL --> STATE["đŸ’Ÿ state.json"] STATE --> PROCESS["⚙ Processus"] PROCESS --> EVENTS["📝 Journal JSONL"] EVENTS --> STATS["📊 Stats / Dashboard"] EVENTS --> SESSIONS["📅 Sessions"] EVENTS --> PROJECTS["đŸ—‚ïžïž Projets"] ``` --- ## 📚 RĂ©fĂ©rences - `src/lib.rs:4` : documentation d'architecture du crate - `src/cli.rs:24` : options globales - `src/cli.rs:61` : Ă©numĂ©ration des commandes - `src/app.rs:16` : struct `App` - `src/config.rs:25` : struct `Config` - `src/config.rs:148` : struct `AgentDef` - `src/config.rs:241` : enum `InstallType` - `src/state.rs:12` : struct `StateFile` - `src/events.rs:57` : struct `Event` - `README.md` : documentation utilisateur complĂšte --- *Document gĂ©nĂ©rĂ© pour agent-manager v0.4.3* 🚀