agent-manager (am)
Gestionnaire en ligne de commande, écrit en Rust, pour les agents IA de coding installés localement : lister, installer, démarrer, arrêter, redémarrer, mettre à jour et désinstaller — avec gestion automatique des dépendances (Node.js, Python, Go, Rust, Bun, etc.) et un catalogue YAML de ~70 agents prêts à l'emploi.
Sommaire
- Fonctionnalités
- Installation
- Démarrage rapide
- Commandes
- Options globales
- Fichier de configuration
- Ajouter un agent
- Alias, groupes et mode interactif
- Gestion des processus
- Sécurité
- Tests
- Complétions shell
- Structure du projet
- Limites et feuille de route
Fonctionnalités
-
Catalogue intégré : ~70 agents connus (Claude Code, Codex, Gemini CLI, OpenCode, Aider, jcode, Prime Agent, l'écosystème OpenClaw, les SaaS, etc.), chacun avec sa méthode d'installation et ses dépendances.
-
9 méthodes d'installation :
type description npm / bun paquet global installé dans un préfixe local (jamais en -g système) pip / uv virtualenv privé par agent, sans toucher au site-packages système cargo cargo install --root <répertoire-local> go go install avec GOBIN local curl script d'installation téléchargé puis exécuté séparément (jamais de curl pipé vers sh) binary binaire précompilé depuis GitHub Releases ou URL directe, checksum vérifié, extraction zip/tar.gz git clone + build (make, cargo build --release, npm install…) puis copie du binaire ou shim -
Gestion des processus : avant-plan (stdio hérités) ou arrière-plan (détaché, PID enregistré, sortie vers un log) ; arrêt propre SIGTERM puis SIGKILL après un délai configurable.
-
Base d'état locale (state.json) : nom, version, chemin, binaires, PID, dates — plus la détection d'agents externes via le PATH. Les sondes de version sont exécutées en parallèle (timeout 4 s) et mises en cache (index du PATH et versions) : un am list à chaud prend ~50 ms.
-
Dépendances : vérification avant installation (node >= 18, etc.) avec messages actionnables ; installation automatique possible quand une commande d'installation est connue.
-
Sécurité : mode --dry-run universel, confirmations (--yes pour les sauter), validation des URL (http/https/file), vérification sha256, journalisation horodatée de toutes les commandes exécutées.
-
Confort développeur : sortie JSON stable (--json), couleurs (--no-color), mode verbeux, complétions bash/zsh/fish/powershell/elvish, alias, groupes (am start group:dev), mode interactif, export/import, doctor et self-update.
Installation
En une ligne (recommandé)
Windows (PowerShell) :
powershell -ExecutionPolicy Bypass -Command "irm https://git.dracodev.net/Projets/agent-manager/raw/branch/main/install.ps1 | iex"
Linux / macOS / WSL :
curl -fsSL https://git.dracodev.net/Projets/agent-manager/raw/branch/main/install.sh | sh
Le script télécharge le binaire précompilé de la dernière release du dépôt Gitea, l'installe dans un répertoire utilisateur et l'ajoute au PATH. Si aucun binaire ne correspond à votre plateforme, il compile automatiquement depuis les sources (cargo install --git). Relancez la même commande pour mettre à jour. Les scripts sont versionnés dans le dépôt (install.ps1, install.sh) — vous pouvez les lire avant de les exécuter.
Depuis les sources
Prérequis : Rust 1.70+ (le programme lui-même n'a aucune dépendance runtime ; les outils comme node/python ne sont nécessaires que pour les agents qui les utilisent).
# 1. cloner et compiler (binaire dans target/release/am)
git clone https://git.dracodev.net/Projets/agent-manager.git
cd agent-manager
cargo build --release
# 2. installer dans ~/.cargo/bin (sur le PATH)
cargo install --path .
# 3. vérifier
am --version
am doctor
Le binaire s'appelle am (agent-manager est le nom du paquet).
Ajouter les binaires des agents au PATH
Les agents installés par am vivent dans ~/.local/share/agent-manager/agents/bin (Linux), %LOCALAPPDATA%\agent-manager\agents\bin (Windows) ou ~/Library/Application Support/agent-manager/agents/bin (macOS). Ajoutez ce répertoire au PATH pour pouvoir lancer les agents directement :
# Linux/macOS — dans ~/.bashrc ou ~/.zshrc
export PATH="$HOME/.local/share/agent-manager/agents/bin:$PATH"
am doctor vous le rappelle si le répertoire n'est pas sur le PATH.
Démarrage rapide
am list # agents installés (gérés + externes)
am list --all # tout le catalogue, avec l'état de chacun
am search rust # recherche par mot-clé
am info jcode # fiche détaillée
am install claude-code # npm + vérification de node >= 18
am install aider --method pip # choisir la méthode 2 (pip) au lieu de uv
am install smelt --dry-run # simuler sans rien changer
am start claude-code # avant-plan (Ctrl-C pour quitter)
am start claude-code --background --env ANTHROPIC_MODEL=opus
am status claude-code
am stop claude-code # SIGTERM puis SIGKILL après 5 s
am restart codex --background
am update claude-code
am uninstall smelt --purge
am run pi "explique ce fichier" # exécution directe, sans gestion de process
am doctor --fix # vérifie l'environnement et répare
Commandes
| Commande | Description |
|---|---|
| am list [--all] [--category ] | agents installés (défaut) ; --all pour tout le catalogue |
| am start [--background] [--args ...] [--env K=V] [--notify] | démarre l'agent (avant-plan par défaut) |
| am stop [--force] [--timeout |
arrête un agent d'arrière-plan (PID enregistré) |
| am restart [--background] [--force] | arrête puis redémarre |
| am status [agent] | état d'un agent, ou de tous les agents installés |
| am install [--method <n | type>] [--force] |
| am uninstall [--purge] | désinstalle et nettoie (--purge : logs + entrée de config) |
| am update [--all] | met à jour vers la dernière version connue |
| am search <mot-clé> [--category ] | recherche dans le catalogue |
| am info | description, méthodes d'installation, commande, dépendances, site |
| am config show / path / edit / validate / add | gestion de la configuration |
| am doctor [--fix] | outils présents, validité de la config, chemins, permissions |
| am run [args...] | exécute la commande de l'agent directement |
| am completion | script de complétion (bash, zsh, fish, powershell, elvish) |
| am self-update [--check] | met à jour agent-manager depuis GitHub Releases |
| am export / am import | sauvegarde/restauration de la config + état |
| am (sans arguments) | shell interactif |
Statuts affichés par list/status : running (PID actif), installed (géré par am), external (trouvé sur le PATH, non géré), not-installed, not-installable (SaaS/desktop).
Options globales
Toutes les options globales fonctionnent avant ou après la sous-commande.
| Option | Description |
|---|---|
| -c, --config | fichier de configuration alternatif |
| -v, --verbose | affiche chaque commande exécutée et les détails |
| -q, --quiet | uniquement les erreurs |
| -y, --yes | répond oui à toutes les confirmations |
| --dry-run | simule l'action (aucune écriture, aucun téléchargement) |
| --json | sortie JSON stable sur stdout (les messages vont sur stderr) |
| --no-color | désactive les couleurs ANSI |
| -h, --help / -V, --version | aide / version |
Fichier de configuration
Emplacements (par ordre de priorité)
- --config (ou la variable d'environnement AGENT_MANAGER_CONFIG)
- ./agent-manager.yaml (répertoire courant)
- ~/.config/agent-manager/config.yaml (Windows : %APPDATA%\agent-manager\config.yaml)
- catalogue par défaut embarqué dans le binaire
Le fichier trouvé surcharge/complète le catalogue embarqué : un agent défini par l'utilisateur remplace celui du même nom ; les autres s'ajoutent.
Schéma (extrait)
version: "1.0"
settings:
install_dir: null # défaut: ~/.local/share/agent-manager/agents
log_dir: null # défaut: ~/.local/state/agent-manager/logs
default_shell: null # shell pour les scripts d'installation
auto_install_deps: true # proposer d'installer les dépendances manquantes
confirm_before_run: true # confirmer avant d'exécuter un script d'installation
stop_timeout_secs: 5 # délai SIGTERM -> SIGKILL
self_update_repo: null # "owner/repo" pour am self-update
aliases:
cc: claude-code # am start cc == am start claude-code
groups:
dev: [claude-code, aider, codex]
include: # modularité : autres fichiers (chemins relatifs)
- agents-perso.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"
# args: ["--omit=optional"] # arguments supplémentaires
# env: { FOO: bar } # environnement de l'installeur
# methods: [...] # méthodes alternatives (--method)
# post_install: ["claude setup"] # commandes après installation
dependencies:
- { name: node, min_version: "18.0.0", install_hint: "https://nodejs.org" }
run: claude
args: [] # arguments par défaut
env: {} # variables d'environnement par défaut
tags: [anthropic]
installable: true # false = listé mais non installable (SaaS/desktop)
note: null # explication affichée avec installable: false
platforms: [] # linux | macos | windows (vide = tous)
Les chemins acceptent ~ et les variables d'environnement ($HOME, ${VAR}). La configuration est validée au démarrage avec des messages précis (agent 'x': 'run' is required when installable, champs inconnus rejetés, doublons détectés).
Ajouter un agent
Créez ~/.config/agent-manager/config.yaml (am config edit) ou un fichier inclus (am config add mes-agents.yaml) puis :
version: "1.0"
agents:
# paquet npm
- name: mon-agent-npm
display_name: "Mon Agent"
install: { type: npm, package: mon-agent }
dependencies:
- { name: node, min_version: "18.0.0", install_hint: "https://nodejs.org" }
run: mon-agent
# paquet pip (virtualenv privé)
- name: mon-agent-python
display_name: "Mon Agent Python"
install: { type: pip, package: mon-agent-python }
dependencies:
- { name: python, min_version: "3.10.0", install_hint: "https://python.org" }
run: mon-agent
# binaire GitHub Releases (asset choisi selon plateforme/arch)
- name: mon-binaire
display_name: "Mon Binaire"
install:
type: binary
repo: owner/repo
binary: mon-binaire # nom de l'exécutable attendu
checksum: null # ou "sha256:..."
run: mon-binaire
# binaire via URL directe
- name: mon-binaire-2
display_name: "Mon Binaire 2"
install:
type: binary
url: "https://example.com/dl/mon-bin.tar.gz"
run: mon-bin
# script d'installation (téléchargé PUIS exécuté, jamais curl|sh)
- name: mon-script
display_name: "Mon Script"
install:
type: curl
script: "https://example.com/install.sh"
run: mon-script
platforms: [linux, macos]
# dépôt git + build
- name: mon-git
display_name: "Mon Git"
install:
type: git
repo: "https://github.com/owner/repo"
build: ["cargo", "build", "--release"] # ou "make build" (chaîne)
binary_path: target/release/mon-git # copié dans le bin dir
run: mon-git
# application desktop / SaaS : listée mais non installable
- name: mon-saas
display_name: "Mon SaaS"
installable: false
note: "SaaS — voir https://example.com"
Puis : am config validate, am install mon-agent-npm, etc.
Alias, groupes et mode interactif
am start cc # alias -> claude-code
am start group:dev # démarre tout le groupe "dev" en arrière-plan
am stop group:dev # arrête tout le groupe
am # shell interactif (rustyline) :
# am> inst<Tab> # complétion Tab : commandes, agents, alias,
# am> install jcode # group:xxx, options (--background, ...)
# am> start jcode --background
# am> exit
Le shell interactif offre la complétion par Tab (commandes, noms d'agents, alias, groupes, options) et un historique persistant (flèches haut/bas, fichier history.txt dans le répertoire d'état).
Gestion des processus
- Avant-plan (défaut) : la commande hérite de votre terminal ; am attend sa fin et propage son code de sortie. Ctrl-C interrompt l'agent.
- Arrière-plan (--background) : processus détaché (nouveau groupe de processus), PID enregistré dans state.json, stdout/stderr redirigés vers ~/.local/state/agent-manager/logs/.log. Si l'agent crashe au démarrage, am affiche la fin du log et échoue.
- Arrêt : am stop envoie SIGTERM (Windows : taskkill), attend stop_timeout_secs, puis SIGKILL (taskkill /F /T). --force court-circuite la phase gracieuse. Les PID périmés sont nettoyés automatiquement.
- Toutes les commandes exécutées sont journalisées avec horodatage dans <log_dir>/agent-manager.log (--verbose les affiche aussi).
Sécurité
- Les scripts d'installation (curl) sont téléchargés puis exécutés séparément — jamais de curl pipé directement vers sh. --verbose affiche leur contenu, confirm_before_run demande confirmation.
- --dry-run simule n'importe quelle action sans rien écrire.
- URL limitées à https, http et file (tests locaux).
- Checksums sha256 vérifiés quand ils sont fournis dans la config.
- Rien n'est exécuté avec des privilèges élevés ; tout vit dans les répertoires utilisateur. Les archives sont extraites avec protection contre le path traversal (zip-slip).
Tests
cargo test # tests unitaires + intégration (config, versions,
# dry-run, processus, doctor, installateurs)
cargo test -- --nocapture
Les tests d'installation utilisent des mocks et le mode dry-run : aucun réseau, aucune installation réelle. Les tests de processus spawnent sleep/ping et vérifient le cycle démarrage → détection → arrêt.
Complétions shell
am completion bash > completions/am.bash # fournies dans completions/
am completion zsh > completions/_am
am completion fish > completions/am.fish
am completion powershell > completions/_am.ps1
# bash
source completions/am.bash
# zsh
fpath+=(completions) && compinit
# fish
cp completions/am.fish ~/.config/fish/completions/am.fish
Structure du projet
src/
main.rs # point d'entrée (binaire am)
lib.rs # crate bibliothèque (testable)
cli.rs # définition clap des commandes
app.rs # contexte applicatif (config, chemins, état, log)
config.rs # schéma YAML, chargement, includes, fusion, validation
catalog.rs # catalogue fusionné : lookup, alias, groupes, recherche
state.rs # base locale JSON (installations, PID)
runner.rs # exécution de commandes (réelle / mock / dry-run)
process.rs # spawn détaché, détection, SIGTERM/SIGKILL, logs
download.rs # téléchargement, checksums, releases GitHub, archives
deps.rs # vérification des dépendances (node >= 18, ...)
doctor.rs # diagnostic d'environnement + réparations
output.rs # logger horodaté, tableaux, JSON, couleurs
installers/ # npm, bun, pip, uv, cargo, go, curl, binary, git
commands/ # une implémentation par commande
repl.rs # mode interactif
config.yaml # catalogue par défaut (~70 agents, embarqué)
tests/ # tests d'intégration
completions/ # scripts de complétion générés
Limites et feuille de route
- Les applications desktop (Warp, openyak, Kun, cc-haha) et les SaaS (Devin, Amp, Junie, Cortex, Tabnine, Mentat) sont listés avec installable: false et un lien — ils ne sont pas installables localement.
- La mise à jour compare la version installée à la dernière connue (registry npm/PyPI/crates.io, tag GitHub) puis réinstalle.
- Pistes futures : plugins d'installation dynamiques, notifications Windows natives, intégration tmux, tests d'intégration avec des registres simulés.