Compare commits

...
113 Commits
Author SHA1 Message Date
bruno b7f29baea5 fix: assistant setup — liste des providers construite depuis le registre (QwenCloud absents de la liste codee en dur, v1.1.9)
release / release (push) Successful in 13m41s
release / macos (push) Canceled after 0s
2026-09-01 11:40:05 -04:00
bruno cf53c98d98 feat: providers QwenCloud v1.1.8 — token-plan (Credits) et pay-as-you-go (Model Studio/DashScope), qwen-code configure par defaut
release / release (push) Successful in 13m39s
release / macos (push) Canceled after 0s
2026-09-01 10:20:07 -04:00
bruno 991c79de50 feat: catalogue v1.1.7 — Antigravity CLI remplace Gemini CLI (fin de service 2026-06-18)
release / release (push) Successful in 14m0s
release / macos (push) Canceled after 0s
- nouvelle entrée 'antigravity-cli' (agy, release GitHub google-antigravity/antigravity-cli, binaire Go)
- 'gemini-cli' marqué déprécié : installable: false (réservé clé API payante), note de migration
- alias gemini/agy -> antigravity-cli ; groupe mainstream et gabarit web mis à jour
- setup_hints: agy (auth trousseau) + agy plugin import gemini (import extensions/skills)
- ROADMAP v1.1.7, README 78 agents, man pages régénérées
2026-09-01 08:48:20 -04:00
bruno d911ce5d92 fix: robustesse v1.1.6 — timeout runner/doctor, anti-deadlock, securite migrate, win32 is_running, websocket RFC6455, keyring JSON
release / release (push) Successful in 13m38s
release / macos (push) Canceled after 0s
- runner.rs: timeout 30s sur les commandes capturees (doctor ne pend plus) + pipes stdout/stderr draines dans des threads (anti-deadlock) ; run_untimed() pour les installations longues (npm/cargo/go) — sh() des installateurs l'utilise, les sondes gardent le timeout

- migrate_cmd.rs: rejet des chemins unsafe (path traversal) dans import_bundle

- process.rs: is_running Windows via OpenProcess/GetExitCodeProcess (fiable vs tasklist)

- probe.rs: drain des pipes en threads dans detect_external_version

- web.rs: boucle de traduction i18n (curseur, plus de boucle infinie si la traduction contient {{)

- serve.rs: frames WebSocket RFC 6455 avec vraies longueurs > 125 octets (126/127)

- secrets.rs: index keyring serialise en JSON (cles contenant des virgules)

- sandbox.rs: tests sans fuite de TempDir (plus de mem::forget)

- version 1.1.6, man pages et ROADMAP maj
2026-08-26 10:17:17 -04:00
bruno fa2c42d505 docs: roadmap 3.1 — bilan du 2026-08-23 (reste a faire, bug doctor/runner sans timeout, 11 idees neuves) 2026-08-23 23:25:30 -04:00
bruno e637c066fe fix: am ai avec aichat >= 0.30 — rôles index.yaml + agents.txt, contexte filtré, generation --code (v1.1.5)
- roles.rs: aichat 0.30 a remplace les agents markdown agents/<name>.md
  par functions/agents/<name>/index.yaml + registre functions/agents.txt;
  generate_all ecrit les DEUX formats (compat <= 0.29 et >= 0.30)
- ai_cmd.rs: role_args detecte la definition index.yaml en premier
  ('Unknown agent am-copilot' corrige) ; contexte par defaut (dossier
  courant) filtre par am (.git, target, node_modules, binaires non-UTF-8,
  .env*, > 64 KiB, budget 128 KiB, 40 fichiers max) — aichat ne filtre
  rien et echouait sur .git/index ; exec mode utilise le role am-do
  par defaut (commande brute)
- shell_ai.rs: generation via --code au lieu de --execute --dry-run
  (aichat 0.30: --dry-run echo la requete sans appeler l'API)
- version 1.1.5, man pages et ROADMAP maj
2026-08-21 12:22:18 -04:00
bruno 66a3eebbd6 feat: hints de configuration post-install (setup_hints) — commandes manuelles affichees apres install avec substitution {model}/{provider}/{base_url} (picoclaw onboard/model/auth)
release / release (push) Failing after 2m10s
release / macos (push) Skipped
2026-08-21 11:08:22 -04:00
bruno e71cffb3c0 fix: am start <agent> passait le token run en argument (binaire enregistre existant) — picoclaw rejetait son propre nom, aichat recevait 'aichat' en prompt 2026-08-21 10:32:26 -04:00
bruno 7fb65c257d feat: am setup — provider openrouter + modeles proposes ; am ai — role am-copilot par defaut ; fix migrate import (config active)
release / release (push) Successful in 13m7s
release / macos (push) Canceled after 0s
- setup: openrouter ajoute aux CHOICES (base URL, OPENROUTER_API_KEY,
  6 modeles declares dans le registre embarqué, proposes au choix)
- setup: pick_model liste les modeles disponibles (registre) + autre modele
- am ai sans --role: am-copilot par defaut (regeneration auto des roles si
  fichier manquant, degradation douce si echec; role explicite inconnu = erreur)
- fix migrate --import: import_bundle ecrivait la config dans user_config_dir()
  GLOBAL -> ecrasait la config reelle de la machine (et cargo test detruisait
  la config utilisateur a chaque suite via export_import_round_trip).
  L'import ecrit desormais dans app.paths.config_dir (config active).
v1.1.2
2026-08-21 08:36:26 -04:00
bruno 068940495a fix: am setup — ecrire settings.providers.<nom>.base_url + default_model (top-level 'providers:' rejete par le validateur)
release / release (push) Successful in 13m11s
release / macos (push) Canceled after 0s
Le wizard persistait le modele par defaut sous la cle 'providers.<nom>.default_model'
-> bloc 'providers:' au top-level de la config user -> 'unknown field providers'
(le registre vit sous settings.providers ; le schema exige base_url quand un
bloc provider est ecrit). Regression couverte par setup_persists_under_settings_providers.
v1.1.1
2026-08-21 07:43:26 -04:00
bruno d71c3dd34d feat: epique v1.1.0 — onboarding, copilot & roles aichat (am setup)
release / release (push) Successful in 13m21s
release / macos (push) Canceled after 0s
F1 — Wizard d'onboarding (src/setup.rs) :
- am setup : provider (anthropic, openai, deepseek, google, ollama, custom),
  token masque (rpassword) -> keyring OS (jamais en clair), modele par defaut
  (liste declaree + champ libre), ping API non-bloquant
- Declencheurs non-bloquants : am ai / am ask et banner REPL proposent
  am setup quand aucun provider n'est configure ; re-executable (mode revoir)
- settings.default_provider + providers.* ecrits via persist_setting

F2 — Integration aichat :
- Etape wizard 'Installer le moteur IA (aichat) ? [Y/n]' -> am install aichat
- am ai sans aichat -> 'aichat est manquant. Installer ? [Y/n]'
- install.ps1/install.sh enchainent sur am setup si stdin interactif

F3 — Roles copilot aichat (src/roles.rs) :
- 6 agents generes dans ~/.config/aichat/agents (ou %APPDATA%\aichat\agents) :
  am-copilot, am-operator, am-dev, am-do, am-analyst, am-orchestrator
- Prompts bilingues (FR defaut) privilegiant les contrats --json ; le prompt
  am-copilot embarque la liste des commandes am
- am ai --role <nom> (valide le fichier genere, passe --agent a aichat),
  completion REPL ; config aichat creee seulement si absente
- Câblage complet : cli, dispatch, help, REPL, tip, man (am-setup.1), i18n

Tests : 450 verts (roles + setup unitaires, ai_test ajustes locale-agnostic)
v1.1.0 ; ROADMAP axe 14 + maintenance note ; README Premier lancement
2026-08-20 23:09:21 -04:00
bruno 50f515e406 fix: installateur Windows — accepter l'entree am-windows-x86_64.exe dans l'archive de release + i18n lang-aware pour am ai
release / release (push) Successful in 13m14s
release / macos (push) Canceled after 0s
- install.ps1 ne trouvait que 'am.exe' dans le zip : les archives (CI et
  manuelles) utilisent le nom plateforme 'am-windows-x86_64.exe' -> repli
  systematique sur cargo install au lieu du binaire precompile
- Le script accepte desormais les deux noms (copie vers am.exe) ; chemin
  du message cargo install corrige (.cargo\bin\am.exe au lieu de binam)
- i18n : am ai utilisait tr()/tr_fmt() globaux (flaky selon le process) —
  passage a tr_in/tr_fmt_in(app.lang()) + helper tr_fmt_in ajoute a i18n.rs
- Archive v1.0.6 : les deux entrees (am.exe + am-windows-x86_64.exe) pour
  la compatibilite maximale (installateurs et self-update)
- Tests ai_test insensibles a la locale (FR/EN)
- v1.0.6 ; ROADMAP maintenance note ajoutee
2026-08-20 12:45:10 -04:00
bruno 313645eea2 feat: am ai — langage naturel vers action shell securisee via AIChat (issues #96 #97)
release / release (push) Successful in 13m12s
release / macos (push) Canceled after 0s
- Commande am ai (alias CLI: am shell) : conversationnel par defaut
  (aichat -f <ctx> "<prompt>"), mode --exec avec generation aichat --dry-run
- Securite (issue #97) : classification safe/risky + certainite affichee,
  politique dry-run par defaut (settings.shell_ai.default_safety:
  dry-run | confirm | auto), confirmation y/N pour les commandes risky,
  --yes pour executer, --dry-run force la simulation
- Flags : --exec/-e, --files/-f (defaut: dossier courant), --provider,
  --model (registre providers -> env aichat + modele, token via keyring)
- Execution via le shell utilisateur (default_shell > SHELL > COMSPEC)
- Journalisation : EventKind::ShellAi (mode, risk, certainty, executed)
- Module src/shell_ai.rs (classification, politique, generation, execution)
- Câblage complet : cli, dispatch, help, REPL (parseur+completer+banner),
  tip, man pages (am-ai.1), i18n EN, config.yaml (bloc shell_ai)
- Tests : 7 unitaires (classification, certainty, extraction, decision)
  + 4 integration (shim aichat.cmd : dry-run par defaut, --yes, mode
  conversationnel, mode confirm) — 339 tests verts
- v1.0.5 ; ROADMAP axe 13.3 coche (6 lignes), epic #93 clôturee

closes #93
closes #96
closes #97
2026-08-20 12:07:38 -04:00
bruno 02517735be docs: jalons versionnes — maintenance v1.0.3/v1.0.4 dans le pied de page ROADMAP 2026-08-20 11:24:45 -04:00
bruno 0f81b7c585 feat: catalogue — 5 agents shell AI (AIChat, ShellGPT, Fabric, Shell AI, AI CLI) + alias ai (issues #94 #95)
release / release (push) Successful in 13m52s
release / macos (push) Canceled after 0s
- AIChat (sigoden/aichat) : binaire GitHub Release, alias ai -> aichat (issue #94)
- ShellGPT (TheR1D/shell_gpt) : pip shell-gpt, binaire sgpt, python >= 3.10 (issue #95)
- Fabric (danielmiessler/fabric) : go install cmd/fabric, patterns IA (issue #95)
- Shell AI (nishant9083/shell-ai) : npm @shell-ai/cli, local-first Ollama + MCP (issue #95)
- AI CLI (kriserickson/ai-cli) : binaire ai, politique de securite risk/certainty (issue #95)
- v1.0.4 : ROADMAP axe 13 coche (13.1 + 13.3), README 77 agents

closes #94
closes #95
2026-08-20 11:20:23 -04:00
bruno 0a12c617b2 docs: enrich Axe 13 Shell AI in roadmap and update architecture 2026-08-20 11:02:55 -04:00
bruno ee490f5eaf fix: détection externe — champ detect (sonde PATH explicite) pour les lanceurs interpréteurs
lazycodex (run: npx lazycodex-ai) et nanobot (run: python -m nanobot)
étaient déclarés « external » dès que npx/python étaient sur le PATH :
la sonde utilisait le premier mot de run au lieu du vrai binaire.

- AgentDef.detect : sonde PATH explicite, repli sur first_token sinon
- probe.rs : cache invalidé quand les tokens du catalogue changent
  (token_hash), plus besoin d'attendre un changement de PATH
- config.yaml : detect: lazycodex-ai / detect: nanobot
- tests : detect_token_prefers_explicit_binary + 432 tests verts
- v1.0.3, man pages régénérées
2026-08-20 10:53:59 -04:00
bruno 79e032b563 feat: Add Axe 13 (Shell AI) to roadmap 2026-08-20 10:45:10 -04:00
bruno d0f52eb7c0 fix: REPL — ask/serve/registry routées vers am au lieu du shell système
is_am_command() ne connaissait pas ask/serve/registry : le REPL les
envoyait au shell système ('command not found'). Ajout aux trois
points de contact (is_am_command, COMMAND_DESCRIPTIONS, banner) +
test élargi. Docs alignées sur v1.0 : README (ask/providers/registry/
serve), ROADMAP v2.3 (v0.7.0 + v1.0.0 livrés), ARCHITECTURE (arbre src
+ section copilote & plateforme), tips ask/serve/registry. Version 1.0.2,
man pages régénérées. CI release : cross-compile Linux musl + Windows
mingw sur un seul runner, macOS optionnel.
2026-08-20 10:22:21 -04:00
bruno 38d38d51e3 fix: install.sh acceptait seulement l'entrée 'am' dans l'archive de release
Le pipeline CI publie am-linux-x86_64.tar.gz avec une entrée nommée 'am-linux-x86_64' (pas 'am') : le test [ -f $tmpdir/am ] échouait et le script retombait sur cargo install depuis les sources alors que le binaire précompilé existe. Recherche flexible du premier fichier extrait (am | am-$platform-$arch | n'importe quel fichier). Vérifié : extraction réelle du tar.gz v1.0.1 → ELF statique trouvé.
2026-08-20 09:32:00 -04:00
bruno 5bcbc1c81f chore: version 1.0.1 (post-v1.0.0 — self-update décompresse les archives, prompt REPL avec shell actif)
release / linux (push) Successful in 15m22s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
2026-08-20 08:49:25 -04:00
bruno 38297c2bf3 feat: prompt REPL — emoji 🪟 + shell actif après la version
Le statut avant chaque invite affiche maintenant le shell-gateway courant (ex: ⚙ am v1.0.0 🪟 bash │ ...), mis à jour dynamiquement via 'shell <name>'. Vérifié en réel : bash → pwsh après switch.
2026-08-20 08:35:27 -04:00
bruno ac6f2ffaa5 fix: am self-update copiait l'archive (zip/tar.gz) au lieu du binaire extrait
Les assets de release sont des archives (am-windows-x86_64.zip, am-linux-*.tar.gz) mais le self-update copiait les octets bruts téléchargés vers le binaire — le 'nouveau binaire' était un zip → 'Exec format error' au lancement. Le download des releases était en fait cassé depuis le début (jamais déclenché : l'asset Windows manquait).

- self_update: download → download::extract_archive (sniff par contenu, déjà utilisé pour les catalogues) → find_binary (préfère am/am.exe/*.exe, sinon le plus gros fichier) → copie du binaire extrait
- 2 tests : préférence am.exe dans un layout zip, fallback plus gros fichier
- E2E réel : le zip v1.0.0 extrait → 'am 1.0.0' exécutable (magic MZ)
2026-08-20 08:15:11 -04:00
bruno 2d90c48532 feat: v1.0 — am serve : API HTTP + WebSocket authentifiée pour piloter am à distance (closes #80)
release / linux (push) Successful in 15m21s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
- src/serve.rs : tiny_http (zéro dépendance runtime) — token Bearer obligatoire (comptime-ish), rate limiting fenêtre 60s par IP, routes réutilisant les contrats --json (stats/sessions/ps/providers/run/start/stop/ask) en re-spawnant le binaire (pattern web #54), WebSocket RFC 6455 (handshake 101 + accept sha1, broadcast des events du journal par polling 500ms, première passe = indexation), TLS délégué au reverse proxy (documenté)
- am serve --token <TOKEN> [--host] [--port 8080] [--rate-limit 120] + REPL + help + man
- 9 tests : auth (sans/mauvais/bon token), routes (runner mocké), run args, 404, rate limit, handshake RFC 6455 (vecteur connu), broadcast journal, comparaison token
- E2E réel : curl 401/health/stats + POST run exécutant un agent, client WS brut recevant l'event run en temps réel
- version 1.0.0 (milestone v1.0 terminé) ; test version_table suit Cargo.toml (major plus hardcodé)
2026-08-20 07:24:53 -04:00
bruno 92af59a71f feat: v1.0 — profils sandbox par agent : commandes autorisées (allowlist, stem Windows), périmètre de répertoires, politique réseau best-effort, refus journalisés pour l'audit, --no-sandbox pour contourner (closes #79)
- src/sandbox.rs : profile_of + enforce (basename/stem allowlist, cwd starts_with périmètre, proxy env si network:false), EventKind::Sandbox
- enforcement au run et au start (start_one, --parallel, restart) ; AgentDef.sandbox + doc config.yaml
- 6 tests : défaut non sandboxé, refus + journalisation, stem .exe, périmètre cwd, env réseau, bypass --no-sandbox
2026-08-19 22:57:45 -04:00
bruno 900f70c249 feat: v1.0 — am registry : registre communautaire de catalogues (publication + recherche sur Gitea), manifeste source/version/auteur/sha256, installation avec validation du checksum et décision de confiance explicite (closes #77)
- src/registry.rs : Manifest (schema/name/version/author/source/agents_count/sha256), publish (écrit am-manifest.json + instructions git), search (multi-sources via settings.registry.sources), install (manifeste → catalogue → sha256 → source cohérente → confiance → register_include), list
- settings.registry {sources, author} + doc config.yaml ; CLI/REPL/help/man/i18n
- 11 tests : hash, manifest_url, publish (fichier + refus catalogue vide/sans source), E2E install tiny_http (refus sans confiance, enregistrement avec --yes, 4 requêtes), source mismatch
2026-08-19 22:23:32 -04:00
bruno 12eb09b01a feat: v1.0 — am ask : langage naturel → commande am, règles locales FR/EN hors-ligne, raffinement LLM optionnel via le registre providers (token keyring, jamais de données du journal), cache des traductions, confirmation avant exécution, désactivable (closes #78)
- src/ask.rs : traducteur par règles (verbes FR/EN, pronoms, nicknames d'agents, séquences «et/puis»), cache ask_cache.json, POST /chat/completions du provider résolu avec Bearer du keyring, validation des commandes retournées, dégradation silencieuse sans token
- settings.ask {enabled (défaut true), provider, model} + doc config.yaml ; CLI/REPL/help/man/i18n
- 7 tests : règles (installe claude et lance-le → 2 commandes), cache, LLM via serveur tiny_http (token Bearer, zéro donnée du journal), dégradation, désactivation
2026-08-19 22:01:00 -04:00
bruno 7cab1a0b5c feat: v1.0 — télémétrie anonyme opt-in : compteurs agrégés uniquement, settings.telemetry (désactivé par défaut), batch périodique avec backoff, fire-and-forget, zéro PII (closes #76)
- src/telemetry.rs : compteurs par kind + succès/échec des runs, fichier telemetry.json à côté du state, envoi au seuil (10 events ou 7 jours), backoff 3 échecs consécutifs, reset après succès
- app.emit → maybe_record (no-op si désactivé, rien n'est même écrit localement) ; real_main → maybe_flush
- config.yaml : bloc telemetry documenté (enabled + endpoint optionnel)
- 5 tests : disabled (rien), compteurs agrégés (zéro identifiant dans le JSON), local-only sans endpoint, envoi+reset (serveur tiny_http sur thread dédié), backoff
2026-08-19 21:28:26 -04:00
bruno 6d51ce9504 feat: v0.7.0 — am run/start --provider/--model : résolution cloud via le registre (base_url + keyring + modèle), fallback cloud quand le modèle local est inconnu, canal model_env/model_arg/env_map, jamais de token en clair (closes #92)
- apply_provider : providers::resolve_for (flag > agent > défaut) + apply_env_map_resolved (api_key = @secret, base_url/model du provider résolu)
- start/run/restart : --provider et --model dans le CLI, le REPL et la complétion ; specs help + man pages
- Tests unitaires : résolution, cascade, canal déclaré, erreur provider inconnu (liste), absence de fuite (env sans valeur sk-), fallback embarqué
2026-08-19 21:05:39 -04:00
bruno 68eb170f57 feat: v0.7.0 — configuration post-install : bloc config: par agent (env_map + fichiers), adaptateurs TOML/YAML/JSON/key=value, édition douce, jamais de token en clair (api_key = @secret) (closes #91)
- Nouveau module src/agent_config.rs : apply_post_install (écriture fichiers), apply_env_map (env injectée au start/run), provider_pref (provider > config.provider_default > default_provider)
- am install écrit les fichiers de config de l'agent avec le provider/modèle résolus ; --no-config / install.configurable:false / --dry-run respectés ; agent sans adaptateur → message clair, install réussit
- Catalogue : blocs config: pour claude-code, codex, agentty (+ provider_default)
2026-08-19 20:41:34 -04:00
bruno ebc753cc4a feat: v0.7.0 — AgentDef provider/model + install --provider/--model/--no-config : résolution flag > agent > défaut, erreur si provider inconnu (liste du registre), warning si modèle absent, résolution affichée en résumé et au --dry-run (closes #90)
- Providers réels livrés dans le catalogue par défaut (anthropic★/openai/deepseek/google) + hints provider sur claude-code/deepseek-harness
- Suppression par null dans l'overlay : am providers remove écrit <nom>: null (merge traite null comme suppression, set_path remplace le null avant de descendre)
- Cascade @secret (#89) : le provider déclaré de l'agent prime sur default_provider
2026-08-19 20:03:47 -04:00
bruno 7312e6ceab feat: v0.7.0 — secrets partagés par provider : am providers set-token/token, namespace keyring providers/<nom>, résolution @secret en cascade agent → provider (closes #89)
Corrige au passage deux bugs du keyring (#36) : features natifs manquants du crate keyring (set() no-op silencieux, rien ne persistait) + index __index__ jamais purgé au remove (list fantômes).
2026-08-19 16:09:34 -04:00
bruno d38cd7352f feat: v0.7.0 — registre de providers LLM : am providers list/show/add/remove/default, settings.providers + default_provider (closes #88) 2026-08-19 15:32:45 -04:00
bruno 1948e3bc79 docs: roadmap — phase v0.7.0 (providers & configuration automatisée, épique #87, priorité P0) 2026-08-19 15:02:53 -04:00
bruno 4735fc1502 docs(readme): ajout des détails d'installation et de gestion des agents
- Emplacement des agents, binaires, état et config par OS
- Pipeline complet d'installation (catalogue, dépendances, méthodes)
- Tableau des commandes réelles par méthode d'installateur
- Cycle de gestion : démarrage, arrêt, mise à jour, désinstallation
2026-08-18 23:11:42 -04:00
bruno fa51cdb339 feat: phase 2 — am web : dashboard web local + API JSON (contrats --json, 127.0.0.1, tiny_http, frontend embarqué) (closes #54)
release / linux (push) Successful in 14m16s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
2026-08-18 16:40:15 -04:00
bruno 7f4d74f811 feat: phase 2 — i18n messages EN/FR (--lang, AM_LANG/LANG, catalogue tr/tr_fmt, REPL lang) (closes #74) 2026-08-18 15:46:51 -04:00
bruno 4c7866a25a feat: phase 2 — am lab (benchmark N agents) + plugins d'événements (contrat JSON)
- #62: am lab --agents a,b --task <f> — séquentiel ou --parallel, capture
  durée/exit/sortie/coût estimé, rapport comparatif tableau + --json stable,
  tâches versionnables dans <state>/lab/ (--list), rejouables à l'identique
- #75: plugins/ sous state_dir, déclenchés sur on_install/on_start/on_stop/
  on_update (App::emit), contrat JSON stdin/stdout, timeout configurable,
  échec non bloquant, garde anti-récursion AM_PLUGINS_RUNNING, am plugins
  + am plugins --test <name> (CI), exemples notify + ci-webhook
- intégration REPL (parse, complétion, bannière, is_am_command), help, tips,
  man pages (am-lab.1, am-plugins.1), README, ROADMAP (26/27), v0.5.4
- 334 tests verts (309 + 25)

closes #62
closes #75
2026-08-18 14:17:30 -04:00
bruno aa0d8e43eb feat: phase 2 — playbooks (am history --save + am playbook, rejeu pas à pas) (closes #51) 2026-08-18 13:30:29 -04:00
bruno e82979e6a3 feat: phase 2 — sauvegarde git (am sync) + transfert machine (am migrate) (closes #66 #68) 2026-08-18 12:09:43 -04:00
bruno 1b3fe09074 feat: phase 2 — coûts par session (stats --costs) + am monitor TUI (closes #49 #50) 2026-08-18 11:23:50 -04:00
bruno 63dc36660b feat: phase 2 — automatisation: doctor --watch, schedule, service, orchestration, conteneurs (closes #55 #56 #57 #58 #59) 2026-08-18 10:57:00 -04:00
bruno 6a6676fc5d feat: phase 2 — sessions export + rétention, init --template (closes #52 #53)
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.
2026-08-18 10:08:20 -04:00
bruno d9ffc34156 feat: phase 2 — audit config + update --rollback (closes #63 #64)
Axe 8 (sécurité) :
- am audit : checksums SHA-256 des configs (embarquée, utilisateur,
  locale) stockés dans state.json, croisement avec events.jsonl pour
  dater les changements, détection des modifications manuelles hors de
  am (statut MANUAL), rapport lisible + --json stable (contrat)
- backup automatique avant chaque am update (agent ou --all) : état +
  config utilisateur + répertoires d'installation + shims dans
  <state>/backups/<ts>/ avec manifest.json
- am update --rollback [point] : restaure le dernier backup (ou un id
  précis, préfixe accepté), arrête les agents concernés d'abord,
  événement EventKind::Rollback journalisé
- am update --rollback list : liste les points de restauration
- rétention settings.backups_keep (défaut 5) appliquée après chaque backup
- événements EventKind::Backup / EventKind::Rollback pour l'audit

REPL : commande audit + update --rollback (parse, complétion), help specs,
tip cheat sheet, man pages régénérées (50 pages). Version 0.4.6,
ROADMAP cases cochées, 272 tests verts.
2026-08-18 09:44:16 -04:00
bruno 22bc529818 feat: phase 2 — modèles locaux + catalogue distant + suggest (closes #70 #71 #73 #60 #67 #61)
Axe 11 (modèles) :
- am models : inventaire des runtimes locaux (ollama list --format json,
  llama.cpp .gguf sur disque, LM Studio API locale) avec cache façon
  probe.rs (TTL 30s) et absence de runtime signalée sans erreur fatale
- am run <agent> --model <m> : résolution dans l'inventaire, transmission
  via model_env/model_arg de l'agent (défaut AM_MODEL), tracé en session
- am models --prune : candidats inutilisés depuis settings.models_prune_days
  (défaut 30), :latest toujours protégé, dry-run + confirmation + événement
  EventKind::Model journalisé

Axes 7/9 (catalogue) :
- am catalog update : fetch du catalogue officiel, diff (ajoutés/retirés/
  modifiés), confirmation, enregistrement en include
- am catalog add <url> : validation du format (parse + validate), cache
  catalog-cache.json (TTL 3600s), événement EventKind::Catalog journalisé
- include par URL (http/https/file) dans config.yaml, résolu au chargement
  avec cache + TTL ; override local toujours prioritaire (issue #67)
- am suggest <requête> : réutilise le scoring fuzzy du catalogue, boost par
  usage réel (lancements + durée depuis le journal), top 5 justifié, --json

REPL : commandes models/catalog/suggest (parse, complétion, descriptions),
help specs, tip cheat sheet, man pages régénérées (49 pages, dont 3 nouvelles).
Version bump 0.4.5, ROADMAP cases cochées, 266 tests verts.
2026-08-18 09:06:16 -04:00
bruno 890ad953e5 feat: phase 2 quick wins (#65 #69 #72)
- #65: update policies + per-agent version pinning
  - add settings.update_policy (stable/latest/skip)
  - add AgentDef.pin_version
  - honor both in update_cmd
  - add update_policy tests

- #69: REPL color theme CLI command
  - add am theme [name] (show/switch)
  - persist selected theme to config

- #72: doctor checks local model runtimes
  - verify ollama and llama-server on PATH
  - for ollama, also check server responds (ollama ls)

Version 0.4.4
2026-08-17 22:24:45 -04:00
bruno 98c0b30f68 feat: am tip cheat sheet + readable man pages + REPL completion refresh 2026-08-17 21:50:48 -04:00
bruno 53893f2967 v0.4.3 : persistance du theme actif choisi
release / linux (push) Successful in 13m24s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
- le REPL 'theme <name>' applique ET sauvegarde le theme (settings.theme dans le fichier de config actif, cree s'il manque) via persist_setting
- correction racine : config::merge ignorait settings.theme - la valeur persistee n etait jamais relue au chargement, le theme par defaut etait toujours reapplique apres un redemarrage
- 'am --theme <name>' reste un one-shot ; config set settings.theme <nom> fonctionne egalement
- aides mises a jour (banniere, help theme)
- tests de persistance + relecture au demarrage, man pages regenerees, version 0.4.3
2026-08-17 15:23:28 -04:00
bruno 91253b79c5 ci : files de gitea-release-action en bloc YAML (retours a la ligne) - l'action splitte sur \n, le bloc plie en une ligne et ne trouvait aucun fichier ('not include valid file' -> rien n'etait uploade)
release / linux (push) Successful in 13m21s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
2026-08-17 14:38:13 -04:00
bruno 3c8bb93b8a ci : installer nodejs dans le conteneur avant actions/checkout (le post-step checkout exige node, absent de rust:1.94-alpine) - le job linux echouait avec 'exec: node: executable file not found' apres la reussite du pull d'image
release / linux (push) Successful in 13m4s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
2026-08-17 14:20:11 -04:00
bruno 363d5e3286 ci : documente l'espace disque requis sur le runner dans le workflow
release / linux (push) Failing after 48s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
2026-08-17 14:17:09 -04:00
bruno 4c60ab5bcc docs : methode de build linux musl avec cargo-zigbuild (aarch64 + x86_64) dans RELEASING.md
release / linux (push) Failing after 22s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
2026-08-17 13:42:53 -04:00
bruno e24e518846 ci : job linux avec cargo-zigbuild (aarch64 musl) + empreinte disque reduite - rust:1.94-alpine n'a pas de compilateur croise aarch64 (le step aarch64 echouait avec 'aarch64-linux-musl-gcc not found') ; cargo-zigbuild produit x86_64 + aarch64 musl avec zig (~50 Mo) en une seule image ; CARGO_TARGET_DIR=/tmp + CARGO_INCREMENTAL=0 pour ne rien laisser sur le runner ; concurrency cancel-in-progress ; le setup job peut aussi echouer sur disque plein (no space left on device) : nettoyer docker sur l'hote
release / linux (push) Failing after 25s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
2026-08-17 13:38:07 -04:00
bruno 2c079b0ccd v0.4.2 : menu de completion Nushell (reedline) + correction des chemins Windows - remplace rustyline par reedline (menu Tab interactif : 1er choix surbrille, Tab navigue, Entree valide, Esc ferme, filtrage en direct, descriptions, couleurs du theme), tokenizer Windows preservant les backslashes pour cd/ls (shell_words mangeait les \), historique history.txt conserve, repli sans terminal, tests + man pages regeneres
release / linux (push) Failing after 24s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
2026-08-17 13:08:50 -04:00
bruno e6e85e2a9e ci : release_overwrite + prerequis runner documentes (pull docker.io, secret GITEA_TOKEN)
release / linux (push) Failing after 24s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
2026-08-17 10:54:36 -04:00
bruno 56732d672b v0.4.1 : Phase 1 complete (17/17) - dashboard TUI (#33), favoris/notes/tags (#39), profils d'environnement (#40), completions dynamiques + man pages (#41), packaging officiel + CI (#42), self-update Gitea, state v3, 212 tests
release / linux (push) Failing after 23s
release / windows (push) Canceled after 0s
release / macos (push) Canceled after 0s
2026-08-17 10:50:13 -04:00
bruno 4f4cd034b2 v0.4.0 : Phase 1 partielle (13/17) - recherche fuzzy, reexecution d'historique, projects+profils, start contextuel, timeline, sessions resume, hooks, watch, secret (keyring), top, report, log --follow 2026-08-17 09:14:48 -04:00
bruno aeca797ae0 Merge pull request 'secret : trousseau OS + injection @secret (issue #36)' (#86) from feat/secrets into main 2026-08-17 09:09:16 -04:00
bruno 354c914c43 secret : trousseau OS (keyring) + injection @secret au start/run (issue #36) - valeurs jamais affichees ni journalisees, mock testable, fallback clair sans trousseau 2026-08-17 09:09:04 -04:00
bruno c57d3a333d Merge pull request 'top + report + log --follow (issues #37 #38)' (#85) from feat/top-report into main 2026-08-17 09:03:58 -04:00
bruno 16926ffb00 top + report + log --follow (issues #37 #38) - top 10 par lancements, digest markdown hebdo/mensuel, suivi du journal en direct 2026-08-17 09:03:44 -04:00
bruno f14b59e63b Merge pull request 'watch : supervision + redémarrage automatique (issue #35)' (#84) from feat/watch into main 2026-08-17 08:58:32 -04:00
bruno 8d93eece1e watch : supervision d'un agent avec redemarrage automatique et backoff (issue #35) - check_once testable, notification desktop, Ctrl-C n'affecte pas l'agent detache 2026-08-17 08:58:19 -04:00
bruno 2a1fcfeed6 Merge pull request 'hooks : on_install/on_start/on_stop/on_update (issue #34)' (#83) from feat/hooks into main 2026-08-17 08:55:49 -04:00
bruno 18784ba9f7 hooks : on_install/on_start/on_stop/on_update globaux (settings.hooks) et par projet (issue #34) - echec non bloquant, dry-run respecte, ordre global puis projet 2026-08-17 08:55:35 -04:00
bruno 3220a323ef Merge pull request 'sessions : am sessions --resume (issue #32)' (#82) from feat/sessions-resume into main 2026-08-17 08:48:45 -04:00
bruno 30cc49de3c sessions : am sessions --resume <id> (issue #32) - relance en arriere-plan avec les arguments et le cwd d'origine, cwd optionnel dans spawn_background, gardes running/repl/erreurs claires 2026-08-17 08:48:30 -04:00
bruno 314583ceee Merge pull request 'timeline : vue chronologique unifiée (issue #31)' (#81) from feat/timeline into main 2026-08-17 08:45:16 -04:00
bruno ed795c522f timeline : vue chronologique unifiee journal + historique REPL (issue #31) - filtres agent/projet/date, limite, parse_since partage 2026-08-17 08:45:03 -04:00
bruno bbc2bb889d roadmap : decoupage des phases 2 (v0.5.0, issues #47 #49-#75) et 3 (v1.0, issues #48 #76-#80) sur Gitea 2026-08-17 08:15:16 -04:00
bruno 904e340cdd Merge pull request 'start contextuel : agent par défaut du projet (issue #30)' (#46) from feat/start-context into main 2026-08-17 08:13:35 -04:00
bruno 5f8b973789 start contextuel : am start sans argument lance l'agent par defaut du projet (issue #30) - resolution pure resolve_start_target, restart identique, REPL sans agent obligatoire 2026-08-17 08:13:19 -04:00
bruno 463fa6b937 Merge pull request 'projects : am projects + profils de projet (issue #29)' (#45) from feat/projects into main 2026-08-17 08:10:57 -04:00
bruno dc7372f277 projects : am projects (agregats par depot depuis le journal) + profils de projet dans la config (issue #29) - agent dominant, sessions, durees, cache projects.json rafraichi par doctor --fix 2026-08-17 08:10:42 -04:00
bruno a23bc6b5ae Merge pull request 'history : réexécution !! !N ^old^new + am history --rerun (issues #27 #28)' (#44) from feat/history-rerun into main 2026-08-17 08:06:16 -04:00
bruno 81c69db17b history : reexecution (issues #27 #28) - expansion !! !N !prefix ^old^new dans le REPL + am history --rerun N avec confirmation (shell ou commande am) 2026-08-17 08:05:58 -04:00
bruno 9e6c8aca08 Merge pull request 'search : recherche fuzzy + suggestions (issue #26)' (#43) from feat/fuzzy-search into main 2026-08-17 08:01:56 -04:00
bruno 4ef89cde72 search : recherche fuzzy avec scoring + suggestions vouliez-vous-dire (issue #26) - sous-chaine, subsequence, tolerance de frappe (Levenshtein), tri par pertinence 2026-08-17 08:01:39 -04:00
bruno 2eaafe6e2a v0.3.0 : picoclaw en binaire 64-bit officiel (sipeed/picoclaw releases) + shims git en .cmd sur Windows (fini le batch renomme en .exe qui donnait Unsupported 16-Bit Application) avec routage via cmd.exe 2026-08-17 07:52:17 -04:00
bruno deeb489b4e v0.3.0 : menu d autocompletion - les barres verticales des menus en colonne unique (ex. completion de theme) prennent la couleur du cadre du theme 2026-08-17 06:55:07 -04:00
bruno fc243d2f21 docs: decoupage Phase 1 (v0.4.0) dans le ROADMAP - 17 issues + epique, milestone v0.4.0 2026-08-16 23:20:07 -04:00
bruno 6ecfa0d21c v0.3.0 : Phase 0 du ROADMAP livree - journal d'evenements, sessions, stats, log, historique structure, am init, quick wins; README et ROADMAP a jour 2026-08-16 22:48:53 -04:00
bruno 3902bbcb37 Merge pull request 'quick wins #9-#13 et #16 : logs, list --sort, config set, alias, dedup, open' (#24) from feat/quick-wins into main 2026-08-16 22:45:27 -04:00
bruno d4a6aeae1d quick wins (issues #9 #10 #11 #12 #13 #16) : am logs (tail+follow), am list --running/--sort, am config set, am alias add/remove/list, dedup historique, am open 2026-08-16 22:45:11 -04:00
bruno 38d0729cb3 Merge pull request 'init + contexte : am init et détection de projet (issue #8)' (#23) from feat/init-context into main 2026-08-16 22:40:15 -04:00
bruno 85d44f9e56 init+contexte : am init genere un agent-manager.yaml selon la stack detectee + contexte projet (git root, branche, stack) attache aux evenements et sessions (issue #8) 2026-08-16 22:40:00 -04:00
bruno 48e85555f7 Merge pull request 'history : historique structuré + am history (issue #7)' (#22) from feat/history into main 2026-08-16 22:35:01 -04:00
bruno c9e2543f50 history : historique structure par session + am history (issue #7) - migration one-shot de history.txt, filtres kind/cwd/search/failed/session, enregistrement REPL avec duree et exit 2026-08-16 22:34:48 -04:00
bruno 9f4a13eae2 Merge pull request 'stats + log : observabilité du journal (issue #6)' (#21) from feat/stats-log into main 2026-08-16 22:30:54 -04:00
bruno 33748bea36 stats+log : am stats (agregats par agent, periodes 7d/30d/90d, barres ASCII) et am log (filtres agent/kind/date, limite) (issue #6) 2026-08-16 22:30:41 -04:00
bruno 19e77fd261 Merge pull request 'sessions : registre central + am sessions (issue #5)' (#20) from feat/sessions into main 2026-08-16 22:22:23 -04:00
bruno 38b7a3a915 sessions : registre des sessions + commande am sessions (issue #5) - lifecycle agent/repl, reconciliation des sessions interrompues, compteur sessions_count, filtres agent/projet/statut, show avec extrait de log 2026-08-16 22:22:09 -04:00
bruno 3af0834bae Merge pull request 'state : v2 — sessions_count et last_used (issue #4)' (#19) from feat/state-v2 into main 2026-08-16 22:16:56 -04:00
bruno c6518bcfd5 state : v2 avec sessions_count et last_used (issue #4) - migration additive persistee au premier contact, touch() sur start/run, fixture v1 testee 2026-08-16 22:16:44 -04:00
bruno a672880e34 Merge pull request 'events : instrumentation des commandes (issue #3)' (#18) from feat/instrumentation into main 2026-08-16 22:14:03 -04:00
bruno 310da96a63 events : instrumentation start/stop/run/install/update/uninstall/doctor/repl/shell (issue #3) - un evenement JSONL par action reelle, dry-run sans evenement, session id sur start, duree et exit code sur stop/run 2026-08-16 22:13:49 -04:00
bruno ba901df953 v0.2.14 : fallback web GitHub pour les releases - quand l API est rate-limitee, le tag vient de la redirection /releases/latest et les assets de expanded_assets (aucune limite) - jcode et zeroclaw installables sans GITHUB_TOKEN 2026-08-16 21:53:25 -04:00
bruno e50e8d3e41 v0.2.14 : kimi-cli via uv (paquet PyPI kimi-cli, fini le npm inexistant) + uv venv autonome (python 3.13 gere par uv, plus besoin de python systeme pour les installs uv) 2026-08-16 21:41:21 -04:00
bruno 498af684c9 v0.2.14 : support GITHUB_TOKEN/GH_TOKEN pour l API GitHub (limite 60 -> 5000 requetes/h) et message clair sur le rate limit 403 2026-08-16 21:30:31 -04:00
bruno 2282f71829 v0.2.14 : correction install binaire - detection des archives par magic bytes (un zip renomme n est plus copie tel quel), preference des archives sur les setup/installers, validation de l executable (MZ/ELF/Mach-O) avec erreur claire avant le premier start 2026-08-16 21:23:08 -04:00
bruno f968d7d0b0 v0.2.14 : 9 nouveaux themes - nord, solarized, gruvbox, catppuccin, tokyo-night, monokai, matrix, rose-pine, amber (15 au total), liste des themes sur deux lignes dans la banniere 2026-08-16 21:01:15 -04:00
bruno b3437b0601 v0.2.14 : correction bordure haute du splash - les tirets a droite du titre gardent la couleur du theme (reset du titre ne casse plus le cadre) 2026-08-16 20:45:21 -04:00
bruno 843c3e1278 Merge pull request 'events : journal d'evenements JSONL (issue #2)' (#17) from feat/events-ledger into main 2026-08-16 13:50:24 -04:00
bruno 4db567eebe events : journal d'evenements JSONL (issue #2) - append-only, rotation mensuelle, lecture tolerante aux lignes corrompues, env_keys sans valeurs secretes, 8 tests 2026-08-16 13:49:11 -04:00
bruno 2bbe45e508 v0.2.14 : barres verticales des cadres aux couleurs du theme + commande theme dans le shell (theme liste les themes, theme <name> change a chaud, completion et menu synchronises) 2026-08-16 13:40:51 -04:00
bruno 4b0f02a7c4 v0.2.14 : cadres aux couleurs du theme - bordures des tableaux (list, search, status, doctor, ls, dir, ps, help), version, menu d autocompletion et banniere colorees par theme (border) 2026-08-16 13:17:07 -04:00
bruno 79143e197d v0.2.14 : splash screen theme - art ASCII et bordures aux couleurs du theme, section Theme (theme actif + liste des themes disponibles), ligne de statut theme 2026-08-16 13:10:07 -04:00
bruno 14f873bfdd v0.2.14 : aide Nushell, themes de couleurs et cadres blancs
- Aide facon Nushell : help <cmd>, <cmd> -h/--help, help, help commands,
  help --find <texte>, help <agent> (fiche info) - sections Usage/Flags/
  Command Type/Parameters/Input-output/Examples avec couleurs
- Commande version : tableau Nushell (commit, build, rustc, theme...) + --json ;
  build.rs pour commit/branche git ; -V reste la version courte
- Themes : --theme <nom> (default, ocean, sunset, forest, dracula, mono)
  + settings.theme dans la config ; activation VT Windows pour les couleurs
- Cadres blancs Nushell partages : list, search, status, doctor, ls/ps/
  where/get et menu d autocompletion Tab encadre (colonnes name/description)
2026-08-16 12:52:12 -04:00
bruno 53f3fa34e7 docs: roadmap section 11 liee aux issues Gitea (suivi phase 0 en place) 2026-08-16 12:51:52 -04:00
bruno 5841926b25 docs: roadmap v2 - lecture facilitee (sommaire, legende, quick wins, KPI), 12 axes enrichis (modeles locaux, lab, rapports, couts, favoris, profils), jalons versionnes 2026-08-16 12:31:29 -04:00
bruno 979875fa63 v0.2.13 : prompt avec emojis colores — 🗂️ repertoire, 🤖 catalogue, 🌐 externes, 📊 geres, ⚡ duree de la derniere commande, ⏲ session 2026-08-16 10:43:26 -04:00
bruno 93c32b60ba v0.2.12 : ligne de statut — temps dexecution de la derniere commande (⚡ ms/s) + ls parallele (tailles de dossiers reparties sur les coeurs, un seul appel de metadonnees par entree) — 130 entrees instantanees 2026-08-16 10:29:38 -04:00
bruno 0f4ba71219 v0.2.11 : ligne de statut et banniere — compteurs distincts agents externes (PATH) et agents geres (am install) pour lever l ambiguite du 0 installed 2026-08-16 10:08:54 -04:00
228 changed files with 42381 additions and 1846 deletions
+143
View File
@@ -0,0 +1,143 @@
# Gitea Actions : pipeline de release (issue #42).
#
# Sur chaque tag v* : construit les binaires de toutes les plateformes.
# Le job principal 'release' cross-compile Linux + Windows depuis un seul
# runner ubuntu-latest, donc il n'a pas besoin de runners Windows/macOS.
# Le job 'macos' est optionnel : s'il y a un runner macos-latest, il ajoute
# les archives macOS a la release existante ; sinon l'installateur retombe
# sur cargo install --git sur macOS.
#
# Les installateurs one-liner (install.sh / install.ps1) et 'am self-update'
# consomment les artefacts attaches a la release.
#
# Cross-compilation utilisee :
# - Linux x86_64 + aarch64 : cargo-zigbuild + musl (binaires statiques)
# - Windows x86_64 : mingw-w64 + x86_64-pc-windows-gnu
#
# Prerequis du runner : pouvoir tirer l'image docker.io (rust:1.94-bookworm,
# ~1,2 Go) et le secret GITEA_TOKEN (jeton avec droit 'write:release')
# positionne sur le depot.
#
# Note disque (runner avec espace limite) :
# - il faut ~2 Go libres sur / pour tirer l'image (rust:1.94-bookworm) ;
# en cas de 'no space left on device' : docker system prune -af --volumes
# sur l'HOTE du runner (pas une autre machine !) ;
# - les builds compilent dans CARGO_TARGET_DIR=/tmp (hors du volume
# workspace) avec l'incremental desactive, donc rien ne persiste ;
# - zig (~50 Mo) fournit le linker croise pour Linux.
name: release
on:
push:
tags:
- "v*"
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: true
jobs:
release:
runs-on: ubuntu-latest
container: rust:1.94-bookworm
env:
CARGO_TARGET_DIR: /tmp/am-target
CARGO_INCREMENTAL: "0"
steps:
# actions/checkout (et son post-step) s'execute via node, absent de
# l'image rust:bookworm par defaut : sans nodejs le job echoue des le checkout.
- name: Prepare container (node for checkout action)
run: apt-get update && apt-get install -y nodejs
- uses: actions/checkout@v4
- name: Install build tools (zig + cargo-zigbuild + mingw)
run: |
apt-get update
apt-get install -y build-essential mingw-w64 zip curl
rustup target add \
x86_64-unknown-linux-musl \
aarch64-unknown-linux-musl \
x86_64-pc-windows-gnu
curl -fsSL https://ziglang.org/download/0.14.1/zig-x86_64-linux-0.14.1.tar.xz -o /tmp/zig.tar.xz
tar -xf /tmp/zig.tar.xz -C /opt
echo "/opt/zig-x86_64-linux-0.14.1" >> "$GITHUB_PATH"
cargo install cargo-zigbuild --locked
# Contourne un bug de casse dans certaines crates Windows
# (ex. windows-sys peut emettre -lKernel32 au lieu de -lkernel32).
# Le linker MinGW sous Linux est sensible a la casse.
ln -sf /usr/x86_64-w64-mingw32/lib/libkernel32.a \
/usr/x86_64-w64-mingw32/lib/libKernel32.a
- name: Build linux x86_64 + aarch64 (static musl, zig)
run: cargo zigbuild --release --locked --target x86_64-unknown-linux-musl --target aarch64-unknown-linux-musl
- name: Build windows x86_64 (mingw)
run: cargo build --release --locked --target x86_64-pc-windows-gnu
- name: Stage archives
run: |
mkdir -p dist
cp "$CARGO_TARGET_DIR/x86_64-unknown-linux-musl/release/am" dist/am-linux-x86_64
cp "$CARGO_TARGET_DIR/aarch64-unknown-linux-musl/release/am" dist/am-linux-aarch64
cp "$CARGO_TARGET_DIR/x86_64-pc-windows-gnu/release/am.exe" dist/am-windows-x86_64.exe
cd dist
tar -czf am-linux-x86_64.tar.gz am-linux-x86_64
tar -czf am-linux-aarch64.tar.gz am-linux-aarch64
zip -q am-windows-x86_64.zip am-windows-x86_64.exe
rm am-windows-x86_64.exe
sha256sum am-linux-*.tar.gz am-windows-*.zip > checksums.txt
- name: Publish release
uses: https://gitea.com/actions/gitea-release-action@v1
with:
# L'action splitte 'files' sur les retours a la ligne (pas les
# espaces) : un bloc YAML plie en une seule ligne et ne trouve
# alors aucun fichier -> 'not include valid file', rien n'upload.
files: |
dist/am-linux-x86_64.tar.gz
dist/am-linux-aarch64.tar.gz
dist/am-windows-x86_64.zip
dist/checksums.txt
GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }}
release_overwrite: true
macos:
# Optionnel : ajoute les archives macOS si un runner macos-latest est
# disponible. Sinon ce job reste en attente, mais le job release a deja
# publie Linux + Windows.
needs: release
runs-on: macos-latest
env:
CARGO_TARGET_DIR: /tmp/am-target
CARGO_INCREMENTAL: "0"
steps:
- uses: actions/checkout@v4
- name: Build macos x86_64 + aarch64
run: |
rustup target add x86_64-apple-darwin aarch64-apple-darwin
cargo build --release --locked --target x86_64-apple-darwin
cargo build --release --locked --target aarch64-apple-darwin
- name: Stage archives
run: |
mkdir -p dist
cp "$CARGO_TARGET_DIR/x86_64-apple-darwin/release/am" dist/am-macos-x86_64
cp "$CARGO_TARGET_DIR/aarch64-apple-darwin/release/am" dist/am-macos-aarch64
cd dist
tar -czf am-macos-x86_64.tar.gz am-macos-x86_64
tar -czf am-macos-aarch64.tar.gz am-macos-aarch64
shasum -a 256 am-macos-*.tar.gz > checksums-macos.txt
- name: Publish release
uses: https://gitea.com/actions/gitea-release-action@v1
with:
files: |
dist/am-macos-x86_64.tar.gz
dist/am-macos-aarch64.tar.gz
dist/checksums-macos.txt
GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }}
# false = ajoute les assets macOS a la release creee par le job
# principal, sans ecraser Linux + Windows.
release_overwrite: false
+787
View File
@@ -0,0 +1,787 @@
# 🏗️ 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
- ⚡ Exécuter des actions shell via langage naturel avec un agent léger (`am ai`)
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<br/>clap v4"]
REPL["Shell interactif<br/>rustyline"]
TUI["Dashboard TUI<br/>ratatui + crossterm"]
WEB["Dashboard web<br/>tiny_http (127.0.0.1)"]
end
subgraph CORE["⚙️ Noyau applicatif"]
APP["App<br/>contexte partagé"]
CLI_DEF["cli.rs<br/>définition des commandes"]
CMD["commands/<br/>dispatch"]
SHELL_AI["shell_ai.rs<br/>agent shell léger"]
end
subgraph DATA["💾 Données persistantes"]
CONFIG["Configuration YAML<br/>embarquée + utilisateur"]
CATALOG["Catalog<br/>index agents/alias/groupes"]
STATE["StateStore<br/>state.json"]
EVENTS["Journal JSONL<br/>events-YYYYMM.jsonl"]
CACHE["Probe cache<br/>probe-cache.json"]
end
subgraph EXEC["🔧 Exécution"]
RUNNER["Runner trait<br/>système / mock"]
INSTALLERS["installers/<br/>9 méthodes"]
DEPS["deps.rs<br/>vérification dépendances"]
PROCESS["process.rs<br/>PID / signaux"]
end
subgraph OBS["👁️ Observation"]
PROBE["probe.rs<br/>détection agents externes"]
DASH["dashboard.rs<br/>agrégation"]
STATS["stats.rs<br/>statistiques"]
SESSIONS["sessions.rs<br/>registre sessions"]
end
CLI --> APP
REPL --> APP
TUI --> APP
WEB --> APP
APP --> CLI_DEF
APP --> SHELL_AI
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
SHELL_AI --> CMD
```
---
## 🚀 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
├── catalog_remote.rs 🌐 Catalogues distants (fetch, cache, includes)
├── 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é
├── serve.rs 🚀 API HTTP + WebSocket authentifiée (pilotage à distance, issue #80)
├── 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)
├── providers.rs 🏷️ Registre de providers LLM (base_url, modèles, défaut, @secret)
├── registry.rs 📦 Registre communautaire de catalogues (manifeste + sha256)
├── ask.rs 💬 Langage naturel → commandes am (règles locales + LLM optionnel)
├── sandbox.rs 🛡️ Profils sandbox par agent (allowlist, périmètre, réseau)
├── telemetry.rs 📈 Télémétrie anonyme opt-in (compteurs agrégés)
├── lab.rs 🧪 Benchmark d'agents (tâches YAML versionnables)
├── playbook.rs ▶️ Rejeu pas à pas d'une séquence d'historique
├── plugins.rs 🔌 Scripts d'extension sur les événements (contrat JSON)
├── models.rs 🤖 Inventaire des modèles locaux (ollama, llama.cpp, LM Studio)
├── shell_ai.rs ⚡ Agent shell léger : langage naturel → action shell
├── sync.rs 🔄 Push git de l'état (journal, sessions, config)
├── agent_config.rs ⚙️ Adaptateurs de configuration post-install (TOML/YAML/JSON/key=value)
├── costs.rs 💰 Coûts estimés par agent (tokens in/out, modèles de prix)
├── automation.rs ⚙️ Services système + tâches planifiées (systemd/launchd/schtasks)
├── backup.rs 💾 Sauvegardes (update --rollback, migrate)
├── doctor.rs 🩺 Diagnostics environnement + --fix
├── nav.rs 🧭 Tables de navigation (ls/dir)
├── i18n.rs 🌍 Catalogue de traductions FR/EN (--lang, AM_LANG, LANG)
├── version.rs 🏷️ Informations de version
├── commands/ 📦 51 modules, un par commande
└── installers/ 📦 8 installateurs spécialisés
```
---
## ⚙️ Configuration : catalogue YAML extensible
### Hiérarchie de chargement
```mermaid
flowchart LR
EMB["📦 config.yaml<br/>embarqué dans le binaire"] --> MERGE["🔀 Fusion"]
USER["👤 ~/.config/agent-manager/config.yaml"] --> MERGE
LOCAL["📂 ./agent-manager.yaml"] --> MERGE
FLAG["⚡ --config <file>"] --> 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 <fichier>`
### 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: antigravity-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 <root>` |
| `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 `<outil> --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 <agent>"] --> MODE{Mode ?}
MODE -->|Foreground| FG["Attache au terminal<br/>Ctrl-C pour quitter"]
MODE -->|Background| BG["spawn_background()"]
BG --> LOG["Redirection stdout/stderr<br/>vers log agent"]
LOG --> PID["Enregistrement PID<br/>dans state.json"]
PID --> EVENT["Émission événement start"]
STOP["am stop <agent>"] --> 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 <mot>` | Recherche fuzzy avec suggestions |
| `am info <agent>` | Fiche détaillée |
| `am status [agent]` | État, version, PID, logs |
### 📦 Cycle de vie
| Commande | Description |
|----------|-------------|
| `am install <agent>` | Installe un agent et ses dépendances |
| `am install <agent> --method pip` | Choisit la méthode |
| `am uninstall <agent> [--purge]` | Désinstalle et nettoie |
| `am update <agent>` / `--all` | Met à jour |
| `am start [agent]` | Lance en avant-plan |
| `am start <agent> -b` | Lance en arrière-plan |
| `am stop <agent>` | Arrêt gracieux |
| `am restart <agent>` | Redémarrage |
| `am run <agent> [args...]` | Exécution directe sans gestion de PID |
### 👁️ Observer
| Commande | Description |
|----------|-------------|
| `am logs <agent>` | 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 <agent> --restart` | Supervision et relance automatique |
### 🎯 Personnaliser
| Commande | Description |
|----------|-------------|
| `am favorite <agent>` | Marquer comme favori |
| `am note <agent> <texte>` | Ajouter une note |
| `am tag <agent> <tag>` | Taguer |
| `am tags [agent]` | Lister les tags |
| `am profile list/show <name>` | Profils d'environnement |
| `am alias add <nom> <cible>` | Créer un alias |
| `am secret set <nom> --agent <a> --value <v>` | Secret dans le trousseau |
### 🛠️ Système
| Commande | Description |
|----------|-------------|
| `am doctor [--fix]` | Diagnostic environnement |
| `am config show/path/edit/validate/set` | Gestion config |
| `am completion <shell>` | Script de complétion |
| `am man [commande]` | Page de manuel |
| `am open <agent>` | 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 |
### 🤖 Copilote & plateforme (v0.7.0 / v1.0)
| Commande | Description |
|----------|-------------|
| `am ask "<demande>"` | Langage naturel → commande(s) am : règles locales FR/EN hors-ligne, raffinement LLM optionnel (`settings.ask`), confirmation avant exécution |
| `am providers list/add/remove/set-token` | Registre LLM centralisé (base_url, modèles, clé par provider au keyring, résolution `@secret`) |
| `am registry publish/search/install` | Registre communautaire de catalogues (Gitea, manifeste + checksum sha256 vérifié) |
| `am serve --token [--port]` | API HTTP + WebSocket authentifiée : stats, run, start, stop, ask — rate limiting par IP, TLS derrière reverse proxy |
| `am web [--port]` | Dashboard web local en lecture seule (127.0.0.1), contrats `--json` réutilisés |
| `am ai "<prompt>" [--exec] [--files <path>]` | **Shell AI** : langage naturel → commande/action shell via agent léger (AIChat) ; `--dry-run` par défaut, confirmation avant exécution |
| `am lab --agents a,b --task <f>` | Benchmark comparatif (durée, exit, coût) sur tâches YAML versionnables |
| `am sync [--message]` | Sauvegarde git de l'état (journal, sessions, config — secrets exclus) |
| `am migrate export/import` | Bundle de transfert machine A → B (config + état + historique) |
| `am schedule add/list/remove/run` | Planification de commandes am (cron / Task Scheduler, issue #56) |
| `am service install <agent>` | Service système (systemd / launchd / tâche Windows, autostart) |
| `am monitor [--json]` | TUI temps réel des processus gérés (CPU/RSS/uptime) + alertes de seuils |
| `am models [--prune]` | Inventaire des modèles locaux (ollama, llama.cpp, LM Studio) |
| `am audit` | Qui a modifié quoi, quand (checksums config + journal) |
| `am plugins [--test <nom>]` | Scripts d'extension sur les événements (contrat JSON stdin/stdout) |
---
## 🌐 Options globales
Disponibles avant ou après la sous-commande.
| Option | Effet |
|--------|-------|
| `-c, --config <FILE>` | 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 <THEME>` | Thème de couleur |
---
## 🎨 Fonctionnalités avancées
### Alias
```yaml
aliases:
cc: claude-code
gemini: antigravity-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"]
```
---
## ⚡ Shell AI
`am ai` (alias `am shell`) est une commande dédiée aux **actions shell via langage naturel**. Elle repose sur un agent léger (par défaut **AIChat**, installé comme n'importe quel autre agent via le catalogue) et réutilise le registre de providers LLM (`providers.rs`) pour choisir le modèle le plus rapide/cheap.
### Flux d'exécution
```mermaid
sequenceDiagram
autonumber
participant User
participant cli as cli.rs
participant shell_ai as shell_ai.rs
participant catalog as catalog.rs
participant providers as providers.rs
participant runner as runner.rs
participant aichat as aichat (agent)
User->>cli: am ai "traite les JSON"
cli->>shell_ai: parse args (--exec, --files)
shell_ai->>catalog: agent "aichat" installé ?
catalog-->>shell_ai: Ok / install
shell_ai->>providers: provider & modèle par défaut
providers-->>shell_ai: config (ollama / cheap cloud)
shell_ai->>shell_ai: injecte cwd + fichiers (--files)
shell_ai->>runner: exec aichat -f . -e "..."
runner->>aichat: lancement processus
aichat-->>runner: commande générée / exécutée
runner-->>shell_ai: output + exit code
shell_ai->>shell_ai: journalise événement shell_ai
shell_ai-->>User: résultat ou confirmation
```
### Sécurité
| Règle | Détail |
|---|---|
| `--dry-run` par défaut | Aucune commande modifiante n'est exécutée sans confirmation |
| Classification risk/certainty | Inspiré d'AI CLI : chaque commande est classée `safe` ou `risky` |
| Confirmation utilisateur | Les commandes `risky` demandent une validation explicite |
| Mode local possible | Support d'Ollama via `providers.rs` pour ne pas sortir les données |
### Dépendances
- `src/shell_ai.rs` : parsing du prompt, gestion des flags, appel à l'agent
- `src/providers.rs` : résolution du provider/modèle
- `src/runner.rs` : exécution du binaire `aichat`
- `src/events.rs` : journalisation `shell_ai` dans le journal JSONL
- `config.yaml` : définition de l'agent `aichat` + alias `ai`
---
## 📚 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* 🚀
Generated
+1477 -51
View File
File diff suppressed because it is too large Load Diff
+12 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "agent-manager"
version = "0.2.10"
version = "1.1.9"
edition = "2021"
description = "Manage local AI coding agents: list, install, start, stop, update — with automatic dependency handling and a YAML-driven catalog."
license = "MIT"
@@ -25,15 +25,25 @@ semver = "1"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
serde_yaml = "0.9"
rustyline = { version = "14", default-features = false, features = ["with-file-history"] }
reedline = "0.49"
nu-ansi-term = "0.50"
sha2 = "0.10"
shell-words = "1"
tar = "0.4"
tempfile = "3"
tiny_http = "0.12"
sha1 = "0.10"
base64 = "0.22"
toml = "0.8"
ureq = { version = "2", default-features = false, features = ["tls"] }
wait-timeout = "0.2"
keyring = { version = "3", features = ["windows-native", "linux-native"] }
rpassword = "7"
which = "7"
zip = "0.6"
crossterm = "0.29"
ratatui = "0.30"
clap_mangen = "0.3"
[target.'cfg(windows)'.dependencies]
windows-sys = { version = "0.52", features = ["Win32_Foundation", "Win32_System_Threading", "Win32_System_ProcessStatus", "Win32_System_Diagnostics_ToolHelp", "Win32_System_Console"] }
+96
View File
@@ -285,3 +285,99 @@ avec purge.
$ am uninstall cowsay --purge --yes
removed 'cowsay' from .../cowsay.yaml (backup: .../cowsay.yaml.bak)
uninstalled Cowsay (files removed, config purged)
## Favoris, notes et tags personnels (v0.4.1)
$ am favorite claude-code
⭐ claude-code added to favorites
$ am note claude-code use sonnet for this repo
note saved for 'claude-code'
$ am tag claude-code python frontend
tagged 'claude-code' with python, frontend
$ am tags
┌───┬────────────┬───────┬─────────────┐
│ # │ TAG │ COUNT │ AGENTS │
├───┼────────────┼───────┼─────────────┤
│ 0 │ #frontend │ 1 │ claude-code │
│ 1 │ #python │ 1 │ claude-code │
└───┴────────────┴───────┴─────────────┘
L'étoile apparaît dans am list, am status et am info ; les tags sont
filtrables avec am search --tag, et tout survit au redémarrage (état v3) :
$ am info claude-code | tail
tags anthropic · assistant · source-available · mainstream
personal
● favorite ★
● tags #frontend #python
● note use sonnet for this repo
$ am search --tag python
┌───┬──────────────────────────┬──────────────┬─────────────┬─────────────┐
│ # │ NAME │ CATEGORY │ INSTALLABLE │ DESCRIPTION │
├───┼──────────────────────────┼──────────────┼─────────────┼─────────────┤
│ 0 │ ★ Claude Code │ coding-agent │ yes │ Agent termi… │
└───┴──────────────────────────┴──────────────┴─────────────┴─────────────┘
## Profils d'environnement (v0.4.1)
Des profils nommés dans la configuration (env + args + agent par défaut)
s'appliquent au lancement :
profiles:
dev:
agent: claude-code
env: {DEBUG: "1", LOG_LEVEL: debug}
args: [--model, sonnet]
prod:
env: {LOG_LEVEL: info}
$ am profile list
PROFILE AGENT ENV ARGS
------- ----------- --------------------- ----------------
dev claude-code DEBUG=1 LOG_LEVEL=… --model sonnet
prod — LOG_LEVEL=info —
$ am start claude-code --profile dev
# lance claude --model sonnet avec DEBUG=1 et LOG_LEVEL=debug
$ am start --profile dev # agent par défaut du profil
$ am start --profile staging # -> error: unknown profile 'staging' — …
# available profiles: dev, prod
## Dashboard TUI (v0.4.1)
am dashboard ouvre un tableau de bord temps réel (ratatui/crossterm, aucune
dépendance runtime) : vue d'ensemble (statuts, PID, uptime, ★), activité
(journal d'événements), stats par agent, sessions et projets. Tab / ← / →
changent d'onglet, j/k défilent, q quitte ; rafraîchissement chaque seconde.
Sur une sortie non interactive (pipe, script), un instantané texte est
affiché à la place :
$ am dashboard | head
agent-manager dashboard — 2 installed · 1 running · 12 sessions
overview
★ claude-code running 2.1.233 pid 4242 (up 3h12m)
aider installed 0.76.0 —
codex external — —
$ am dashboard --json # l'instantané complet en JSON pour les scripts
## Pages de manuel et complétions dynamiques (v0.4.1)
$ am man dashboard
.TH am-dashboard 1 "dashboard "
.SH NAME
dashboard - Live TUI dashboard: overview, activity, stats, sessions, projects
...
$ am man --output man/ # am.1 + une page par commande (44 pages)
man pages written to man/ (am.1 + 44 pages)
$ am completion bash --installed # Tab complète dynamiquement les
# agents installés, alias et groupes
# (interroge 'am _agents --installed')
+170 -13
View File
@@ -1,7 +1,7 @@
# 🚀 agent-manager — vos agents IA, gérés comme des apps
**am** liste, installe, démarre, met à jour et désinstalle vos agents IA de
coding (Claude Code, Codex, Aider, jcode, Prime Agent… **72 agents connus**)
coding (Claude Code, Codex, Aider, jcode, Prime Agent… **78 agents connus**)
en une ligne de commande — avec la gestion des dépendances (Node.js, Python,
Go, Rust…) prise en charge pour vous.
@@ -11,7 +11,7 @@ Go, Rust…) prise en charge pour vous.
## ✨ Pourquoi am ?
- 🗂️ **Catalogue de 72 agents prêts à l'emploi** — descriptions, méthodes
- 🗂️ **Catalogue de 78 agents prêts à l'emploi** — descriptions, méthodes
d'installation, dépendances et commandes de démarrage déjà configurées.
- 📦 **9 méthodes d'installation** — npm, pip, uv, cargo, go, bun, script
d'installation, binaire (GitHub Releases/Gitea) et dépôt git — toujours
@@ -48,6 +48,32 @@ plateforme, il compile automatiquement depuis les sources.
> 🔄 **Mise à jour** : relancez simplement la même commande.
### 🚀 Premier lancement (onboarding v1.1.0)
Au premier lancement (ou dès que vous tapez `am ai` / `am ask` sans
provider configuré), `am` vous propose le wizard d'onboarding :
am setup
Il vous guide en 3 étapes :
1. **Provider** : anthropic, openai, deepseek, google, ollama (local) ou
custom (base URL).
2. **Token API** : saisie masquée, stockée dans le trousseau OS (keyring)
— jamais écrite en clair dans la config.
3. **Modèle par défaut** : choisi parmi les modèles déclarés du provider.
Le wizard installe ensuite **aichat** (le moteur de `am ai`) si vous
acceptez, et génère **6 rôles copilot** pour aichat (`am setup --roles`
pour les régénérer) :
| Rôle | Rôle |
|---|---|
| `am-copilot` — guide & catalogue am | `am-dev` — code, git, tests |
| `am-operator` — shell sécurisé | `am-analyst` — coûts, logs, stats |
| `am-do` — exécution pure pour `--exec` | `am-orchestrator` — groupes, lab |
Utilisation : `am ai --role am-operator "compresse les fichiers JSON"`.
---
## 🎬 Vos 3 premières commandes
@@ -76,9 +102,31 @@ plateforme, il compile automatiquement depuis les sources.
|----------|------|
| am list | agents installés (gérés + détectés sur le PATH) |
| am list --all | tout le catalogue, avec l'état de chacun |
| am search <mot-clé> | recherche par nom, description, catégorie, tag |
| am search <mot-clé> | recherche fuzzy : tolère les fautes de frappe, classe par pertinence, propose « vouliez-vous dire » |
| am suggest <requête> | recommande un agent pour une demande en langage naturel (tags + usage réel) |
| am ask "<demande>" | langage naturel → commande(s) am : règles locales hors-ligne, raffinement LLM optionnel (settings.ask), confirmation avant exécution — ex: am ask "installe claude et lance-le" |
| am ai "<demande>" [--exec] [--files <path>] [--role <rôle>] | langage naturel → action shell via AIChat (alias: am shell) : conversationnel par défaut ; --exec génère la commande, la classe safe/risky et applique la politique de sécurité (settings.shell_ai, dry-run par défaut — --yes pour exécuter) ; --role = rôle copilot am-* (am setup) |
| am setup [--roles] | wizard d'onboarding : provider, token (trousseau OS), modèle par défaut, installation d'aichat + rôles copilot (v1.1.0) |
| am info <agent> | fiche détaillée (installation, dépendances, site…) |
| am status [agent] | état, version, PID, logs |
| am models | inventaire des modèles locaux (ollama, llama.cpp, LM Studio) |
| am models --prune | purge des modèles inutilisés (--dry-run : simulation) |
| am providers list / add / set-token | registre LLM centralisé : base_url, modèles par provider, clé dans le trousseau (jamais en clair, résolue via @secret) |
| am catalog update / add <url> | catalogue distant : rafraîchit l'officiel ou ajoute un catalogue d'équipe |
| am registry publish/search/install | registre communautaire de catalogues (Gitea) : publication, recherche, installation avec checksum sha256 vérifié et décision de confiance explicite |
| am audit | qui a modifié quoi, quand (checksums config + journal) |
| am sessions --export <id> | export d'une session (métadonnées + commandes + extrait de log) |
| am sessions --retention <jours> | purge des sessions terminées au-delà de N jours |
| am init --template <stack> | génère une config pré-remplie (web, python, rust, cli) |
| am doctor --watch <s> | vérifications périodiques de l'environnement + alerte en cas de panne |
| am monitor [--json] | TUI temps réel des processus gérés (CPU/RSS/uptime) + alertes de seuils |
| am stats --costs | coût estimé par agent (tokens in/out, $) — modèles de prix configurables |
| am sync [--message <m>] | sauvegarde git de l'état (state.json, journal, historique) — secrets exclus |
| am migrate export/import | bundle de transfert machine A → B (config + état + historique + backups) |
| am service install <agent> --autostart | service système (systemd / launchd / tâche Windows) + démarrage auto |
| am schedule add <cmd...> --at HH:MM | planifie une commande am (ex: update --all) ; list / remove / run |
| am start group:dev --parallel | orchestration de groupes : ordre, --parallel, attente de santé (healthcheck) |
| am run <agent> --container | exécute l'agent dans son profil conteneur (docker/podman) |
**Statuts** : 🟢 running · 🔵 installed (géré par am) · 🟡 external (trouvé
sur le PATH) · ⚪ not-installed · 🔴 not-installable (SaaS/desktop)
@@ -90,27 +138,107 @@ sur le PATH) · ⚪ not-installed · 🔴 not-installable (SaaS/desktop)
| am install <agent> | installe (dépendances vérifiées et proposées) |
| am install <agent> --method pip | choisit une méthode d'installation |
| am update <agent> | met à jour vers la dernière version connue |
| am config set settings.default_shell pwsh | modifie la configuration sans éditeur |
| am alias add cc claude-code | raccourci pour un agent (list / remove aussi) |
| am init | génère un agent-manager.yaml selon la pile du projet (Node/Rust/Python…) |
| am uninstall <agent> | désinstalle et nettoie (--purge : logs + config) — gère aussi les agents externes (npm/pip/uv/cargo/bun, sinon suppression des fichiers) |
| am export / am import | sauvegarde et restaure config + état |
### 📁 Où et comment agent-manager installe et gère les agents
`am` ne touche jamais au système : chaque agent est installé dans un **répertoire utilisateur isolé**, et ses exécutables (ou shims) sont centralisés dans un `bin/` commun que `am` met automatiquement sur le `PATH` au lancement.
| Plateforme | Répertoire de l'agent | Dossier `bin` partagé | Fichier d'état | Configuration utilisateur |
|---|---|---|---|---|
| Linux | `~/.local/share/agent-manager/agents/<agent>/` | `~/.local/share/agent-manager/bin/` | `~/.local/state/agent-manager/state.json` | `~/.config/agent-manager/config.yaml` |
| macOS | `~/Library/Application Support/agent-manager/agents/<agent>/` | `~/Library/Application Support/agent-manager/bin/` | `~/Library/Application Support/agent-manager/state.json` | `~/.config/agent-manager/config.yaml` |
| Windows | `%LOCALAPPDATA%\agent-manager\agents\<agent>\` | `%LOCALAPPDATA%\agent-manager\bin\` | `%LOCALAPPDATA%\agent-manager\state.json` | `%APPDATA%\agent-manager\config.yaml` |
Les variables d'environnement `AGENT_MANAGER_DATA`, `AGENT_MANAGER_STATE` et `AGENT_MANAGER_CONFIG_DIR` peuvent déplacer ces emplacements. Le répertoire d'installation est aussi configurable via `settings.install_dir` et celui des logs via `settings.log_dir`.
#### Cycle d'installation (`am install <agent>`)
1. **Résolution du catalogue** — `am` fusionne le catalogue embarqué (78 agents) avec `~/.config/agent-manager/config.yaml` et un éventuel `./agent-manager.yaml`. Vos définitions remplacent les entrées par défaut du même nom.
2. **Vérification des dépendances** — les outils requis (`node`, `python`, `uv`, `cargo`, `go`, `bun`, `git`...) sont détectés sur le `PATH`. S'il en manque, `am` détecte l'OS et propose la commande d'installation (`scoop`, `winget`, `apt`, `dnf`, `pacman`, `brew`...). Avec `--yes` ou `settings.auto_install_deps: true`, il peut l'exécuter à votre place.
3. **Choix de la méthode** — chaque agent déclare une méthode principale et des alternatives. `--method <nom>` force le choix ; sinon `am` prend la première disponible. Pour `am update`, c'est la méthode utilisée lors de l'installation initiale qui est reconstruite.
4. **Exécution de l'installateur** — selon le type, les commandes réelles lancées sont :
| Méthode | Ce que `am` exécute localement | Où ça atterrit |
|---|---|---|
| `npm` | `npm install -g --prefix <root> <package>` | binaires dans `<root>/bin/`, liens ou copie dans `bin/` |
| `bun` | `BUN_INSTALL=<root> bun install -g <package>` | binaires dans `<root>/bin/`, shims dans `bin/` |
| `pip` | `python -m venv <root>/venv` puis `<venv>/bin/pip install --upgrade <package>` | exécutables dans `<root>/venv/bin/` |
| `uv` | `uv venv --python 3.13 <root>/venv` puis `uv pip install --python <venv>/bin/python <package>` | exécutables dans `<root>/venv/bin/` |
| `cargo` | `cargo install --root <root> <crate>` | binaires dans `<root>/bin/` |
| `go` | `GOBIN=<bindir> go install <module>@latest` | binaire directement dans `bin/` |
| `curl` | télécharge le script, l'affiche en `--verbose`, puis l'exécute avec `sh <script>` dans `<root>/` | le script gère son propre déploiement ; `am` repère les binaires résultants |
| `binary` | télécharge un asset release (`url` ou `repo`), vérifie le `sha256` si fourni, extrait dans `<root>/dist/`, copie dans `bin/` | binaire unique dans `bin/` |
| `git` | `git clone --depth 1 <repo> <root>/repo`, exécute les commandes `build`, puis copie `binary_path` dans `bin/` ou crée un shim | `bin/<agent>` ou shim |
5. **Post-installation** — `am` exécute les commandes `post_install` déclarées dans la fiche, avec `<bindir>` en tête du `PATH`.
6. **Détection de version** — `am` lance `<binaire> --version` (puis `-V`) pour enregistrer la version réelle.
7. **Enregistrement** — une entrée est écrite dans `state.json` (`name`, `version`, `method`, `install_dir`, `bins`, `run`, `installed_at`, `pid`, etc.).
#### Cycle de gestion (`am start / stop / update / uninstall`)
- **Démarrage** — `am start <agent>` lit `state.json` pour retrouver le binaire et la commande `run` configurée. En arrière-plan (`--background`), le PID est enregistré dans `state.json` et la sortie est redirigée vers `<log_dir>/<agent>.log`.
- **Arrêt** — `am stop` envoie `SIGTERM`, attend `settings.stop_timeout_secs` (5 s par défaut), puis `SIGKILL` si besoin. Le PID est effacé de `state.json`.
- **Mise à jour** — `am update <agent>` détermine la dernière version disponible (registre npm/PyPI/cargo/release), crée une sauvegarde (`am update --rollback`), réinstalle avec la même méthode et met à jour `state.json`. Les versions épinglées (`pin_version`) sont respectées.
- **Désinstallation** — `am uninstall <agent>` arrête le processus, supprime `<root>/`, supprime les binaires de `bin/` et efface l'entrée de `state.json`. `--purge` efface aussi les logs et retire la définition du fichier de config utilisateur.
### 🚀 Exécuter
| Commande | Rôle |
|----------|------|
| am start <agent> | avant-plan (Ctrl-C pour quitter) |
| am start <agent> --background --env KEY=VALEUR | détaché, PID et log gérés |
| am start [agent] | avant-plan (Ctrl-C pour quitter) — sans argument, lance l'agent par défaut du projet |
| am start <agent> --background --env KEY=VALEUR | détaché, PID et log gérés ; --env NOM=@secret injecte un secret du trousseau |
| am stop <agent> | arrêt gracieux puis forcé (--force : immédiat) |
| am restart <agent> | arrête puis redémarre |
| am run <agent> [args…] | exécution directe, sans gestion de processus |
### 📊 Observer & retrouver
| Commande | Rôle |
|----------|------|
| am stats [agent] --period 7d/30d/90d | statistiques d'utilisation : lancements, durées, échecs, barres ASCII |
| am top --period | les 10 agents les plus utilisés |
| am report --last-week / --last-month | digest markdown (lancements, échecs, changements, sessions) |
| am log [agent] --kind --since --follow | journal des événements : tout ce que am a fait, en direct avec --follow |
| am timeline --project --since | vue chronologique unifiée (journal + commandes du REPL) |
| am projects [nom] | quel agent travaille sur quel projet (agent dominant, sessions, durées) |
| am sessions [agent] --status --show --resume | registre des sessions + reprise d'une session arrêtée |
| am history --search --failed --rerun N | historique des commandes (am + shell), filtrable et réexécutable |
| am history 12..25 --save <f> · am playbook <f> | exporte une plage en playbook YAML et la rejoue pas à pas ({{var}}) |
| am lab --agents a,b --task <f> [--parallel] [--json] | benchmark : même tâche sur plusieurs agents (durée, exit, coût) — tâches versionnables dans <state>/lab/ |
| am plugins [--test <nom>] | scripts d'extension sur les événements (on_install/on_start/on_stop/on_update), contrat JSON stdin/stdout, timeout — exemples dans examples/plugins/ |
| am logs <agent> --follow | tail du log d'un agent, en direct |
| am dashboard | tableau de bord TUI temps réel : vue d'ensemble, activité, stats, sessions, projets (Tab/←/→ : onglets, j/k : défilement, q : quitter) |
| am web [--port <p>] | dashboard web local en lecture seule (127.0.0.1) : vue d'ensemble, graphiques, sessions, événements, projets — API JSON /api/* avec les mêmes contrats que les sorties --json |
### 🎯 Personnaliser
| Commande | Rôle |
|----------|------|
| am favorite <agent> / am unfavorite | étoile ★ dans am list, am status et am info (persistante) |
| am note <agent> <texte…> | note libre affichée dans am info (am note <agent> : affiche) |
| am tag <agent> <mot>… / am untag <agent> <mot> | tags personnels, filtrables avec am search --tag |
| am tags [agent] | liste les tags personnels et les agents qui les portent |
| am profile list / show | profils d'environnement (env + args + agent par défaut) |
| am start <agent> --profile dev | lance un agent avec un profil ; am start --profile dev utilise l'agent du profil |
| am man [commande] --output man/ | génère les pages de manuel (am.1 + une page par commande) |
### 🧰 Système
| Commande | Rôle |
|----------|------|
| am doctor | vérifie outils, config, chemins — avec commandes d'installation |
| am doctor --fix | répare ce qui peut l'être, propose d'installer les outils manquants |
| am config show / edit / add | gère votre configuration |
| am completion <shell> | script de complétion (bash, zsh, fish, powershell) |
| am watch <agent> --restart --notify | supervise un agent et le relance en cas de crash |
| am secret set NOM --agent A --value … / list / unset | secrets dans le trousseau du système (jamais en clair) |
| am config show / edit / add / set | gère votre configuration (hooks on_start/on_stop/… dans settings.hooks) |
| am open <agent> | ouvre le répertoire d'installation dans l'explorateur |
| am completion <shell> [--installed] | script de complétion (bash, zsh, fish, powershell, elvish) ; --installed complète dynamiquement les agents installés, alias et groupes |
| am serve --token [--port <p>] | API HTTP + WebSocket authentifiée pour piloter am à distance (stats, run, start, stop, ask…) — rate limiting par IP, TLS via reverse proxy |
| am self-update | met à jour am lui-même (si configuré) |
| am self-uninstall | désinstalle am et tout ce qu'il a créé (confirmation) |
| am | shell interactif : bannière, passerelle système, Tab et historique |
@@ -157,6 +285,7 @@ Disponibles avant **ou après** la sous-commande.
| -v, --verbose | affiche chaque commande exécutée |
| -q, --quiet | uniquement les erreurs |
| --no-color | désactive les couleurs |
| --lang <fr\|en> | langue des messages : fr (défaut) ou en — AM_LANG/LANG lus sinon |
| -c, --config <fichier> | configuration alternative |
---
@@ -166,10 +295,18 @@ Disponibles avant **ou après** la sous-commande.
am start cc # alias (cc -> claude-code)
am start group:dev # démarre tout un groupe en arrière-plan
am stop group:dev
am start cc --profile dev # profil d'environnement : env + args injectés
am dashboard # TUI temps réel : toute l'activité d'un coup d'œil
am web # dashboard web local (ouvre le navigateur) : http://127.0.0.1:7878/
am favorite cc && am tag cc python # personnalisez votre parc
am search --tag python # retrouvez les agents que vous avez tagués
am # shell interactif (bannière style Hermes) :
❯ inst<Tab> # complétion Tab : commandes, agents, groupes, options
❯ inst<Tab> # complétion Tab : commandes, agents installés, groupes, options
❯ install jcode
❯ dashboard # le dashboard se lance aussi depuis le REPL
❯ web # ... et le dashboard web aussi (am web --port pour changer le port)
❯ exit # historique persistant (flèches haut/bas)
### 🐚 Passerelle système
@@ -188,16 +325,21 @@ PATH — pwsh, powershell, cmd, bash, zsh, fish, sh, nu, elvish).
❯ ls | where size > 1mb # filtre la dernière table (>, <, >=, <=, ==, !=, =~)
❯ ps | where name =~ am # =~ cherche dans le texte
❯ ls | get name # sélectionne une colonne
❯ cd <Tab> # complétion des dossiers uniquement, un niveau par Tab
❯ cd <Tab> # complétion des dossiers — menu interactif façon Nushell
❯ shell # affiche le shell courant + les shells disponibles
❯ shell bash # change le shell de la session
❯ !ls · !list # force l'exécution système (même nom qu'une commande am)
❯ cd ~/projets # change le répertoire de la session (persistant)
❯ /help # commandes slash : /help · /version · /exit · /shell <nom>
Le menu Tab affiche une **description** à côté de chaque candidat
(commandes et agents), comme Nushell, et **cycle** entre les propositions à
chaque Tab.
La complétion Tab est un **menu interactif façon Nushell** : une
correspondance unique est insérée directement ; plusieurs correspondances
ouvrent un menu sous la ligne avec le **premier choix en surbrillance**, et
chaque Tab déplace la surbrillance vers le choix suivant (Shift+Tab vers
l'arrière). **Entrée** valide le choix, **Échap** ferme le menu, les flèches
↑/↓ naviguent et continuer à taper filtre la liste en direct. Le menu
affiche une **description** à côté de chaque candidat (commandes et agents)
et suit la palette du thème actif.
Pour rendre le choix permanent : `settings.default_shell: pwsh` dans
`config.yaml` (voir `am config path`).
@@ -241,7 +383,7 @@ supprimez aussi ces emplacements.)
1. --config <fichier>
2. ./agent-manager.yaml (répertoire courant)
3. ~/.config/agent-manager/config.yaml
4. catalogue embarqué (72 agents)
4. catalogue embarqué (78 agents)
Vos définitions **complètent ou surchargent** le catalogue par nom.
@@ -294,6 +436,21 @@ multi-fichiers pris en charge ; configuration validée au démarrage.
(Windows) — l'état et les logs dans ~/.local/state/agent-manager (Linux) ou
%LOCALAPPDATA%\\agent-manager (Windows).
**Où vivent les statistiques, les sessions et l'historique ?** Dans le
répertoire d'état, au format JSON lisible et 100 % local : events-YYYYMM.jsonl
(journal de chaque action), sessions.json (registre des sessions),
history/ (historique structuré du shell), projects.json (agrégats par
projet). Interrogeables avec am stats, am top, am log, am timeline,
am projects, am sessions et am history.
**Où vivent les secrets ?** Dans le trousseau de votre système (Windows
Credential Manager, macOS Keychain, Linux Secret Service) — jamais dans la
configuration ni dans les logs. Injection avec --env NOM=@secret.
**Puis-je automatiser des actions ?** Oui : hooks on_install/on_start/on_stop/
on_update dans settings.hooks (globaux) ou dans le profil d'un projet, et
am watch pour superviser un agent avec redémarrage automatique.
**Comment mettre à jour am ?** Relancez l'installeur one-liner (ou
am self-update si le dépôt de release est configuré).
+81 -33
View File
@@ -1,62 +1,110 @@
# Publier une release
Les installateurs one-liner (`install.sh` et `install.ps1`) téléchargent
les binaires attachés à la **dernière release** du dépôt Gitea
Les installateurs one-liner (`install.sh` et `install.ps1`), la commande
`am self-update` et les paquets (scoop/winget/homebrew) consomment les
**artefacts attachés à la dernière release** du dépôt Gitea
(https://git.dracodev.net/Projets/agent-manager). Sans binaire pour la
plateforme, ils retombent sur `cargo install --git` (plus lent mais toujours
fonctionnel).
plateforme, les installateurs retombent sur `cargo install --git`.
La phase 1 (v0.4.1) a ajouté le pipeline CI (issue #42) : sur chaque tag
`v*`, `.gitea/workflows/release.yml` construit Linux (x86_64 + aarch64
musl statiques), Windows (x86_64) et macOS (x86_64 + aarch64) et publie la
release. La procédure locale ci-dessous reste disponible pour produire
manuellement les mêmes artefacts (ou les plateformes sans runner CI).
## 1. Bumper la version
Dans Cargo.toml (ex. `0.2.1`), puis mettre à jour Cargo.lock
(`cargo check`) et compiler :
Dans Cargo.toml (ex. `0.4.1`), puis `cargo check` pour mettre à jour
Cargo.lock, et lancer toute la batterie :
cargo build --release # binaire Windows (am.exe) sur Windows
cargo test --locked # 240+ tests
cargo clippy --all-targets -- -D warnings # si possible
# binaire Linux STATIQUE (musl) : compatible toutes distributions,
# y compris Debian 12 (glibc 2.36) — ne JAMAIS publier un binaire glibc
# compilé sur une base récente.
docker run --rm -v "${PWD}:/work" -w /work -e CARGO_TARGET_DIR=/tmp/target-musl \
rust:1.94-alpine sh -c "apk add --no-cache build-base && \
rustup target add x86_64-unknown-linux-musl && \
cargo build --release --locked --target x86_64-unknown-linux-musl && \
cp /tmp/target-musl/x86_64-unknown-linux-musl/release/am dist/am-linux-x86_64"
## 2. Produire les binaires et les archives
## 2. Créer les archives des binaires
### Windows (x86_64) — natif
Windows (PowerShell) :
scripts/build-release.ps1 # target/release/am.exe -> dist/am-windows-x86_64.zip
Compress-Archive target\release\am.exe am-windows-x86_64.zip
### Linux — binaire STATIQUE (musl), compatible toutes distributions,
### y compris Debian 12 (glibc 2.36) — ne JAMAIS publier un binaire glibc
### compilé sur une base récente.
Linux (l'archive doit contenir un fichier nommé « am ») :
# cargo-zigbuild : zig (~50 Mo) fournit le linker croisé pour les DEUX
# cibles musl (rust:1.94-alpine n'embarque pas de compilateur croisé
# aarch64 : 'aarch64-linux-musl-gcc not found').
docker run --rm -v "${PWD}:/work" -w /work -e CARGO_TARGET_DIR=/tmp/am-target \
-e CARGO_INCREMENTAL=0 rust:1.94-alpine sh -c "apk add --no-cache build-base zip curl >/dev/null && \
rustup target add x86_64-unknown-linux-musl aarch64-unknown-linux-musl && \
curl -fsSL https://ziglang.org/download/0.14.1/zig-x86_64-linux-0.14.1.tar.xz -o /tmp/zig.tar.xz && \
tar -xf /tmp/zig.tar.xz -C /opt && \
export PATH=/opt/zig-x86_64-linux-0.14.1:\$PATH && \
cargo install cargo-zigbuild --locked && \
cargo zigbuild --release --locked --target x86_64-unknown-linux-musl --target aarch64-unknown-linux-musl && \
mkdir -p dist && \
cp /tmp/am-target/x86_64-unknown-linux-musl/release/am dist/am-linux-x86_64 && \
cp /tmp/am-target/aarch64-unknown-linux-musl/release/am dist/am-linux-aarch64 && \
cd dist && tar -czf am-linux-x86_64.tar.gz am-linux-x86_64 && \
tar -czf am-linux-aarch64.tar.gz am-linux-aarch64"
docker run --rm -v "${PWD}:/work" -w /work rust:1.94-alpine sh -c \
"cd dist && cp am-linux-x86_64 am && tar -czf am-linux-x86_64.tar.gz am && rm am"
### macOS (x86_64 + aarch64) — via CI (runner macOS) :
## 3. Créer la release sur Gitea
# le job 'macos' du workflow release.yml produit :
# am-macos-x86_64.tar.gz am-macos-aarch64.tar.gz
# (compilation croisée macOS impossible depuis Windows/Linux ; sans
# runner macOS, ces archives manquent et l'install.sh compile depuis
# les sources sur macOS, ce qui reste fonctionnel.)
Via l'interface web : Releases > New Release, tag v0.2.0, attacher les
archives ci-dessus.
Vérifier chaque archive : `am version` doit répondre, et `am doctor` ne
doit signaler aucune dépendance manquante.
Ou via l'API (jeton Gitea requis) :
## 3. Rendre les manifests de packaging (issue #42)
Une fois toutes les archives dans `dist/` :
scripts/render-manifests.ps1 -Version 0.4.3
Ce script rend, avec la version et les sha256 réels :
- `dist/scoop/am.json` → `scoop install dist/scoop/am.json`
(ou à ajouter à un bucket ; checkver/autoupdate inclus)
- `dist/winget/*.yaml` → à soumettre à microsoft/winget-pkgs
(`winget install BrunoDracodev.AgentManager`)
- `dist/homebrew/am.rb` → à servir via un tap, ou à soumettre
- `dist/rpm/am.spec` → rpmbuild -bb (avec am-linux-x86_64.tar.gz
dans ~/rpmbuild/SOURCES)
- Paquet deb : `packaging/deb/make-deb.sh 0.4.3` → dist/am_0.4.3_amd64.deb
## 4. Créer la release sur Gitea
Via l'interface web : Releases > New Release, tag v0.4.3, attacher les
archives. Ou via l'API (jeton Gitea requis) :
curl -X POST -H "Authorization: token <JETON>" \
-H "Content-Type: application/json" \
-d '{"tag_name":"v0.2.0","name":"v0.2.0","body":"notes de version"}' \
-d '{"tag_name":"v0.4.3","name":"v0.4.3","body":"notes de version"}' \
https://git.dracodev.net/api/v1/repos/Projets/agent-manager/releases
curl -X POST -H "Authorization: token <JETON>" \
-F "attachment=@am-windows-x86_64.zip" \
-F "attachment=@dist/am-windows-x86_64.zip" \
https://git.dracodev.net/api/v1/repos/Projets/agent-manager/releases/<id>/assets?name=am-windows-x86_64.zip
curl -X POST -H "Authorization: token <JETON>" \
-F "attachment=@am-linux-x86_64.tar.gz" \
https://git.dracodev.net/api/v1/repos/Projets/agent-manager/releases/<id>/assets?name=am-linux-x86_64.tar.gz
# idem pour am-linux-x86_64.tar.gz, am-linux-aarch64.tar.gz,
# am-macos-x86_64.tar.gz, am-macos-aarch64.tar.gz (si CI) et
# checksums.txt.
## 4. Tag git
## 5. Tag git (déclenche aussi le pipeline CI)
git tag v0.2.0 && git push origin v0.2.0
git tag v0.4.3 && git push origin v0.4.3
## Conventions de nommage (attendues par les installateurs et self-update)
Les conventions de nommage attendues par les installateurs :
- am-windows-x86_64.zip (contient am.exe)
- am-linux-x86_64.tar.gz (contient am)
- am-linux-aarch64.tar.gz (contient am)
- am-macos-x86_64.tar.gz / am-macos-aarch64.tar.gz (contiennent am)
## Vérification finale
am self-update --check # doit annoncer la nouvelle version
am self-update # met à jour le binaire courant
+855
View File
@@ -0,0 +1,855 @@
# 🗺️ ROADMAP agent-manager — vers le « super outil »
> **Version du document : 3.1** · Statut : phases 0 à 3 livrées
> (v0.3.0 → v1.0.1), maintenance v1.0.2 → v1.1.5
>
> 🧭 **Bilan du 2026-08-23** : tout le périmètre versionné (J0 → J3, v0.7.0,
> épique v1.1.0) est livré — **0 issue ouverte** sur Gitea. Il reste :
> **1 bug prioritaire** (hang de `cargo test` / `am doctor`, §15.4),
> 3 fonctionnalités P1 jamais découpées en issues (§15.2), des activités de
> release (§15.3) et des idées neuves proposées (§16).
> Base : analyse du code **v0.2.7** (Rust, 45+ tests, zéro dépendance runtime)
>
> ✅ **Phase 0 livrée en v0.3.0 (2026-08-17)** : issues #2 à #16 clôturées,
> 157 tests, release publiée sur Gitea. Les découpages des phases 1 à 3 sont
> en place sur Gitea (issues #25 à #80) : v0.4.0, v0.5.0, v1.0.
>
> ✅ **Phase 1 livrée en v0.4.1 (2026-08-17)** : 17/17 issues clôturées
> (#26–#42), 240+ tests. v0.4.0 a livré 13/17 (#26–#32, #34–#38) ; v0.4.1
> complète avec le dashboard TUI (#33), les favoris/notes/tags (#39), les
> profils d'environnement (#40), les complétions dynamiques + man pages
> (#41) et le packaging officiel + CI (#42). Binaires Windows/Linux publiés
> sur Gitea — am self-update et les installateurs servent la v0.4.1.
>
> ✅ **Phase 2 livrée en v0.6.0 (2026-08-19)** : 28/28 issues clôturées
> (#47–#75), 250+ tests. am web, i18n, services, schedule, lab, sync,
> migrate, models, plugins d'événements… Binaires publiés sur Gitea.
>
> ✅ **Phase v0.7.0 livrée (2026-08-19)** : 5/5 issues clôturées (#88–#92) —
> registre de providers LLM (am providers), secrets partagés par provider,
> flags --provider/--model/--no-config à l'install, configuration
> post-install (bloc config:).
>
> ✅ **Phase 3 livrée en v1.0.0 (2026-08-20)** : 5/5 issues clôturées
> (#76–#80) — télémétrie opt-in, am registry, am ask, profils sandbox,
> am serve (API HTTP + WebSocket). v1.0.1 : self-update décompresse les
> archives, prompt REPL avec shell actif.
>
> 🔧 **Maintenance v1.0.3 (2026-08-20)** : commandes REPL ask/serve/registry
> routées vers am (v1.0.2) ; détection externe corrigée — champ `detect`
> (sonde PATH explicite) pour les lanceurs interpréteurs (npx/python),
> plus de faux « external » ; docs alignées.
>
> 🔧 **Maintenance v1.0.4 (2026-08-20)** : catalogue enrichi — 5 agents
> **shell-ai** ajoutés (issues #94 #95) : AIChat (alias `ai`, binaire GitHub
> Release), ShellGPT (pip), Fabric (go), Shell AI (npm/Ollama), AI CLI
> (binaire, politique de sécurité risk/certainty). Catalogue : 77 agents.
>
> 🔧 **Maintenance v1.0.5 (2026-08-20)** : **commande `am ai` livrée**
> (issues #96 #97) — langage naturel → action shell via AIChat : mode
> conversationnel (aichat -f <ctx>), mode --exec avec pipeline de sécurité
> (génération aichat --dry-run, classification safe/risky + certainité,
> politique dry-run par défaut configurable settings.shell_ai, confirmation
> y/N pour les commandes risky, exécution via le shell de l'utilisateur),
> flags --files/--provider/--model/--yes, alias CLI `am shell`, événements
> `shell_ai` journalisés. Épique Axe 13 (#93) clôturée.
>
> 🔧 **Maintenance v1.0.6 (2026-08-20)** : installateur Windows corrigé —
> `install.ps1` n'acceptait que l'entrée `am.exe` dans l'archive de release
> (la CI et les archives manuelles utilisent `am-windows-x86_64.exe`) →
> repli systématique sur `cargo install` au lieu du binaire précompilé.
> Le script accepte désormais les deux noms ; archives v1.0.6 publiées avec
> les deux entrées pour la compatibilité maximale. Chemin du message
> cargo install corrigé (`.cargo\bin\am.exe`).
>
> 🚀 **Épique v1.1.0 (2026-08-20)** : **Onboarding, Copilot & Rôles aichat**
> (Axe 14) — `am setup` (wizard provider + token keyring + modèle + ping),
> installation automatique d'aichat (wizard + `am ai` + installateurs),
> 6 rôles copilot générés pour aichat (am-copilot, am-operator, am-dev,
> am-do, am-analyst, am-orchestrator), `am ai --role <nom>`, tip
> d'onboarding dans le banner REPL et les commandes IA (non-bloquant).
>
> 🔧 **Maintenance v1.1.1 (2026-08-20)** : fix `am setup` — le wizard écrivait
> `providers.<nom>` au TOP-LEVEL de la config user (clé rejetée par le
> validateur : « unknown field `providers` »). Le registre vivant sous
> `settings.providers`, le wizard écrit désormais
> `settings.providers.<nom>.base_url` + `.default_model` (le schéma exige
> base_url quand un bloc provider est écrit). Test de régression
> `setup_persists_under_settings_providers`.
>
> 🔧 **Maintenance v1.1.2 (2026-08-20)** :
> - `am setup` : **openrouter** ajouté au choix des providers (base URL,
> token via OPENROUTER_API_KEY, 6 modèles déclarés proposés) ;
> le choix du modèle liste les modèles disponibles du provider.
> - `am ai` sans `--role` utilise **am-copilot par défaut** (régénération
> automatique des rôles si le fichier manque, dégradation douce).
> - Bug `am migrate --import` : la config importée était écrite dans le
> répertoire config GLOBAL (user_config_dir) au lieu du config actif de
> l'app — l'import écrasait la config réelle de la machine (et la suite
> de tests détruisait la config utilisateur à chaque `cargo test`).
> L'import respecte désormais `app.paths.config_dir` (--config/isolated).
>
> 🔧 **Maintenance v1.1.3 (2026-08-21)** : fix `resolve_exec` — pour un
> agent INSTALLÉ avec un binaire enregistré, le premier token de `run:`
> (ex. `picoclaw`) n'était jamais consommé : `am start <agent>` lançait
> `<bin> <token-run>` (picoclaw rejetait son propre nom comme
> sous-commande inconnue ; aichat recevait « aichat » comme prompt
> one-shot). Le token est désormais consommé dans la branche « binaire
> enregistré existant » (les branches non-installé/binaire manquant
> étaient déjà correctes). Test de régression
> `resolve_exec_installed_agent_does_not_leak_run_token`.
>
> 🔧 **Maintenance v1.1.4 (2026-08-21)** : hints de configuration
> post-install — nouveau champ `setup_hints` dans la définition d'un agent
> (config.yaml) : commandes de configuration manuelle affichées après
> l'install quand l'agent gère sa propre config (ex. picoclaw
> onboard/model/auth), avec substitution des placeholders `{model}`,
> `{provider}` et `{base_url}` depuis le provider résolu. picoclaw est le
> premier agent du catalogue à les déclarer.
>
> 🔧 **Maintenance v1.1.5 (2026-08-21)** : fix `am ai` / rôles copilot avec
> aichat ≥ 0.30 — aichat a changé son format d'agents (le markdown
> `agents/<name>.md` ≤ 0.29 est remplacé par une définition
> `functions/agents/<name>/index.yaml` + un registre `functions/agents.txt`).
> `am setup` / `am setup --roles` écrivent désormais LES DEUX formats
> (compatibilité totale) et `am ai` détecte la définition nouvelle génération
> en premier (« Unknown agent `am-copilot` » corrigé). Bonus : le contexte
> par défaut (dossier courant) est filtré par am (`.git`, `target`,
> `node_modules`…, binaires non-UTF-8, `.env*`, > 64 KiB, budget 128 KiB)
> — aichat ne filtre rien et échoue sur `.git/index`. Génération `--exec` :
> `--code` au lieu de `--execute --dry-run` (aichat ≥ 0.30 : `--dry-run`
> n'appelle plus l'API, il écho la requête).
>
> 🔧 **Maintenance v1.1.6 (2026-08-24)** : correctifs de robustesse —
> timeout de 30 s sur les commandes capturées (doctor/runner ne pendent plus
> si un agent ne répond pas, pipes vidés dans des threads pour éviter les
> deadlocks), `is_running` Windows via l'API Win32 (OpenProcess /
> GetExitCodeProcess, plus fiable que tasklist), rejet des chemins unsafe
> (path traversal) dans `am migrate --import`, frames WebSocket RFC 6455
> avec vraies longueurs > 125 octets, boucle de traduction i18n de la page
> web corrigée (plus de boucle infinie), index du trousseau (keyring)
> sérialisé en JSON (clés contenant des virgules).
>
> 🔧 **Maintenance v1.1.7 (2026-09-01)** : Gemini CLI a cessé de servir les
> comptes Google gratuits/Pro/Ultra le 2026-06-18 — remplacé par **Antigravity
> CLI** (`agy`, binaire Go fermé, même harnais qu'Antigravity 2.0). Nouveau
> catalogue : entrée `antigravity-cli` (release GitHub
> google-antigravity/antigravity-cli), `gemini-cli` marqué déprécié
> (`installable: false`, clé API payante seulement), alias `gemini`/`agy`
> redirigés, groupe `mainstream` et gabarit web mis à jour. Import des
> extensions/skills Gemini : `agy plugin import gemini`.
>
> 🔧 **Maintenance v1.1.8 (2026-09-01)** : providers **QwenCloud** ajoutés au
> registre par défaut — `qwen-cloud` (pay-as-you-go, Model Studio/DashScope,
> dashscope-intl…/compatible-mode/v1) et `qwen-cloud-token-plan` (abonnement
> Credits, token-plan.ap-southeast-1…/compatible-mode/v1, modèles restreints
> dont qwen3.8-max). `qwen-code` pointe sur qwen-cloud par défaut (env_map
> OpenAI-compatible OPENAI_API_KEY/BASE_URL/MODEL) avec hints pour basculer
> sur le Token Plan (`--provider qwen-cloud-token-plan`, clé dédiée via
> `am providers set-token`).
>
> 🐛 **Maintenance v1.1.9 (2026-09-01)** : l'assistant `am setup` listait ses
> providers dans une constante codée en dur — les QwenCloud ajoutés au
> registre n'y apparaissaient pas. La liste est maintenant construite depuis
> le registre fusionné (embarqué + config utilisateur), ollama et custom en
> plus, sans doublon. Test de non-régression ajouté. Bonus : le wizard ne
> boucle plus à l'infini sur stdin fermé (erreur claire + suggestion
> `--yes`).
---
## 📖 Sommaire
1. [Résumé exécutif](#1--résumé-exécutif)
2. [Légende de lecture](#2--légende-de-lecture)
3. [Quick wins — valeur immédiate](#3--quick-wins--valeur-immédiate)
4. [État des lieux](#4--état-des-lieux)
5. [Vision & principes](#5--vision--principes)
6. [Socle technique : le modèle de données](#6--socle-technique--le-modèle-de-données)
7. [Les 12 axes](#7--les-12-axes)
8. [Jalons versionnés](#8--jalons-versionnés)
9. [Indicateurs de succès (KPI)](#9--indicateurs-de-succès-kpi)
10. [Risques & garde-fous](#10--risques--garde-fous)
11. [Par où commencer](#11--par-où-commencer)
12. [Bilan & reste à faire (2026-08-23)](#15--bilan--reste-à-faire-analyse-du-2026-08-23)
13. [Idées neuves (post-v1.1.5)](#16--idées-neuves-post-v115)
---
## 1. 📌 Résumé exécutif
**am** est aujourd'hui un excellent *gestionnaire* d'agents : 77 agents au
catalogue, 9 méthodes d'installation, dépendances résolues automatiquement,
processus pilotés, REPL avec passerelle shell, sauvegarde export/import.
Mais il est **aveugle** : il ne retient ni ce qui a été fait, ni quand, ni
par quel agent, ni dans quel projet, ni avec quel résultat. Les logs sont du
texte libre non interrogeable, l'état ne contient que les installations et
le PID courant, l'historique est un simple fichier plat.
Cette roadmap transforme **am** en **cockpit de votre parc d'agents IA** :
| Rôle | Promesse | Porté par |
|---|---|---|
| 📓 Journal de bord | tout est tracé, rien ne se perd | Axe 1 (journal d'événements) |
| 🔎 Rétroviseur | tout est cherchable en 2 secondes | Axes 2, 3, 4 |
| 📊 Tableau de bord | tout est mesuré | Axes 1, 5, 9 |
| 🤖 Copilote | il pilote à votre place | Axes 6, 7 |
**Chiffres clés :** 12 axes · ~55 fonctionnalités · 4 jalons (v0.3.0 → v1.0)
· ~15 semaines de travail cumulé · 0 dépendance runtime ajoutée.
---
## 2. 📚 Légende de lecture
| Symbole | Signification |
|---|---|
| **P0** | Fondations — à démarrer tout de suite (socle des autres axes) |
| **P1** | Court terme — après la phase 0 |
| **P2** | Moyen terme |
| **P3** | Vision — long terme |
| ⭐ | Reprend une demande explicite de l'utilisateur |
| **S** | Effort : moins d'1 jour |
| **M** | Effort : 2 à 4 jours |
| **L** | Effort : 1 à 2 semaines |
| **XL** | Effort : plus de 2 semaines |
| ⬜ / 🔨 / ✅ | Proposé / En cours / Livré (rien n'est commencé aujourd'hui) |
---
## 3. ⚡ Quick wins — valeur immédiate
*Tous en effort S, phase P0, sans dépendance sur le socle. Livrables en
quelques jours, à caler avant ou pendant la construction du journal.*
| Fonctionnalité | Commande | Apport |
|---|---|---|
| Voir les logs d'un agent | am logs claude-code (--follow) | tail des logs déjà écrits par process.rs |
| Filtres sur la liste | am list --running · --sort name,version,status | repérage instantané |
| Éditer la config sans éditeur | am config set key value | moins de friction YAML |
| Alias à la volée | am alias add cc claude-code | sans éditer le fichier |
| Historique propre | dédup + horodatage de history.txt | base saine pour l'axe 2 |
| Doctor scriptable | am doctor --json | CI et monitoring |
| Ouvrir l'installation | am open claude-code | explorer le répertoire de l'agent |
| Version scriptable | am version --json | introspection des scripts |
---
## 4. 🧭 État des lieux (points d'ancrage dans le code)
| Brique actuelle | Fichier | Limite aujourd'hui |
|---|---|---|
| Catalogue 77 agents, alias, groupes | src/catalog.rs, config.yaml | recherche = sous-chaîne stricte, pas de ranking |
| Installation (9 méthodes), dépendances OS | src/installers/, src/deps.rs, src/toolchain.rs | solide — rien à redire |
| État local | src/state.rs (state.json v1) | installations + PID courant uniquement, **aucun historique** |
| Détection externe + cache | src/probe.rs | excellent pattern de cache — à généraliser |
| Processus | src/process.rs | logs non structurés, pas de sessions, pas de métriques |
| Journal applicatif | src/output.rs | texte libre horodaté, non interrogeable |
| REPL + passerelle shell | src/repl.rs (history.txt, session_id()) | historique plat, pas de recherche ni de stats |
| Backup | src/commands/export_import.rs | manuel, pas de synchronisation |
---
## 5. 🎯 Vision & principes directeurs
**Vision :** le cockpit unique du parc d'agents — journal de bord, rétroviseur,
tableau de bord et copilote.
**Principes :**
1. **Zéro dépendance runtime** — tout est Rust pur et fichiers locaux
(JSONL/JSON), jamais de base de données externe.
2. **Local par défaut, opt-in pour le distant** — la télémétrie n'existe que
si l'utilisateur l'active ; tout le reste est 100 % local.
3. **Contrats stables** — les sorties --json sont la base des scripts et des
futurs UI : champs ajoutés, jamais retirés.
4. **Performance** — écriture en append (JSONL), lectures par fenêtres
temporelles, index dérivés régénérables, caches sur le modèle de probe.rs.
5. **Livraison continue** — chaque phase produit un binaire utilisable et
testé ; la barre des 45+ tests monte à chaque jalon.
---
## 6. 🧱 Socle technique : le modèle de données
*Tout dépend de ceci. À construire en premier, avant les commandes visibles.*
state_dir/
state.json # v2 : + sessions_count, last_used (migration auto depuis v1)
events.jsonl # NOUVEAU — journal d'événements (source de vérité)
events-202608.jsonl # rotation mensuelle
sessions.json # NOUVEAU — registre des sessions (index dérivé)
history/
<session>.jsonl # NOUVEAU — historique structuré du REPL
projects.json # NOUVEAU — agrégats par projet (recalculable)
probe-cache.json # existant — pattern de cache à suivre
| Fichier | Rôle | Alimenté par | Reconstruction |
|---|---|---|---|
| events.jsonl | faits bruts (start, stop, run, install…) | process.rs, run_cmd.rs, install_cmd.rs, repl.rs, doctor_cmd.rs | source de vérité, jamais reconstruit |
| sessions.json | index des sessions | dérivé du journal | doctor --fix (rejoue le journal) |
| projects.json | agrégats par projet | dérivé du journal | doctor --fix |
| history/*.jsonl | commandes REPL | repl.rs | non (données primaires) |
| state.json v3 | installations + résumé + annotations (★, notes, tags) | state.rs | partiellement (compteurs depuis le journal) |
**Règles :** JSONL append-only pour les faits · JSON dérivés régénérables ·
migration additive (state v1 reste lisible partout) · doctor --fix répare
tout ce qui peut l'être.
---
## 7. 🗂️ Les 12 axes
### Axe 1 — 📊 Observabilité & statistiques d'utilisation ⭐
🎯 Savoir **quoi** a tourné, **quand**, **combien de temps**, avec **quel
taux de succès** — et **combien ça coûte**.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| Journal d'événements events.jsonl (toutes les actions de am) | M | P0 |
| am stats + --period 7d/30d/90d + --json (tableaux et barres ASCII) | M | P0 |
| am top — classement des agents par utilisation | S | P1 |
| am log — filtres agent/type/date, --follow | S → M | P0 → P1 |
| am report — rapport hebdo/mensuel en markdown (top agents, échecs, changements) | M | P1 |
| Suivi des coûts — tokens/€ par session quand l'agent expose son usage (Claude Code --output-format json, Codex…) ✅ #49 | M | P2 |
| am monitor — TUI temps réel : CPU/mémoire par PID, uptime, alertes ✅ #50 | L | P2 |
| Télémétrie anonyme **opt-in** (compteurs agrégés uniquement, jamais de chemins) | M | P3 |
am stats # vue globale
am stats claude-code --period 30d
am top # qui tourne le plus
am report --last-week # digest markdown
### Axe 2 — 💾 Historique des commandes ⭐
🎯 Gérer, **rechercher** et **réutiliser** tout ce qui a été tapé.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| Historique structuré : history/<session>.jsonl (cmd, kind am/shell, cwd, durée, exit, agent) + migration de history.txt | M | P0 |
| am history — filtres --kind, --cwd, --search, --failed, --session | M | P0 |
| Ctrl-R + !! + !install + !42 + ^old^new dans le REPL | M | P1 |
| am history --rerun 42 (réexécution confirmée) | S | P1 |
| Playbooks : am history 12..25 --save deploy.yaml puis am playbook deploy.yaml ✅ #51 | L | P2 |
am history --search "install" --failed
am history --rerun 42
### Axe 3 — 🧭 Projets & workspaces ⭐
🎯 Centraliser **quel agent travaille sur quel projet** — automatiquement.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| Contexte auto au lancement : racine + branche git, stack détectée (Cargo.toml, package.json…), mis en cache | S | P0 |
| am projects / am projects api — agents, sessions, durées, dernière activité | M | P1 |
| Profils de projet dans config : default_agent, env, hooks | M | P1 |
| am start (sans argument) = agent par défaut du dossier courant ; REPL contextuel | S | P1 |
| am init — génère un agent-manager.yaml selon la stack détectée | S → M | P0 |
| Templates : am init --template web | M | P2 |
am projects
am projects api
am init # dans un projet Node → config pré-remplie
### Axe 4 — 🗂️ Sessions centralisées ⭐
🎯 Un registre unique de **toutes les sessions de tous les agents** —
consultable, reprenable, archivable.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| sessions.json + session_id() partagé (repl.rs) ; fin de session avec exit code et durée | M | P0 |
| Réconciliation au démarrage : sessions interrompues (crash, reboot) marquées et datées | S | P0 |
| am sessions — filtres agent/projet/statut ; show = résumé + extrait de log | M | P0 |
| am timeline — vue chronologique unifiée de toute l'activité | M | P1 |
| am sessions resume <id> — relance avec les mêmes args/env/cwd | M | P1 |
| am sessions export <id> + rétention configurable (settings.sessions_retention_days) | M | P2 |
am sessions --status failed
am sessions show 20260815_143926_a1b2c3
am timeline --project api
### Axe 5 — 🖥️ Tableau de bord
🎯 Voir l'état du parc d'un coup d'œil.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| am dashboard — TUI (ratatui/crossterm) : vue d'ensemble, activité en direct, stats, sessions, projets | L | P1 |
| am web — serveur local + API JSON + page HTML embarquée avec graphiques | XL | P2 |
### Axe 6 — 🤖 Automatisation & orchestration
🎯 Laisser am **superviser et piloter seul** le parc.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| Hooks on_install / on_start / on_stop / on_update (agent, projet, global) — via le runner existant | M | P0 |
| am watch claude-code --restart-on-crash --notify | M | P1 |
| Services : unités systemd / plists launchd / tâches Windows, am service install claude-code --autostart ✅ #55 | L | P2 |
| Planification : am schedule add update --all --at 06:30 + check santé (cron / Task Scheduler) ✅ #56 | M | P2 |
| Orchestration de groupes : ordre, --parallel, attente de santé ✅ #57 | L | P2 |
| Conteneurs : profil docker/podman par agent (isolation à la demande) ✅ #58 | L | P2 |
| am doctor --watch — vérifications périodiques avec alertes ✅ #59 | M | P2 |
### Axe 7 — 🧠 Intelligence & catalogue
🎯 Trouver le bon agent, suivre leurs sorties, et comparer.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| Recherche fuzzy dans am search (typos, scoring, « vouliez-vous dire ») | M | P1 |
| ⬜ am compare a b — tableau côte à côte (méthode, deps, catégorie, activité) — **non livré, sans issue** | S | P1 |
| ⬜ am news — dernières releases des agents installés (API GitHub/Gitea, cache) — **non livré, sans issue** | M | P1 |
| Catalogue distant : am catalog update / am catalog add <url> | M | P2 |
| am suggest "un agent pour du Python" — tags + usage réel | M | P2 |
| am lab — benchmark : même tâche sur N agents, comparaison durée/résultat/coût | L | P2 |
| Registre communautaire : publier son catalogue (Gitea) + am registry | L | P3 |
| am ask "installe claude et lance-le" — langage naturel → commande am (fournisseur LLM configurable, optionnel) | L | P3 |
### Axe 8 — 🔒 Sécurité & gouvernance
🎯 Protéger les secrets, tracer les changements, pouvoir revenir en arrière.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| am secret set OPENAI_KEY --agent claude-code (keyring OS) + injection --env automatique | M | P1 |
| am audit — qui a modifié quoi quand (checksums des configs, événements) | M | P2 |
| am update --rollback — backup automatique avant chaque mise à jour | M | P2 |
| Politiques : pin de version, settings.update_policy | S | P2 |
| Profils sandbox par agent (commandes/répertoires autorisés) | L | P3 |
### Axe 9 — 🌐 Multi-machine & collaboration
🎯 Retrouver son cockpit partout, et le partager.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| Synchronisation git automatique : settings.sync_repo, am sync, push à la fermeture du REPL ✅ #66 | L | P2 |
| Partage de catalogue d'équipe : include par URL | S | P2 |
| am migrate — assistant de transfert machine A → B ✅ #68 | M | P2 |
| am serve --token — API HTTP + WebSocket pour piloter à distance | XL | P3 |
### Axe 10 — 🧩 Confort & personnalisation
🎯 Adapter am à sa façon de travailler.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| Favoris : am favorite / am unfavorite + ⭐ dans am list | S | P1 |
| Notes : am note claude-code "utiliser pour …" | S | P1 |
| Tags personnels : am tag claude-code python | S | P1 |
| ⬜ Raccourcis de commandes : settings.shortcuts (i → install, s → start) — **non livré, sans issue** | S | P1 |
| Profils d'environnement : am profile dev / prod (env + args + agent par profil) | M | P1 |
| Thèmes couleurs du REPL | S | P2 |
### Axe 11 — 🎛️ Modèles locaux
🎯 Étendre le cockpit aux modèles : **ollama, llama.cpp, LM Studio**.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| am models — inventaire : nom, taille disque, quantisation, dernière utilisation | M | P2 |
| Lien agent ↔ modèle : am run mon-agent --model llama3.1 | M | P2 |
| doctor vérifie ollama / llama-server comme n'importe quel outil | S | P2 |
| am models prune — purge des modèles inutilisés | S | P2 |
### Axe 12 — 🛠️ Écosystème & expérience développeur
🎯 Rendre am disponible partout et contribuable.
| Fonctionnalité | Effort | Phase |
|---|---|---|
| Fixtures d'événements rejouables + tests de bout en bout du journal | S | P0 |
| Packaging officiel : winget, scoop, deb/rpm, Homebrew + CI de release | M | P1 |
| Complétions dynamiques (agents installés, groupes personnalisés) | S | P1 |
| Man pages + documentation générée | S | P1 |
| i18n : messages EN/FR | L | P2 |
| Plugin scripts (hooks avancés, intégration CI) | M | P2 |
---
### Axe 13 — ⚡ Shell AI & Action ⭐
🎯 Transformer une commande en langage naturel en une action shell exécutée par un agent léger, rapide et contextuel, sans démarrer un gros coding agent.
**Contexte :** `am` gère aujourd'hui ~77 agents IA, principalement des *coding agents*, des assistants et des outils SaaS. Les shell assistants sont maintenant au catalogue (AIChat, ShellGPT, Fabric, Shell AI, AI CLI — v1.0.4) : légers, rapides, conçus pour transformer une phrase en commande ou action sur le système de fichiers local (ex. *"traite les fichiers JSON du dossier courant pour extraire les clés uniques"*).
---
#### 13.1 Agents shell AI découverts (✅ tous ajoutés au catalogue — v1.0.4, issues #94 #95)
| Outil | Repo | Langage | Force | Maturité |
|---|---|---|---|---|
| ✅ **AIChat** | `sigoden/aichat` | Rust | Shell assistant natif, RAG, agents, fichiers/répertoires, 20+ providers | **10.4k stars**, très actif |
| ✅ **ShellGPT** | `TheR1D/shell_gpt` | Python | Génère/exécute commandes shell, code, docs | Très connu, mature |
| ✅ **Fabric** | `danielmiessler/fabric` | Go | Patterns AI (summarize, extract wisdom), CLI | Très populaire, orienté contenu/texte |
| ✅ **Shell AI** | `nishant9083/shell-ai` | TypeScript | Agent ReAct local via Ollama, MCP, filesystem tools | Plus récent, prometteur mais jeune |
| ✅ **AI CLI** | `kriserickson/ai-cli` | Go | Natural language → commandes shell avec safety policy (`risk` / `certainty`) | Petit, simple, moins connu |
---
#### 13.2 Recommandation : AIChat (`sigoden/aichat`)
**Choix privilégié pour la fonction Shell AI.**
| Avantage | Détails |
|---|---|
| **Léger & rapide** | Rust, binaire unique, cold start rapide, idéal pour RPi 4 |
| **Shell Assistant natif** | Génère et exécute des commandes shell à partir du langage naturel |
| **Multi-provider** | OpenAI, Claude, Gemini, DeepSeek, Groq, Ollama, OpenRouter… |
| **Passage de contexte** | `aichat -f .` injecte le dossier ou les fichiers dans le prompt |
| **Mode exécution** | `aichat -e "..."` exécute directement, mode conversationnel sinon |
| **Facilité d'intégration** | Release binaire GitHub, installable via `binary` dans le catalogue |
Exemples d'usage ciblés :
```bash
# Lister et traiter les fichiers JSON du dossier courant
aichat -f . -e "liste tous les fichiers JSON et extrait les clés uniques"
# Résumer un dossier de fichiers
aichat -f . "résume les données de ces fichiers JSON"
```
---
#### 13.3 Fonctionnalités prévues
| Fonctionnalité | Description | Effort | Phase |
|---|---|---|---|
| ✅ **Catalogue : ajouter AIChat** | Définition `AgentDef` + alias `ai` → `aichat` — livré en v1.0.4 (issues #94 #95) | S | P1 |
| ✅ **Commande `am ai <prompt>`** | Lancer AIChat avec le dossier courant comme contexte — livré en v1.0.5 (issue #96) | S | P3 |
| ✅ **Flag `--exec` / `-e`** | Active le mode exécution directe (`aichat -e` via aichat --dry-run + exécution sécurisée par am) — livré en v1.0.5 (issue #96) | S | P3 |
| ✅ **Flag `--files <path>`** | Passer fichiers/dossiers spécifiques en contexte — livré en v1.0.5 (issue #96) | S | P3 |
| ✅ **Sécurité : `--dry-run` par défaut** | Simuler avant exécution ; classification safe/risky + confirmation — livré en v1.0.5 (issue #97, settings.shell_ai) | M | P3 |
| ✅ **Provider configurable** | Réutiliser le registre `providers.rs` (--provider/--model → env aichat + modèle) — livré en v1.0.5 (issue #96) | M | P3 |
| ✅ **Alias intégrés** | `am shell` comme synonyme CLI de `am ai` — livré en v1.0.5 (issue #96) | S | P3 |
| **Extensions sœurs** | `am summarize`, `am explain`, `am fix` (voir ci-dessous) | M | P3 |
---
#### 13.4 Risques & garde-fous
| Risque | Mitigation |
|---|---|
| Exécution automatique de commandes dangereuses | `--dry-run` par défaut, confirmation obligatoire avant toute commande `risky` |
| Coût API récurrent | Modèle cheap par défaut (`gpt-4.1-mini`, `gemini-flash`) ou Ollama local |
| Fuite de données sensibles | Support du mode local Ollama, pas d'envoi hors du provider configuré |
| Installation lente sur RPi | Utiliser l'installateur `binary` GitHub Releases plutôt que `cargo` |
---
#### 13.5 Idées sœurs (à intégrer ou lier à d'autres axes)
| Commande | Description | Axe lié |
|---|---|---|
| `am summarize <fichier/dossier>` | Résume un fichier ou un dossier via AIChat/Fabric | Axe 13 |
| `am explain <commande>` | Explique une commande shell avant exécution | Axe 13 |
| `am commit` | Génère un message de commit depuis `git diff` | Axe 13 / Axe 3 |
| `am review` | Review rapide d'un diff ou d'une PR | Axe 7 |
| `am translate <fichier> --to en` | Traduit un fichier markdown/doc | Axe 13 |
| `am ask-code "..."` | Pose une question sur le codebase sans lancer un gros agent | Axe 7 |
| `am doc <dossier>` | Génère un README/doc à partir du code | Axe 13 / Axe 7 |
| `am fix` | Corrige une commande shell qui a échoué | Axe 13 |
| `am note` | Extrait des action items d'un texte/réunion | Axe 10 |
| `am search-web "..."` | Recherche web rapide et réponse synthétisée | Axe 7 |
---
## 14. 🚀 Onboarding & Copilot aichat (épique v1.1.0)
> Objectif : réduire le **Time-To-First-Value à 0** — rendre `am` opérationnel
> pour l'IA locale dès la première seconde, et faire d'aichat le copilot de
> agent-manager. Livré en **v1.1.0 (2026-08-20)**.
| Fonctionnalité | Description | Statut |
|---|---|---|
| ✅ **Wizard d'onboarding (`am setup`)** | Provider (anthropic, openai, deepseek, google, ollama, custom), token masqué → trousseau OS (keyring, jamais en clair), modèle par défaut, ping API non-bloquant. Déclenché par `am ai`/`am ask`/banner REPL quand aucun provider n'est configuré (message discret, jamais bloquant), ré-exécutable à la main (mode revoir) | ✅ v1.1.0 |
| ✅ **Installation automatique d'aichat** | Étape du wizard « Installer le moteur IA (aichat) ? [Y/n] » → `am install aichat` (catalogue) ; `am ai` sans aichat propose l'installation ; install.ps1/install.sh enchaînent sur `am setup` si stdin interactif | ✅ v1.1.0 |
| ✅ **Rôles copilot aichat (am-*)** | 6 agents générés dans `~/.config/aichat/agents/` (ou %APPDATA%\\aichat\\agents) : am-copilot (guide & catalogue), am-operator (shell sécurisé), am-dev (code & git), am-do (exécution pure pour --exec), am-analyst (coûts/logs/stats), am-orchestrator (groupes/lab). Prompts bilingues (FR par défaut), privilégient les contrats `--json` | ✅ v1.1.0 |
| ✅ **`am ai --role <nom>`** | Rôle copilot passé à aichat (`--agent`) ; validation du fichier généré ; complétion REPL des rôles am-* ; config aichat créée (provider + modèle) seulement si absente | ✅ v1.1.0 |
| ✅ **Settings dédiés** | `settings.shell_ai` (default_safety dry-run/confirm/auto, risky_patterns) documenté dans config.yaml ; module `src/setup.rs` + `src/roles.rs` | ✅ v1.1.0 |
---
## 15. 🧭 Bilan & reste à faire (analyse du 2026-08-23)
> Analyse complète du dépôt le 2026-08-23 : code (v1.1.5, commit e637c06),
> historique git, tracker Gitea, artefacts de release.
### 15.1 ✅ Ce qui est livré
- **Tout le périmètre versionné** : J0/v0.3.0, J1/v0.4.1, J2/v0.6.0,
v0.7.0 (providers), J3/v1.0.0, épique v1.1.0 (onboarding/copilot) et les
maintenances v1.0.1 → v1.1.5.
- **0 issue ouverte** sur le tracker Gitea (issues #1 → #97 clôturées).
- `main` synchronisé avec `origin/main` ; Cargo.toml/Cargo.lock en
**v1.1.5** ; suite de tests : **455 tests passés, 0 échec** le
2026-08-23 (23 suites, hors `doctor_test` qui hang — §15.4).
- Vérifié présent dans le code : favoris/notes/tags (#39), dashboard,
monitor, web, serve, lab, sync, migrate, models, sandbox, registry,
ask, ai, setup + rôles copilot, self-update, services, schedule, i18n,
packaging, complétions, man pages.
### 15.2 ⬜ Fonctionnalités du roadmap NON livrées (jamais découpées en issues)
| Fonctionnalité | Axe | Effort | Constat dans le code |
|---|---|---|---|
| `am compare a b` — tableau côte à côte | Axe 7 | S | aucune commande `Compare` dans `src/cli.rs` |
| `am news` — dernières releases des agents installés | Axe 7 | M | aucun module, 0 occurrence dans `src/` |
| `settings.shortcuts` — raccourcis REPL (i → install…) | Axe 10 | S | 0 occurrence de `shortcuts` dans `src/` |
| Extensions sœurs Axe 13 (`am summarize`, `am explain`, `am fix`, …) | Axe 13 | M | absentes — voir §13.5 et l'idée N10 (§16) |
➡️ Suggestion : créer 3 issues Gitea (compare, news, shortcuts) en P1 —
petits efforts à forte valeur, seuls restes des jalons « cockpit ».
### 15.3 📦 Activités de release / opérations
| Activité | Détail |
|---|---|
| **Publier la release v1.1.5** | Le commit `e637c06` (fix aichat ≥ 0.30) est sur `main` **sans tag ni release Gitea** → installateurs et `am self-update` servent encore la v1.1.4. Taguer `v1.1.5` pour déclencher `.gitea/workflows/release.yml`. |
| **Compléter les assets v1.1.4** | La release v1.1.4 publiée ne contient **que** `am-windows-x86_64.zip` : binaires Linux (x86_64/aarch64) et macOS absents → les installateurs Linux/macOS retombent sur `cargo install --git`. |
| **Artéfacts `dist/` obsolètes** | Les archives de `dist/` datent de l'ère v0.6.0 (2026-08-19) ; laisser la CI régénérer celles de v1.1.5. |
| **Stash obsolète** | `stash@{0}` « WIP issue #39 : favoris, notes, tags » (2026-08-17 09:12) — la fonctionnalité a été livrée autrement dans v0.4.1 (champs présents dans `src/state.rs`) ; à purger (`git stash drop`) après confirmation. |
### 15.4 🐛 Bug découvert pendant l'analyse (2026-08-23) — à corriger en priorité
**`cargo test` se suspend** sur `doctor_test::report_contains_core_checks`
sur cette machine (reproduit 3 fois, dont une exécution > 20 min), et le
même hang peut frapper l'utilisateur final via `am doctor`.
- **Cause racine** : `SystemRunner::run` (`src/runner.rs`, branche
`capture`) attend `Command::output()` **sans timeout** et sans
protection contre l'héritage des pipes. `am doctor` sonde les outils du
PATH (`ollama ls`, `llama-server --version`, `git --version`…) ; quand
le processus fils engendre un petit-enfant qui conserve les handles
stdout/stderr (cas réel observé : `conhost.exe` alloué pour
`ollama.exe ls` lancé sans console), `output()` attend l'EOF des pipes
**indéfiniment**.
- **Reproduction** : `target\debug\deps\doctor_test-*.exe --nocapture
report_contains_core_checks` → hang > 40 s avec enfants `ollama.exe ls`
+ `conhost.exe` sous le processus de test ; l'ancien binaire de test du
2026-08-21 passait en 2,2 s (déclenchement du conhost non déterministe).
- **Périmètre touché** : tout ce qui passe par `SystemRunner::run` avec
capture — `am doctor` donc, et les sondes d'installation. (`am models`,
`am lab`, les plugins et la sonde externe utilisent déjà `wait_timeout`
et sont immunisés.)
- **Correctif proposé** : aligner `SystemRunner::run` sur le pattern déjà
éprouvé dans `src/models.rs` / `src/lab.rs` / `src/plugins.rs` : spawn
+ `wait_timeout` (30 s par défaut, `settings.probe_timeout_secs`) +
drain des pipes avant l'attente + kill de l'arbre à l'expiration — les
commentaires de `lab.rs` et `plugins.rs` documentent exactement ce
deadlock. À compléter par un test de régression (faux binaire qui
engendre un enfant garde-fou).
- **Contournement immédiat** : lancer les suites une à une, sans
`--test doctor_test`.
---
## 16. 💡 Idées neuves (post-v1.1.5)
> Ajoutées lors de l'analyse du 2026-08-23. Toutes ⬜ (proposées), non
> planifiées. Respectent l'ADN du projet : zéro dépendance runtime, local
> par défaut, contrats `--json` stables.
| # | Idée | Description | Axe | Effort | Phase |
|---|---|---|---|---|---|
| N1 | ⬜ **`am mcp` — serveur MCP** | Exposer am comme serveur *Model Context Protocol* : les agents (Claude Code, Codex, aichat…) découvrent et pilotent le parc via des outils MCP (`am__list`, `am__stats`, `am__sessions`, `am__start`…). am devient le hub de coopération entre agents. | nouveau | L | P3 |
| N2 | ⬜ **Budgets & alertes de coûts** | Budget par agent/projet avec alertes à seuils (80 % / 100 %) et blocage doux, branché sur le suivi des coûts (#49). | Axe 1 | M | P2 |
| N3 | ⬜ **Webhooks de notification** | Alertes `am watch` / `schedule` / `doctor --watch` vers un webhook (Discord, Slack, n8n, Gotify) en plus du `--notify` local. | Axe 6 | S | P2 |
| N4 | ⬜ **`am test <agent>` — smoke test** | Vérification normalisée post-install/post-update : le binaire répond, ping provider, tâche minimale — généralise le ping de `am setup` à tout le catalogue. | Axe 7 | M | P2 |
| N5 | ⬜ **`am diff` — comparaison de configs** | Diff de config/état entre deux machines ou deux points de sync ; complète `am sync` (#66) et `am migrate` (#68) pour le multi-machine. | Axe 9 | S | P2 |
| N6 | ⬜ **Transcripts de session** | `am sessions transcript <id>` : export Markdown lisible et partageable d'une session (commandes + sorties), complément de `sessions export` (#53). | Axe 4 | S | P2 |
| N7 | ⬜ **`am doctor --report`** | Rapport de diagnostic complet anonymisé (versions, doctor, événements récents) prêt à joindre à un bug report. | Axe 12 | S | P2 |
| N8 | ⬜ **Catalogue air-gapped** | `am catalog snapshot` : instantané hors-ligne complet du catalogue distant (définitions + binaires) pour machines sans internet. | Axe 7 | M | P3 |
| N9 | ⬜ **Export OpenTelemetry** | Export opt-in du journal `events.jsonl` vers OTLP/Grafana pour les équipes qui ont déjà une pile d'observabilité. | Axe 1 | M | P3 |
| N10 | ⬜ **Épique « Boîte à outils IA »** | Formaliser les commandes sœurs §13.5 sur les rôles copilot aichat (v1.1.0) : `am commit`, `am review`, `am explain`, `am fix`, `am summarize`, `am doc`, `am translate`, `am ask-code`, `am search-web`, `am note`. Une commande = un rôle + un raccourci de prompt, sécurité `--exec` héritée de `am ai`. | Axe 13 | L | P2 → P3 |
| N11 | ⬜ **Suite de tests 100 % hermétique** | `update_policy_test` (> 60 s/test) appelle réellement l'API GitHub via `installers::latest_version` ; prévoir un mode hors-ligne des sondes de version (flag test/offline ou mock), pour une suite rapide et déterministe partout. | Axe 12 | S | P1 |
---
## 8. 🚀 Jalons versionnés
| Jalon | Version | Contenu principal | Durée | Critère de sortie |
|---|---|---|---|---|
| **J0 — Fondations** | v0.3.0 | events.jsonl, sessions, am stats, am log, am history, am init, quick wins | ≈ 2 sem | 100 % des actions tracées · 100+ tests |
| **J1 — Cockpit** | v0.4.0 | recherche fuzzy, Ctrl-R, projects, timeline, dashboard TUI, hooks, secret, favoris, packaging | ≈ 3 sem | retrouver n'importe quelle action passée en < 2 s |
| **J2 — Automatisation** | v0.5.0 | watch, services, schedule, news/compare, catalogue distant, lab, models, sync | ≈ 4 sem | parc auto-supervisé (crash = redémarrage + alerte) |
| **J3 — Plateforme** | v1.0 | am web, am serve, am ask, registry, télémétrie opt-in, sandbox | ≈ 6 sem | dashboard web complet + API distante |
---
## 9. 📈 Indicateurs de succès (KPI)
| Indicateur | Cible |
|---|---|
| Part des actions tracées dans events.jsonl | 100 % dès la v0.3.0 |
| Temps pour retrouver une commande ou session passée | < 2 s |
| am list à chaud, journal actif | < 100 ms |
| Dépendances runtime ajoutées | 0 |
| Couverture de tests | ≥ 100 tests en v0.3, +25 par jalon |
| Contrats --json cassés entre versions mineures | 0 |
---
## 10. ⚠️ Risques & garde-fous
1. **ADN « zéro runtime »** : toute dépendance nouvelle est compilée dans le
binaire, jamais requise à l'exécution.
2. **Performance** : le journal grossit — fenêtres temporelles, index dérivés,
rotation mensuelle, caches façon probe.rs.
3. **Vie privée** : local par défaut ; télémétrie opt-in, agrégée, anonyme.
4. **Contrats --json** : ajout de champs sans retrait (scripts utilisateurs).
5. **Compatibilité** : migrations additives ; les exports 0.2.x restent
importables en 0.3+.
6. **Complexité UX** : les fonctions avancées restent derrière
settings.experimental jusqu'à maturité.
7. **Périmètre** : rester un orchestrateur — ne pas réimplémenter les
fonctionnalités propres aux agents (tokens, MCP, prompts), sauf valeur
transversale (stats, sessions, secrets, coûts).
---
## 11. 🏁 Par où commencer
*Le suivi est en place sur Gitea : 4 milestones (v0.3.0 → v1.0), 22 labels
(P0–P3, axe-1…axe-12, S/M/L/XL, quick-win, epic) et les issues ci-dessous.
Chaque PR doit référencer son issue avec `closes #N` pour une clôture
automatique. Ordre de construction proposé pour la phase 0 — chaque étape
est un PR indépendant et testé :*
1. **[PR 1](https://git.dracodev.net/Projets/agent-manager/issues/2)** — src/events.rs : journal JSONL + rotation + tests.
2. **[PR 2](https://git.dracodev.net/Projets/agent-manager/issues/3)** — instrumentation start/stop/run (process.rs, run_cmd.rs) — dépend de PR 1.
3. **[PR 3](https://git.dracodev.net/Projets/agent-manager/issues/4)** — state.json v2 + migration additive — dépend de PR 1.
4. **[PR 4](https://git.dracodev.net/Projets/agent-manager/issues/5)** — sessions.json + am sessions + réconciliation — dépend de PR 2.
5. **[PR 5](https://git.dracodev.net/Projets/agent-manager/issues/6)** — am stats + am log (lecture du journal) — dépend de PR 2.
6. **[PR 6](https://git.dracodev.net/Projets/agent-manager/issues/7)** — historique structuré + am history (migration de history.txt).
7. **[PR 7](https://git.dracodev.net/Projets/agent-manager/issues/8)** — am init + détection de contexte (git, stack, cache) — dépend de PR 1.
8. **En parallèle** — les quick wins de la section 3 :
[am logs #9](https://git.dracodev.net/Projets/agent-manager/issues/9) ·
[am list --sort #10](https://git.dracodev.net/Projets/agent-manager/issues/10) ·
[am config set #11](https://git.dracodev.net/Projets/agent-manager/issues/11) ·
[am alias add #12](https://git.dracodev.net/Projets/agent-manager/issues/12) ·
[dedup history.txt #13](https://git.dracodev.net/Projets/agent-manager/issues/13) ·
[am doctor --json #14](https://git.dracodev.net/Projets/agent-manager/issues/14) ·
[am version --json #15](https://git.dracodev.net/Projets/agent-manager/issues/15) ·
[am open #16](https://git.dracodev.net/Projets/agent-manager/issues/16).
Épique de suivi : [issue #1](https://git.dracodev.net/Projets/agent-manager/issues/1) (Phase 0).
### Phase 1 — Cockpit (v0.4.0) — découpage créé le 2026-08-17
Épique : [issue #25](https://git.dracodev.net/Projets/agent-manager/issues/25) · milestone v0.4.0 · 17 issues.
| # | Issue | Effort |
|---|---|---|
| [#26](https://git.dracodev.net/Projets/agent-manager/issues/26) | Recherche fuzzy dans am search | M |
| [#27](https://git.dracodev.net/Projets/agent-manager/issues/27) | Ctrl-R + réexécution dans le REPL | M |
| [#28](https://git.dracodev.net/Projets/agent-manager/issues/28) | am history --rerun N | S |
| [#29](https://git.dracodev.net/Projets/agent-manager/issues/29) | am projects + profils de projet | M |
| [#30](https://git.dracodev.net/Projets/agent-manager/issues/30) | am start contextuel (dépend de #29) | S |
| [#31](https://git.dracodev.net/Projets/agent-manager/issues/31) | am timeline (vue chronologique unifiée) | M |
| [#32](https://git.dracodev.net/Projets/agent-manager/issues/32) | am sessions resume <id> | M |
| [#33](https://git.dracodev.net/Projets/agent-manager/issues/33) | am dashboard (TUI temps réel) | L |
| [#34](https://git.dracodev.net/Projets/agent-manager/issues/34) | Hooks on_install/on_start/on_stop/on_update | M |
| [#35](https://git.dracodev.net/Projets/agent-manager/issues/35) | am watch --restart-on-crash --notify | M |
| [#36](https://git.dracodev.net/Projets/agent-manager/issues/36) | am secret (keyring OS) + injection --env | M |
| [#37](https://git.dracodev.net/Projets/agent-manager/issues/37) | am top + am report (rapport hebdo/mensuel) | M |
| [#38](https://git.dracodev.net/Projets/agent-manager/issues/38) | am log --follow (flux en direct) | S |
| [#39](https://git.dracodev.net/Projets/agent-manager/issues/39) | Favoris, notes et tags personnels | M |
| [#40](https://git.dracodev.net/Projets/agent-manager/issues/40) | Profils d'environnement (am profile dev/prod) | M |
| [#41](https://git.dracodev.net/Projets/agent-manager/issues/41) | Complétions dynamiques + man pages | S |
| [#42](https://git.dracodev.net/Projets/agent-manager/issues/42) | Packaging officiel (winget/scoop/deb/Homebrew) + CI | M |
Critère de sortie du jalon : retrouver n'importe quelle action passée en
moins de 2 secondes.
### Phase 2 — Automatisation (v0.5.0) — découpage créé le 2026-08-17
Épique : [issue #47](https://git.dracodev.net/Projets/agent-manager/issues/47) · milestone v0.5.0 · 27 issues.
| # | Issue | Effort |
|---|---|---|
| [#49](https://git.dracodev.net/Projets/agent-manager/issues/49) | Suivi des coûts — tokens/€ par session (stats --costs, cost_models) ✅ | M |
| [#50](https://git.dracodev.net/Projets/agent-manager/issues/50) | am monitor — TUI temps réel (CPU/mémoire par PID, alertes) ✅ | L |
| [#51](https://git.dracodev.net/Projets/agent-manager/issues/51) | ✅ Playbooks — am history --save + am playbook | L |
| [#52](https://git.dracodev.net/Projets/agent-manager/issues/52) | ✅ Templates — am init --template web/python/rust/cli (substitution + validation) | M |
| [#53](https://git.dracodev.net/Projets/agent-manager/issues/53) | ✅ am sessions export + rétention configurable (sessions_retention_days) | M |
| [#54](https://git.dracodev.net/Projets/agent-manager/issues/54) | ✅ am web — serveur local + API JSON + graphiques (dashboard embarqué, contrats --json, 127.0.0.1) | XL |
| [#55](https://git.dracodev.net/Projets/agent-manager/issues/55) | Services système — am service install (systemd/launchd/tâches Windows) ✅ | L |
| [#56](https://git.dracodev.net/Projets/agent-manager/issues/56) | Planification — am schedule (add --at / list / remove / run) ✅ | M |
| [#57](https://git.dracodev.net/Projets/agent-manager/issues/57) | Orchestration de groupes (ordre, --parallel, attente de santé) ✅ | L |
| [#58](https://git.dracodev.net/Projets/agent-manager/issues/58) | Conteneurs — profils docker/podman par agent ✅ | L |
| [#59](https://git.dracodev.net/Projets/agent-manager/issues/59) | am doctor --watch — vérifications périodiques avec alertes ✅ | M |
| [#60](https://git.dracodev.net/Projets/agent-manager/issues/60) | ✅ Catalogue distant — am catalog update / am catalog add <url> | M |
| [#61](https://git.dracodev.net/Projets/agent-manager/issues/61) | ✅ am suggest — « un agent pour du Python » (tags + usage réel) | M |
| [#62](https://git.dracodev.net/Projets/agent-manager/issues/62) | ✅ am lab — benchmark : même tâche sur N agents | L |
| [#63](https://git.dracodev.net/Projets/agent-manager/issues/63) | ✅ am audit — qui a modifié quoi quand | M |
| [#64](https://git.dracodev.net/Projets/agent-manager/issues/64) | ✅ am update --rollback — backup automatique avant mise à jour | M |
| [#65](https://git.dracodev.net/Projets/agent-manager/issues/65) | ✅ Politiques — pin de version, settings.update_policy | S |
| [#66](https://git.dracodev.net/Projets/agent-manager/issues/66) | ✅ Synchronisation git automatique — am sync (sync_repo, sync_on_exit, secrets exclus) | L |
| [#67](https://git.dracodev.net/Projets/agent-manager/issues/67) | ✅ Partage de catalogue d'équipe (include par URL) | S |
| [#68](https://git.dracodev.net/Projets/agent-manager/issues/68) | ✅ am migrate — assistant de transfert machine A → B (bundle .amx + doctor) | M |
| [#69](https://git.dracodev.net/Projets/agent-manager/issues/69) | ✅ Thèmes couleurs du REPL | S |
| [#70](https://git.dracodev.net/Projets/agent-manager/issues/70) | ✅ am models — inventaire des modèles locaux (ollama, llama.cpp, LM Studio) | M |
| [#71](https://git.dracodev.net/Projets/agent-manager/issues/71) | ✅ Lien agent ↔ modèle — am run --model | M |
| [#72](https://git.dracodev.net/Projets/agent-manager/issues/72) | ✅ doctor vérifie ollama / llama-server comme n'importe quel outil | S |
| [#73](https://git.dracodev.net/Projets/agent-manager/issues/73) | ✅ am models prune — purge des modèles inutilisés | S |
| [#74](https://git.dracodev.net/Projets/agent-manager/issues/74) | ✅ i18n — messages EN/FR (--lang, AM_LANG/LANG, catalogue tr/tr_fmt) | L |
| [#75](https://git.dracodev.net/Projets/agent-manager/issues/75) | ✅ Plugin scripts (hooks avancés, intégration CI) | M |
Critère de sortie du jalon : parc auto-supervisé (crash = redémarrage +
alerte).
### Phase 3 — Plateforme (v1.0) — découpage créé le 2026-08-17
Épique : [issue #48](https://git.dracodev.net/Projets/agent-manager/issues/48) · milestone v1.0 · 5 issues.
| # | Issue | Effort |
|---|---|---|
| [#76](https://git.dracodev.net/Projets/agent-manager/issues/76) | ✅ Télémétrie anonyme opt-in (compteurs agrégés uniquement) | M |
| [#77](https://git.dracodev.net/Projets/agent-manager/issues/77) | ✅ Registre communautaire — am registry (publication + recherche sur Gitea) | L |
| [#78](https://git.dracodev.net/Projets/agent-manager/issues/78) | ✅ am ask — langage naturel → commande am (fournisseur LLM optionnel) | L |
| [#79](https://git.dracodev.net/Projets/agent-manager/issues/79) | ✅ Profils sandbox par agent (commandes/répertoires autorisés) | L |
| [#80](https://git.dracodev.net/Projets/agent-manager/issues/80) | ✅ am serve --token — API HTTP + WebSocket pour piloter à distance | XL |
Critère de sortie du jalon : dashboard web complet + API distante.
### Phase v0.7.0 — Providers & configuration automatisée (P0, PRIORITAIRE)
Épique : [issue #87](https://git.dracodev.net/Projets/agent-manager/issues/87)
· milestone v0.7.0 · 5 issues · **priorité P0 : livrée AVANT la Phase 3
(v1.0, #76–#80 en P3), sauf dépendances**.
Centralise tokens/providers/modèles dans UN registre (settings.providers +
keyring partagé) et configure automatiquement les agents à l'installation :
`am install <agent>` branche le provider/modèle par défaut,
`--provider/--model` pour surcharger, `--no-config` pour le comportement
actuel, `am run --provider` pour surcharger au lancement (cloud inclus).
S'appuie sur #36 (secrets), #40 (profils), #71 (modèle), #66 (sync) — livrés.
| # | Issue | Effort | Dépend de |
|---|---|---|---|
| [#88](https://git.dracodev.net/Projets/agent-manager/issues/88) | ✅ Registre de providers + commandes `am providers` (settings.providers, default_provider) | M | — |
| [#89](https://git.dracodev.net/Projets/agent-manager/issues/89) | ✅ Secrets partagés par provider (namespace keyring + résolution `@secret` fallback) | S | #88 |
| [#90](https://git.dracodev.net/Projets/agent-manager/issues/90) | ✅ AgentDef provider/model + flags `--provider/--model/--no-config` à l'install | M | #88 |
| [#91](https://git.dracodev.net/Projets/agent-manager/issues/91) | ✅ Configuration post-install : bloc `config:` par agent (env_map + fichiers) | L | #89, #90 |
| [#92](https://git.dracodev.net/Projets/agent-manager/issues/92) | ✅ `am run/start --provider` : override au lancement (providers cloud inclus) | M | #90 |
Critère de sortie du jalon : un agent installé est opérationnel sans
configuration manuelle (tokens au keyring, provider/modèle par défaut).
---
*Document généré à partir de l'analyse du code (v0.2.7, commit d886de3).
Phases livrées : 0 (v0.3.0), 1 (v0.4.1), 2 (v0.6.0), v0.7.0 (providers,
2026-08-19), 3 (v1.0.0, #76–#80, 2026-08-20) ; maintenance v1.0.1/v1.0.2
(self-update décompression, REPL), v1.0.3 (détection externe), v1.0.4
(catalogue shell AI, #94 #95), v1.0.5 (commande am ai, #93 #96 #97),
v1.0.6 (installateur Windows accepte l'entrée am-windows-x86_64.exe),
> v1.1.0 (onboarding/copilot) → v1.1.5 (aichat ≥ 0.30). Bilan & idées
> neuves ajoutés le 2026-08-23 (§15, §16).*
+32
View File
@@ -0,0 +1,32 @@
//! Record build metadata (git commit and branch) at compile time so the
//! 'am version' command can display it, like Nushell's version table.
//!
//! When git is unavailable (e.g. building from a source tarball) the values
//! are simply empty.
use std::process::Command;
fn git(args: &[&str]) -> String {
Command::new("git")
.args(args)
.output()
.ok()
.filter(|o| o.status.success())
.map(|o| String::from_utf8_lossy(&o.stdout).trim().to_string())
.unwrap_or_default()
}
fn main() {
println!("cargo:rerun-if-changed=.git/HEAD");
println!("cargo:rerun-if-changed=.git/refs/heads");
let commit = git(&["rev-parse", "HEAD"]);
let branch = git(&["rev-parse", "--abbrev-ref", "HEAD"]);
// A detached HEAD reports the literal branch name "HEAD".
let branch = if branch == "HEAD" {
String::new()
} else {
branch
};
println!("cargo:rustc-env=AM_GIT_COMMIT={commit}");
println!("cargo:rustc-env=AM_GIT_BRANCH={branch}");
}
+991 -347
View File
File diff suppressed because it is too large Load Diff
+713 -126
View File
File diff suppressed because it is too large Load Diff
+1274 -545
View File
File diff suppressed because it is too large Load Diff
+678 -96
View File
@@ -20,6 +20,7 @@ set edit:completion:arg-completer[am] = {|@words|
&'am'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -33,31 +34,445 @@ set edit:completion:arg-completer[am] = {|@words|
cand --help 'Print help (see more with ''--help'')'
cand -V 'Print version'
cand --version 'Print version'
cand list 'List agents: installed ones, or every agent known to the catalog'
cand list 'List installed agents (default); use --all for the whole catalog'
cand logs 'Tail the log file of an agent (--follow for a live view)'
cand open 'Open an agent''s installation directory in the file manager'
cand watch 'Supervise an agent and optionally restart it on crash'
cand dashboard 'Live TUI dashboard: overview, activity, stats, sessions, projects'
cand favorite 'Mark an agent as a favorite (star in list and status)'
cand unfavorite 'Remove the favorite star from an agent'
cand note 'Attach a free-form note to an agent (shown in ''am info''); ''am note <agent>'' without text prints the current note'
cand tag 'Add a personal tag to an agent'
cand untag 'Remove a personal tag from an agent'
cand tags 'List personal tags (with counts), optionally for one agent'
cand profile 'Manage environment profiles (dev, prod, ...)'
cand man 'Generate a man page for am (or for one command)'
cand _agents 'Internal: list agent names for shell completions (hidden)'
cand alias 'Manage command aliases (cc -> claude-code)'
cand secret 'Manage secrets in the OS keyring (never in plaintext config)'
cand start 'Start an agent (foreground by default, or detached with --background)'
cand stop 'Stop a background agent (SIGTERM, then SIGKILL after the timeout)'
cand restart 'Restart an agent: stop, then start with the same options'
cand status 'Show the state of one agent, or of every installed agent'
cand sessions 'List the sessions of every agent (and of the interactive shell)'
cand stats 'Show usage statistics computed from the event journal'
cand top 'Show the most used agents (top 10)'
cand report 'Write a markdown activity report'
cand projects 'Show which agent works on which project'
cand timeline 'One chronological view of every activity (journal + REPL history)'
cand log 'Read the event journal: everything am did'
cand install 'Install an agent and its dependencies'
cand uninstall 'Uninstall an agent and clean its files'
cand uninstall 'Uninstall an agent (managed or external) and clean its files'
cand update 'Update an installed agent to the latest available version'
cand search 'Search the catalog by keyword (name, description, category, tags)'
cand history 'Search the command history (am and shell commands)'
cand info 'Show detailed information about one agent'
cand init 'Generate a local agent-manager.yaml for the current directory'
cand help 'Display help: the overview, a command, the command list, or a search'
cand version 'Display version and build information'
cand config 'Manage the configuration file'
cand doctor 'Check the environment: tools, config validity, paths, permissions'
cand run 'Run the agent command directly with the given arguments (no process management)'
cand completion 'Generate a shell completion script'
cand self-update 'Update agent-manager itself from GitHub Releases'
cand self-uninstall 'Remove agent-manager and everything it created from this machine'
cand export 'Export the configuration and installation state (backup)'
cand import 'Import a previously exported configuration and state'
cand help 'Print this message or the help of the given subcommand(s)'
}
&'am;list'= {
cand --category 'Only show agents of this category'
cand --sort 'Sort by name, version or status (default: name)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --installed-only 'Only show agents that are installed (managed or external)'
cand --all 'Include hidden agents as well'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --all 'Show every agent known to the catalog, not only the installed ones'
cand --running 'Only show running agents'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;logs'= {
cand --lines 'Number of lines to show (default: 20)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --follow 'Follow the log as it grows'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;open'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;watch'= {
cand --interval 'Check interval in seconds (default: 5)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --restart 'Restart the agent automatically when it dies (with backoff)'
cand --notify 'Desktop notification on every restart'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;dashboard'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;favorite'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;unfavorite'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;note'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;tag'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;untag'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;tags'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;profile'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
cand list 'List every defined profile'
cand show 'Show one profile in detail (agent, env, args)'
}
&'am;profile;list'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;profile;show'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;man'= {
cand --output 'Write the page(s) to this directory instead of stdout'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;_agents'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --installed 'Only installed agents (managed + external), aliases and groups'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;alias'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
cand add 'Add an alias (am alias add cc claude-code)'
cand remove 'Remove an alias'
cand list 'List every alias'
}
&'am;alias;add'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;alias;remove'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;alias;list'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;secret'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
cand set 'Store a secret for an agent'
cand unset 'Remove a secret'
cand list 'List stored secret names (values are never shown)'
}
&'am;secret;set'= {
cand --agent 'Agent it belongs to'
cand --value 'Secret value (prefer --value over shell history; never logged)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;secret;unset'= {
cand --agent 'Agent it belongs to'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;secret;list'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -73,8 +488,10 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;start'= {
cand --args 'Extra arguments passed to the agent (repeatable; quoted strings are split on spaces)'
cand --env 'Set an environment variable for the agent (repeatable): --env KEY=VALUE'
cand --profile 'Apply an environment profile (env + args, defined in the config)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -b 'Run detached in the background; output goes to the agent log file'
cand --background 'Run detached in the background; output goes to the agent log file'
cand -f 'Run in the foreground, attached to this terminal (the default)'
@@ -96,6 +513,7 @@ set edit:completion:arg-completer[am] = {|@words|
cand --timeout 'Grace period in seconds before killing (default: from config, 5s)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --force 'Kill immediately instead of terminating gracefully'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
@@ -112,9 +530,11 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;restart'= {
cand --args 'Extra arguments passed to the agent (repeatable; quoted strings are split on spaces)'
cand --env 'Set an environment variable for the agent (repeatable): --env KEY=VALUE'
cand --profile 'Apply an environment profile (env + args, defined in the config)'
cand --timeout 'Grace period in seconds before killing (default: from config, 5s)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -b 'Run detached in the background; output goes to the agent log file'
cand --background 'Run detached in the background; output goes to the agent log file'
cand -f 'Run in the foreground, attached to this terminal (the default)'
@@ -136,6 +556,135 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;status'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;sessions'= {
cand --project 'Only sessions of this project'
cand --status 'Only sessions with this status (running, stopped, failed, interrupted)'
cand --show 'Show one session in detail (summary + log excerpt)'
cand --resume 'Resume a finished session: relaunch the agent with its recorded arguments'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;stats'= {
cand --period 'Only events of the last period (7d, 30d, 90d, all)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;top'= {
cand --period 'Only events of the last period (7d, 30d, 90d, all)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;report'= {
cand --output 'Output file (default: report-YYYYMMDD.md in the state directory)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --last-week 'Cover the last 7 days'
cand --last-month 'Cover the last 30 days'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;projects'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;timeline'= {
cand --project 'Only activity of this project'
cand --since 'Only activity at or after this date (YYYY-MM-DD or RFC 3339)'
cand --limit 'Maximum number of entries (default: 50)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;log'= {
cand --kind 'Only these event kinds (comma separated: start,stop,run,install,...)'
cand --since 'Only events at or after this date (YYYY-MM-DD or RFC 3339)'
cand --limit 'Maximum number of events (default: 50)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --follow 'Follow the journal as new events arrive'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -152,6 +701,7 @@ set edit:completion:arg-completer[am] = {|@words|
cand --method 'Select the install method (index, or type: npm, pip, uv, cargo, go, bun, curl, binary, git)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --force 'Reinstall even if already installed'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
@@ -168,6 +718,7 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;uninstall'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --purge 'Also remove logs and the agent entry from the user config file'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
@@ -184,6 +735,7 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;update'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --all 'Update every installed managed agent'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
@@ -199,8 +751,33 @@ set edit:completion:arg-completer[am] = {|@words|
}
&'am;search'= {
cand --category 'Restrict to this category'
cand --tag 'Only agents carrying this personal tag'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;history'= {
cand --kind 'Only commands of this kind (am or shell)'
cand --cwd 'Only commands run in this directory'
cand --search 'Full-text search in the command line'
cand --session 'Only commands of this session'
cand --limit 'Maximum number of entries (default: 100)'
cand --rerun 'Re-run the Nth most recent entry (with confirmation)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --failed 'Only failed commands'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -216,6 +793,57 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;info'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;init'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --force 'Overwrite an existing agent-manager.yaml'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;help'= {
cand --find 'Search through all help commands table'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;version'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -231,6 +859,7 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;config'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -247,11 +876,12 @@ set edit:completion:arg-completer[am] = {|@words|
cand edit 'Open the user configuration file in your editor'
cand validate 'Validate the configuration file(s)'
cand add 'Add another agent definition file to the user configuration'
cand help 'Print this message or the help of the given subcommand(s)'
cand set 'Set one configuration key without an editor (config set settings.default_shell pwsh)'
}
&'am;config;show'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -267,6 +897,7 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;config;path'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -282,6 +913,7 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;config;edit'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -297,6 +929,7 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;config;validate'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -312,6 +945,7 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;config;add'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -324,29 +958,26 @@ set edit:completion:arg-completer[am] = {|@words|
cand -h 'Print help'
cand --help 'Print help'
}
&'am;config;help'= {
cand show 'Print the effective (merged) configuration as YAML'
cand path 'Print the location of the configuration file(s)'
cand edit 'Open the user configuration file in your editor'
cand validate 'Validate the configuration file(s)'
cand add 'Add another agent definition file to the user configuration'
cand help 'Print this message or the help of the given subcommand(s)'
}
&'am;config;help;show'= {
}
&'am;config;help;path'= {
}
&'am;config;help;edit'= {
}
&'am;config;help;validate'= {
}
&'am;config;help;add'= {
}
&'am;config;help;help'= {
&'am;config;set'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help'
cand --help 'Print help'
}
&'am;doctor'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --fix 'Attempt to repair problems (create directories, fix the state file)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
@@ -363,6 +994,7 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;run'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -378,6 +1010,8 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;completion'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --installed 'Add dynamic completion of the installed agents, aliases and groups (queried from ''am _agents'' at Tab time)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -394,6 +1028,7 @@ set edit:completion:arg-completer[am] = {|@words|
cand --to 'Download the new binary to this path instead of replacing the current one'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand --check 'Only check whether a newer version exists'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
@@ -407,10 +1042,27 @@ set edit:completion:arg-completer[am] = {|@words|
cand -h 'Print help'
cand --help 'Print help'
}
&'am;self-uninstall'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
cand --quiet 'Quiet mode: only errors are printed'
cand -y 'Answer yes to every confirmation prompt'
cand --yes 'Answer yes to every confirmation prompt'
cand --dry-run 'Simulate the action without changing anything'
cand --json 'Emit machine-readable JSON on stdout (for scripts)'
cand --no-color 'Disable ANSI colors'
cand -h 'Print help (see more with ''--help'')'
cand --help 'Print help (see more with ''--help'')'
}
&'am;export'= {
cand --output 'Output file (default: am-export.json)'
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -426,6 +1078,7 @@ set edit:completion:arg-completer[am] = {|@words|
&'am;import'= {
cand -c 'Use an alternate configuration file'
cand --config 'Use an alternate configuration file'
cand --theme 'Color theme for the output (see ''am help theme'' for the list)'
cand -v 'Verbose output: show every command executed and its details'
cand --verbose 'Verbose output: show every command executed and its details'
cand -q 'Quiet mode: only errors are printed'
@@ -438,77 +1091,6 @@ set edit:completion:arg-completer[am] = {|@words|
cand -h 'Print help'
cand --help 'Print help'
}
&'am;help'= {
cand list 'List agents: installed ones, or every agent known to the catalog'
cand start 'Start an agent (foreground by default, or detached with --background)'
cand stop 'Stop a background agent (SIGTERM, then SIGKILL after the timeout)'
cand restart 'Restart an agent: stop, then start with the same options'
cand status 'Show the state of one agent, or of every installed agent'
cand install 'Install an agent and its dependencies'
cand uninstall 'Uninstall an agent and clean its files'
cand update 'Update an installed agent to the latest available version'
cand search 'Search the catalog by keyword (name, description, category, tags)'
cand info 'Show detailed information about one agent'
cand config 'Manage the configuration file'
cand doctor 'Check the environment: tools, config validity, paths, permissions'
cand run 'Run the agent command directly with the given arguments (no process management)'
cand completion 'Generate a shell completion script'
cand self-update 'Update agent-manager itself from GitHub Releases'
cand export 'Export the configuration and installation state (backup)'
cand import 'Import a previously exported configuration and state'
cand help 'Print this message or the help of the given subcommand(s)'
}
&'am;help;list'= {
}
&'am;help;start'= {
}
&'am;help;stop'= {
}
&'am;help;restart'= {
}
&'am;help;status'= {
}
&'am;help;install'= {
}
&'am;help;uninstall'= {
}
&'am;help;update'= {
}
&'am;help;search'= {
}
&'am;help;info'= {
}
&'am;help;config'= {
cand show 'Print the effective (merged) configuration as YAML'
cand path 'Print the location of the configuration file(s)'
cand edit 'Open the user configuration file in your editor'
cand validate 'Validate the configuration file(s)'
cand add 'Add another agent definition file to the user configuration'
}
&'am;help;config;show'= {
}
&'am;help;config;path'= {
}
&'am;help;config;edit'= {
}
&'am;help;config;validate'= {
}
&'am;help;config;add'= {
}
&'am;help;doctor'= {
}
&'am;help;run'= {
}
&'am;help;completion'= {
}
&'am;help;self-update'= {
}
&'am;help;export'= {
}
&'am;help;import'= {
}
&'am;help;help'= {
}
]
$completions[$command]
}
+441 -49
View File
@@ -1,6 +1,6 @@
# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.
function __fish_am_global_optspecs
string join \n c/config= v/verbose q/quiet y/yes dry-run json no-color h/help V/version
string join \n c/config= v/verbose q/quiet y/yes dry-run json no-color theme= h/help V/version
end
function __fish_am_needs_command
@@ -25,6 +25,7 @@ function __fish_am_using_subcommand
end
complete -c am -n "__fish_am_needs_command" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_needs_command" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_needs_command" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_needs_command" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_needs_command" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -33,28 +34,56 @@ complete -c am -n "__fish_am_needs_command" -l json -d 'Emit machine-readable JS
complete -c am -n "__fish_am_needs_command" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_needs_command" -s h -l help -d 'Print help (see more with \'--help\')'
complete -c am -n "__fish_am_needs_command" -s V -l version -d 'Print version'
complete -c am -n "__fish_am_needs_command" -f -a "list" -d 'List agents: installed ones, or every agent known to the catalog'
complete -c am -n "__fish_am_needs_command" -f -a "list" -d 'List installed agents (default); use --all for the whole catalog'
complete -c am -n "__fish_am_needs_command" -f -a "logs" -d 'Tail the log file of an agent (--follow for a live view)'
complete -c am -n "__fish_am_needs_command" -f -a "open" -d 'Open an agent\'s installation directory in the file manager'
complete -c am -n "__fish_am_needs_command" -f -a "watch" -d 'Supervise an agent and optionally restart it on crash'
complete -c am -n "__fish_am_needs_command" -f -a "dashboard" -d 'Live TUI dashboard: overview, activity, stats, sessions, projects'
complete -c am -n "__fish_am_needs_command" -f -a "favorite" -d 'Mark an agent as a favorite (star in list and status)'
complete -c am -n "__fish_am_needs_command" -f -a "unfavorite" -d 'Remove the favorite star from an agent'
complete -c am -n "__fish_am_needs_command" -f -a "note" -d 'Attach a free-form note to an agent (shown in \'am info\'); \'am note <agent>\' without text prints the current note'
complete -c am -n "__fish_am_needs_command" -f -a "tag" -d 'Add a personal tag to an agent'
complete -c am -n "__fish_am_needs_command" -f -a "untag" -d 'Remove a personal tag from an agent'
complete -c am -n "__fish_am_needs_command" -f -a "tags" -d 'List personal tags (with counts), optionally for one agent'
complete -c am -n "__fish_am_needs_command" -f -a "profile" -d 'Manage environment profiles (dev, prod, ...)'
complete -c am -n "__fish_am_needs_command" -f -a "man" -d 'Generate a man page for am (or for one command)'
complete -c am -n "__fish_am_needs_command" -f -a "_agents" -d 'Internal: list agent names for shell completions (hidden)'
complete -c am -n "__fish_am_needs_command" -f -a "alias" -d 'Manage command aliases (cc -> claude-code)'
complete -c am -n "__fish_am_needs_command" -f -a "secret" -d 'Manage secrets in the OS keyring (never in plaintext config)'
complete -c am -n "__fish_am_needs_command" -f -a "start" -d 'Start an agent (foreground by default, or detached with --background)'
complete -c am -n "__fish_am_needs_command" -f -a "stop" -d 'Stop a background agent (SIGTERM, then SIGKILL after the timeout)'
complete -c am -n "__fish_am_needs_command" -f -a "restart" -d 'Restart an agent: stop, then start with the same options'
complete -c am -n "__fish_am_needs_command" -f -a "status" -d 'Show the state of one agent, or of every installed agent'
complete -c am -n "__fish_am_needs_command" -f -a "sessions" -d 'List the sessions of every agent (and of the interactive shell)'
complete -c am -n "__fish_am_needs_command" -f -a "stats" -d 'Show usage statistics computed from the event journal'
complete -c am -n "__fish_am_needs_command" -f -a "top" -d 'Show the most used agents (top 10)'
complete -c am -n "__fish_am_needs_command" -f -a "report" -d 'Write a markdown activity report'
complete -c am -n "__fish_am_needs_command" -f -a "projects" -d 'Show which agent works on which project'
complete -c am -n "__fish_am_needs_command" -f -a "timeline" -d 'One chronological view of every activity (journal + REPL history)'
complete -c am -n "__fish_am_needs_command" -f -a "log" -d 'Read the event journal: everything am did'
complete -c am -n "__fish_am_needs_command" -f -a "install" -d 'Install an agent and its dependencies'
complete -c am -n "__fish_am_needs_command" -f -a "uninstall" -d 'Uninstall an agent and clean its files'
complete -c am -n "__fish_am_needs_command" -f -a "uninstall" -d 'Uninstall an agent (managed or external) and clean its files'
complete -c am -n "__fish_am_needs_command" -f -a "update" -d 'Update an installed agent to the latest available version'
complete -c am -n "__fish_am_needs_command" -f -a "search" -d 'Search the catalog by keyword (name, description, category, tags)'
complete -c am -n "__fish_am_needs_command" -f -a "history" -d 'Search the command history (am and shell commands)'
complete -c am -n "__fish_am_needs_command" -f -a "info" -d 'Show detailed information about one agent'
complete -c am -n "__fish_am_needs_command" -f -a "init" -d 'Generate a local agent-manager.yaml for the current directory'
complete -c am -n "__fish_am_needs_command" -f -a "help" -d 'Display help: the overview, a command, the command list, or a search'
complete -c am -n "__fish_am_needs_command" -f -a "version" -d 'Display version and build information'
complete -c am -n "__fish_am_needs_command" -f -a "config" -d 'Manage the configuration file'
complete -c am -n "__fish_am_needs_command" -f -a "doctor" -d 'Check the environment: tools, config validity, paths, permissions'
complete -c am -n "__fish_am_needs_command" -f -a "run" -d 'Run the agent command directly with the given arguments (no process management)'
complete -c am -n "__fish_am_needs_command" -f -a "completion" -d 'Generate a shell completion script'
complete -c am -n "__fish_am_needs_command" -f -a "self-update" -d 'Update agent-manager itself from GitHub Releases'
complete -c am -n "__fish_am_needs_command" -f -a "self-uninstall" -d 'Remove agent-manager and everything it created from this machine'
complete -c am -n "__fish_am_needs_command" -f -a "export" -d 'Export the configuration and installation state (backup)'
complete -c am -n "__fish_am_needs_command" -f -a "import" -d 'Import a previously exported configuration and state'
complete -c am -n "__fish_am_needs_command" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
complete -c am -n "__fish_am_using_subcommand list" -l category -d 'Only show agents of this category' -r
complete -c am -n "__fish_am_using_subcommand list" -l sort -d 'Sort by name, version or status (default: name)' -r
complete -c am -n "__fish_am_using_subcommand list" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand list" -l installed-only -d 'Only show agents that are installed (managed or external)'
complete -c am -n "__fish_am_using_subcommand list" -l all -d 'Include hidden agents as well'
complete -c am -n "__fish_am_using_subcommand list" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand list" -l all -d 'Show every agent known to the catalog, not only the installed ones'
complete -c am -n "__fish_am_using_subcommand list" -l running -d 'Only show running agents'
complete -c am -n "__fish_am_using_subcommand list" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand list" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand list" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -62,9 +91,236 @@ complete -c am -n "__fish_am_using_subcommand list" -l dry-run -d 'Simulate the
complete -c am -n "__fish_am_using_subcommand list" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand list" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand list" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand logs" -l lines -d 'Number of lines to show (default: 20)' -r
complete -c am -n "__fish_am_using_subcommand logs" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand logs" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand logs" -l follow -d 'Follow the log as it grows'
complete -c am -n "__fish_am_using_subcommand logs" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand logs" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand logs" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand logs" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand logs" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand logs" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand logs" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand open" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand open" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand open" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand open" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand open" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand open" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand open" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand open" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand open" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand watch" -l interval -d 'Check interval in seconds (default: 5)' -r
complete -c am -n "__fish_am_using_subcommand watch" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand watch" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand watch" -l restart -d 'Restart the agent automatically when it dies (with backoff)'
complete -c am -n "__fish_am_using_subcommand watch" -l notify -d 'Desktop notification on every restart'
complete -c am -n "__fish_am_using_subcommand watch" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand watch" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand watch" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand watch" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand watch" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand watch" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand watch" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand dashboard" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand dashboard" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand dashboard" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand dashboard" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand dashboard" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand dashboard" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand dashboard" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand dashboard" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand dashboard" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand favorite" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand favorite" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand favorite" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand favorite" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand favorite" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand favorite" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand favorite" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand favorite" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand favorite" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand unfavorite" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand unfavorite" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand unfavorite" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand unfavorite" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand unfavorite" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand unfavorite" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand unfavorite" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand unfavorite" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand unfavorite" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand note" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand note" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand note" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand note" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand note" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand note" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand note" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand note" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand note" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand tag" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand tag" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand tag" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand tag" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand tag" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand tag" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand tag" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand tag" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand tag" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand untag" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand untag" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand untag" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand untag" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand untag" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand untag" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand untag" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand untag" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand untag" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand tags" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand tags" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand tags" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand tags" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand tags" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand tags" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand tags" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand tags" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand tags" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -f -a "list" -d 'List every defined profile'
complete -c am -n "__fish_am_using_subcommand profile; and not __fish_seen_subcommand_from list show" -f -a "show" -d 'Show one profile in detail (agent, env, args)'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from list" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from list" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from list" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from list" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from list" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from list" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from list" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from list" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from show" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from show" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from show" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from show" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from show" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from show" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from show" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from show" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand profile; and __fish_seen_subcommand_from show" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand man" -l output -d 'Write the page(s) to this directory instead of stdout' -r -F
complete -c am -n "__fish_am_using_subcommand man" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand man" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand man" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand man" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand man" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand man" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand man" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand man" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand man" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand _agents" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand _agents" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand _agents" -l installed -d 'Only installed agents (managed + external), aliases and groups'
complete -c am -n "__fish_am_using_subcommand _agents" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand _agents" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand _agents" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand _agents" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand _agents" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand _agents" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand _agents" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -f -a "add" -d 'Add an alias (am alias add cc claude-code)'
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -f -a "remove" -d 'Remove an alias'
complete -c am -n "__fish_am_using_subcommand alias; and not __fish_seen_subcommand_from add remove list" -f -a "list" -d 'List every alias'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from add" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from add" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from add" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from add" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from add" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from add" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from add" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from add" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from add" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from remove" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from remove" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from remove" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from remove" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from remove" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from remove" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from remove" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from remove" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from remove" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from list" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from list" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from list" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from list" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from list" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from list" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from list" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from list" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand alias; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -f -a "set" -d 'Store a secret for an agent'
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -f -a "unset" -d 'Remove a secret'
complete -c am -n "__fish_am_using_subcommand secret; and not __fish_seen_subcommand_from set unset list" -f -a "list" -d 'List stored secret names (values are never shown)'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -l agent -d 'Agent it belongs to' -r
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -l value -d 'Secret value (prefer --value over shell history; never logged)' -r
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from set" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from unset" -l agent -d 'Agent it belongs to' -r
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from unset" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from unset" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from unset" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from unset" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from unset" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from unset" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from unset" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from unset" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from unset" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from list" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from list" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from list" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from list" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from list" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from list" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from list" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from list" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand secret; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand start" -l args -d 'Extra arguments passed to the agent (repeatable; quoted strings are split on spaces)' -r
complete -c am -n "__fish_am_using_subcommand start" -l env -d 'Set an environment variable for the agent (repeatable): --env KEY=VALUE' -r
complete -c am -n "__fish_am_using_subcommand start" -l profile -d 'Apply an environment profile (env + args, defined in the config)' -r
complete -c am -n "__fish_am_using_subcommand start" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand start" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand start" -s b -l background -d 'Run detached in the background; output goes to the agent log file'
complete -c am -n "__fish_am_using_subcommand start" -s f -l foreground -d 'Run in the foreground, attached to this terminal (the default)'
complete -c am -n "__fish_am_using_subcommand start" -l notify -d 'Send a desktop notification once the agent has started'
@@ -77,6 +333,7 @@ complete -c am -n "__fish_am_using_subcommand start" -l no-color -d 'Disable ANS
complete -c am -n "__fish_am_using_subcommand start" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand stop" -l timeout -d 'Grace period in seconds before killing (default: from config, 5s)' -r
complete -c am -n "__fish_am_using_subcommand stop" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand stop" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand stop" -l force -d 'Kill immediately instead of terminating gracefully'
complete -c am -n "__fish_am_using_subcommand stop" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand stop" -s q -l quiet -d 'Quiet mode: only errors are printed'
@@ -87,8 +344,10 @@ complete -c am -n "__fish_am_using_subcommand stop" -l no-color -d 'Disable ANSI
complete -c am -n "__fish_am_using_subcommand stop" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand restart" -l args -d 'Extra arguments passed to the agent (repeatable; quoted strings are split on spaces)' -r
complete -c am -n "__fish_am_using_subcommand restart" -l env -d 'Set an environment variable for the agent (repeatable): --env KEY=VALUE' -r
complete -c am -n "__fish_am_using_subcommand restart" -l profile -d 'Apply an environment profile (env + args, defined in the config)' -r
complete -c am -n "__fish_am_using_subcommand restart" -l timeout -d 'Grace period in seconds before killing (default: from config, 5s)' -r
complete -c am -n "__fish_am_using_subcommand restart" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand restart" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand restart" -s b -l background -d 'Run detached in the background; output goes to the agent log file'
complete -c am -n "__fish_am_using_subcommand restart" -s f -l foreground -d 'Run in the foreground, attached to this terminal (the default)'
complete -c am -n "__fish_am_using_subcommand restart" -l notify -d 'Send a desktop notification once the agent has started'
@@ -101,6 +360,7 @@ complete -c am -n "__fish_am_using_subcommand restart" -l json -d 'Emit machine-
complete -c am -n "__fish_am_using_subcommand restart" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand restart" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand status" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand status" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand status" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand status" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand status" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -108,8 +368,88 @@ complete -c am -n "__fish_am_using_subcommand status" -l dry-run -d 'Simulate th
complete -c am -n "__fish_am_using_subcommand status" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand status" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand status" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand sessions" -l project -d 'Only sessions of this project' -r
complete -c am -n "__fish_am_using_subcommand sessions" -l status -d 'Only sessions with this status (running, stopped, failed, interrupted)' -r
complete -c am -n "__fish_am_using_subcommand sessions" -l show -d 'Show one session in detail (summary + log excerpt)' -r
complete -c am -n "__fish_am_using_subcommand sessions" -l resume -d 'Resume a finished session: relaunch the agent with its recorded arguments' -r
complete -c am -n "__fish_am_using_subcommand sessions" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand sessions" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand sessions" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand sessions" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand sessions" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand sessions" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand sessions" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand sessions" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand sessions" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand stats" -l period -d 'Only events of the last period (7d, 30d, 90d, all)' -r
complete -c am -n "__fish_am_using_subcommand stats" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand stats" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand stats" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand stats" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand stats" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand stats" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand stats" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand stats" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand stats" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand top" -l period -d 'Only events of the last period (7d, 30d, 90d, all)' -r
complete -c am -n "__fish_am_using_subcommand top" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand top" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand top" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand top" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand top" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand top" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand top" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand top" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand top" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand report" -l output -d 'Output file (default: report-YYYYMMDD.md in the state directory)' -r -F
complete -c am -n "__fish_am_using_subcommand report" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand report" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand report" -l last-week -d 'Cover the last 7 days'
complete -c am -n "__fish_am_using_subcommand report" -l last-month -d 'Cover the last 30 days'
complete -c am -n "__fish_am_using_subcommand report" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand report" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand report" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand report" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand report" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand report" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand report" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand projects" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand projects" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand projects" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand projects" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand projects" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand projects" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand projects" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand projects" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand projects" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand timeline" -l project -d 'Only activity of this project' -r
complete -c am -n "__fish_am_using_subcommand timeline" -l since -d 'Only activity at or after this date (YYYY-MM-DD or RFC 3339)' -r
complete -c am -n "__fish_am_using_subcommand timeline" -l limit -d 'Maximum number of entries (default: 50)' -r
complete -c am -n "__fish_am_using_subcommand timeline" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand timeline" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand timeline" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand timeline" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand timeline" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand timeline" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand timeline" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand timeline" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand timeline" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand log" -l kind -d 'Only these event kinds (comma separated: start,stop,run,install,...)' -r
complete -c am -n "__fish_am_using_subcommand log" -l since -d 'Only events at or after this date (YYYY-MM-DD or RFC 3339)' -r
complete -c am -n "__fish_am_using_subcommand log" -l limit -d 'Maximum number of events (default: 50)' -r
complete -c am -n "__fish_am_using_subcommand log" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand log" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand log" -l follow -d 'Follow the journal as new events arrive'
complete -c am -n "__fish_am_using_subcommand log" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand log" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand log" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand log" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand log" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand log" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand log" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand install" -l method -d 'Select the install method (index, or type: npm, pip, uv, cargo, go, bun, curl, binary, git)' -r
complete -c am -n "__fish_am_using_subcommand install" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand install" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand install" -l force -d 'Reinstall even if already installed'
complete -c am -n "__fish_am_using_subcommand install" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand install" -s q -l quiet -d 'Quiet mode: only errors are printed'
@@ -119,6 +459,7 @@ complete -c am -n "__fish_am_using_subcommand install" -l json -d 'Emit machine-
complete -c am -n "__fish_am_using_subcommand install" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand install" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand uninstall" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand uninstall" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand uninstall" -l purge -d 'Also remove logs and the agent entry from the user config file'
complete -c am -n "__fish_am_using_subcommand uninstall" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand uninstall" -s q -l quiet -d 'Quiet mode: only errors are printed'
@@ -128,6 +469,7 @@ complete -c am -n "__fish_am_using_subcommand uninstall" -l json -d 'Emit machin
complete -c am -n "__fish_am_using_subcommand uninstall" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand uninstall" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand update" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand update" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand update" -l all -d 'Update every installed managed agent'
complete -c am -n "__fish_am_using_subcommand update" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand update" -s q -l quiet -d 'Quiet mode: only errors are printed'
@@ -137,7 +479,9 @@ complete -c am -n "__fish_am_using_subcommand update" -l json -d 'Emit machine-r
complete -c am -n "__fish_am_using_subcommand update" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand update" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand search" -l category -d 'Restrict to this category' -r
complete -c am -n "__fish_am_using_subcommand search" -l tag -d 'Only agents carrying this personal tag' -r
complete -c am -n "__fish_am_using_subcommand search" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand search" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand search" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand search" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand search" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -145,7 +489,24 @@ complete -c am -n "__fish_am_using_subcommand search" -l dry-run -d 'Simulate th
complete -c am -n "__fish_am_using_subcommand search" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand search" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand search" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand history" -l kind -d 'Only commands of this kind (am or shell)' -r
complete -c am -n "__fish_am_using_subcommand history" -l cwd -d 'Only commands run in this directory' -r
complete -c am -n "__fish_am_using_subcommand history" -l search -d 'Full-text search in the command line' -r
complete -c am -n "__fish_am_using_subcommand history" -l session -d 'Only commands of this session' -r
complete -c am -n "__fish_am_using_subcommand history" -l limit -d 'Maximum number of entries (default: 100)' -r
complete -c am -n "__fish_am_using_subcommand history" -l rerun -d 'Re-run the Nth most recent entry (with confirmation)' -r
complete -c am -n "__fish_am_using_subcommand history" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand history" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand history" -l failed -d 'Only failed commands'
complete -c am -n "__fish_am_using_subcommand history" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand history" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand history" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand history" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand history" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand history" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand history" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand info" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand info" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand info" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand info" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand info" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -153,21 +514,52 @@ complete -c am -n "__fish_am_using_subcommand info" -l dry-run -d 'Simulate the
complete -c am -n "__fish_am_using_subcommand info" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand info" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand info" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -f -a "show" -d 'Print the effective (merged) configuration as YAML'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -f -a "path" -d 'Print the location of the configuration file(s)'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -f -a "edit" -d 'Open the user configuration file in your editor'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -f -a "validate" -d 'Validate the configuration file(s)'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -f -a "add" -d 'Add another agent definition file to the user configuration'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
complete -c am -n "__fish_am_using_subcommand init" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand init" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand init" -l force -d 'Overwrite an existing agent-manager.yaml'
complete -c am -n "__fish_am_using_subcommand init" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand init" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand init" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand init" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand init" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand init" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand init" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand help" -l find -d 'Search through all help commands table' -r
complete -c am -n "__fish_am_using_subcommand help" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand help" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand help" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand help" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand help" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand help" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand help" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand help" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand help" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand version" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand version" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand version" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand version" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand version" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand version" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand version" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand version" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand version" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -f -a "show" -d 'Print the effective (merged) configuration as YAML'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -f -a "path" -d 'Print the location of the configuration file(s)'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -f -a "edit" -d 'Open the user configuration file in your editor'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -f -a "validate" -d 'Validate the configuration file(s)'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -f -a "add" -d 'Add another agent definition file to the user configuration'
complete -c am -n "__fish_am_using_subcommand config; and not __fish_seen_subcommand_from show path edit validate add set" -f -a "set" -d 'Set one configuration key without an editor (config set settings.default_shell pwsh)'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from show" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from show" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from show" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from show" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from show" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -176,6 +568,7 @@ complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from show" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from show" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from path" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from path" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from path" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from path" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from path" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -184,6 +577,7 @@ complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from path" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from path" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from edit" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from edit" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from edit" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from edit" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from edit" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -192,6 +586,7 @@ complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from edit" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from edit" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from validate" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from validate" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from validate" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from validate" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from validate" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -200,6 +595,7 @@ complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from validate" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from validate" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from add" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from add" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from add" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from add" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from add" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -207,13 +603,17 @@ complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from add" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from add" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from add" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "show" -d 'Print the effective (merged) configuration as YAML'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "path" -d 'Print the location of the configuration file(s)'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "edit" -d 'Open the user configuration file in your editor'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "validate" -d 'Validate the configuration file(s)'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "add" -d 'Add another agent definition file to the user configuration'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from set" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from set" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from set" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from set" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from set" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from set" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from set" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from set" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand config; and __fish_seen_subcommand_from set" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand doctor" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand doctor" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand doctor" -l fix -d 'Attempt to repair problems (create directories, fix the state file)'
complete -c am -n "__fish_am_using_subcommand doctor" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand doctor" -s q -l quiet -d 'Quiet mode: only errors are printed'
@@ -223,6 +623,7 @@ complete -c am -n "__fish_am_using_subcommand doctor" -l json -d 'Emit machine-r
complete -c am -n "__fish_am_using_subcommand doctor" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand doctor" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand run" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand run" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand run" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand run" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand run" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -231,6 +632,8 @@ complete -c am -n "__fish_am_using_subcommand run" -l json -d 'Emit machine-read
complete -c am -n "__fish_am_using_subcommand run" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand run" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand completion" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand completion" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand completion" -l installed -d 'Add dynamic completion of the installed agents, aliases and groups (queried from \'am _agents\' at Tab time)'
complete -c am -n "__fish_am_using_subcommand completion" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand completion" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand completion" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -240,6 +643,7 @@ complete -c am -n "__fish_am_using_subcommand completion" -l no-color -d 'Disabl
complete -c am -n "__fish_am_using_subcommand completion" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand self-update" -l to -d 'Download the new binary to this path instead of replacing the current one' -r -F
complete -c am -n "__fish_am_using_subcommand self-update" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand self-update" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand self-update" -l check -d 'Only check whether a newer version exists'
complete -c am -n "__fish_am_using_subcommand self-update" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand self-update" -s q -l quiet -d 'Quiet mode: only errors are printed'
@@ -248,8 +652,18 @@ complete -c am -n "__fish_am_using_subcommand self-update" -l dry-run -d 'Simula
complete -c am -n "__fish_am_using_subcommand self-update" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand self-update" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand self-update" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand self-uninstall" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand self-uninstall" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand self-uninstall" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand self-uninstall" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand self-uninstall" -s y -l yes -d 'Answer yes to every confirmation prompt'
complete -c am -n "__fish_am_using_subcommand self-uninstall" -l dry-run -d 'Simulate the action without changing anything'
complete -c am -n "__fish_am_using_subcommand self-uninstall" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand self-uninstall" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand self-uninstall" -s h -l help -d 'Print help (see more with \'--help\')'
complete -c am -n "__fish_am_using_subcommand export" -l output -d 'Output file (default: am-export.json)' -r -F
complete -c am -n "__fish_am_using_subcommand export" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand export" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand export" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand export" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand export" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -258,6 +672,7 @@ complete -c am -n "__fish_am_using_subcommand export" -l json -d 'Emit machine-r
complete -c am -n "__fish_am_using_subcommand export" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand export" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand import" -s c -l config -d 'Use an alternate configuration file' -r -F
complete -c am -n "__fish_am_using_subcommand import" -l theme -d 'Color theme for the output (see \'am help theme\' for the list)' -r
complete -c am -n "__fish_am_using_subcommand import" -s v -l verbose -d 'Verbose output: show every command executed and its details'
complete -c am -n "__fish_am_using_subcommand import" -s q -l quiet -d 'Quiet mode: only errors are printed'
complete -c am -n "__fish_am_using_subcommand import" -s y -l yes -d 'Answer yes to every confirmation prompt'
@@ -265,26 +680,3 @@ complete -c am -n "__fish_am_using_subcommand import" -l dry-run -d 'Simulate th
complete -c am -n "__fish_am_using_subcommand import" -l json -d 'Emit machine-readable JSON on stdout (for scripts)'
complete -c am -n "__fish_am_using_subcommand import" -l no-color -d 'Disable ANSI colors'
complete -c am -n "__fish_am_using_subcommand import" -s h -l help -d 'Print help'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "list" -d 'List agents: installed ones, or every agent known to the catalog'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "start" -d 'Start an agent (foreground by default, or detached with --background)'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "stop" -d 'Stop a background agent (SIGTERM, then SIGKILL after the timeout)'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "restart" -d 'Restart an agent: stop, then start with the same options'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "status" -d 'Show the state of one agent, or of every installed agent'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "install" -d 'Install an agent and its dependencies'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "uninstall" -d 'Uninstall an agent and clean its files'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "update" -d 'Update an installed agent to the latest available version'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "search" -d 'Search the catalog by keyword (name, description, category, tags)'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "info" -d 'Show detailed information about one agent'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "config" -d 'Manage the configuration file'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "doctor" -d 'Check the environment: tools, config validity, paths, permissions'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "run" -d 'Run the agent command directly with the given arguments (no process management)'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "completion" -d 'Generate a shell completion script'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "self-update" -d 'Update agent-manager itself from GitHub Releases'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "export" -d 'Export the configuration and installation state (backup)'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "import" -d 'Import a previously exported configuration and state'
complete -c am -n "__fish_am_using_subcommand help; and not __fish_seen_subcommand_from list start stop restart status install uninstall update search info config doctor run completion self-update export import help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
complete -c am -n "__fish_am_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "show" -d 'Print the effective (merged) configuration as YAML'
complete -c am -n "__fish_am_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "path" -d 'Print the location of the configuration file(s)'
complete -c am -n "__fish_am_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "edit" -d 'Open the user configuration file in your editor'
complete -c am -n "__fish_am_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "validate" -d 'Validate the configuration file(s)'
complete -c am -n "__fish_am_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "add" -d 'Add another agent definition file to the user configuration'
+256 -14
View File
@@ -18,25 +18,142 @@ settings:
auto_install_deps: true # offer to install missing dependencies
confirm_before_run: true # confirm before running install scripts
stop_timeout_secs: 5 # SIGTERM grace period before SIGKILL
self_update_repo: null # e.g. "you/agent-manager" for am self-update
self_update_repo: Projets/agent-manager # repo used by am self-update (release assets)
self_update_base_url: https://git.dracodev.net/api/v1 # serveur de release (Gitea ici; GitHub: https://api.github.com)
models_prune_days: 30 # un modèle est candidat au prune après N jours sans usage (#73)
catalog_cache_ttl_secs: 3600 # TTL du cache des catalogues distants (#60 #67)
catalog_url: null # URL officielle du catalogue distant (défaut: config.yaml du repo) (#60)
backups_keep: 5 # nombre de backups conservés pour am update --rollback (#64)
sessions_retention_days: 90 # purge des sessions terminées au-delà de N jours (#53)
# Prix des modèles (USD par million de tokens) pour am stats --costs (#49).
# cost_models: # décommenter pour surcharger
# claude-sonnet-4: { input_per_mtok: 3.0, output_per_mtok: 15.0 }
# deepseek-chat: { input_per_mtok: 0.27, output_per_mtok: 1.10 }
# Seuils d'alerte de am monitor (#50) : 0 désactive le seuil.
# monitor_thresholds:
# cpu_pct: 80.0
# mem_mb: 2048
# Plugins d'événements (#75) : scripts exécutés sur on_install/on_start/
# on_stop/on_update, contrat JSON stdin/stdout, timeout, échec non bloquant.
# Le répertoire <state>/plugins/ contient les scripts (+ manifeste .yaml).
# plugins:
# timeout_secs: 10 # temps max d'un plugin (défaut 10 s)
# enabled: [notify] # vide = tous les plugins du répertoire
# Sauvegarde git de l'état (#66) : dépôt où am sync pousse state.json,
# le journal et l'historique (logs/ et backups/ exclus automatiquement).
# sync_repo: https://git.dracodev.net/bruno/am-state.git
# sync_on_exit: true # pousse automatiquement à la fermeture du REPL (opt-in)
# Télémétrie anonyme opt-in (#76) : compteurs agrégés uniquement (jamais de
# chemins, commandes ni identifiants). Désactivée par défaut — RIEN n'est
# collecté ni envoyé tant que enabled n'est pas explicitement true.
# telemetry:
# enabled: false
# endpoint: https://exemple.tld/v1/ping # optionnel : envoi batch périodique
# am ask (#78) : langage naturel → commande am. Les règles locales marchent
# toujours, hors-ligne, sans dépendance. Le raffinement LLM optionnel passe
# par le registre providers (base_url + token du keyring + modèle) — seul
# le texte de la requête est envoyé, jamais les données du journal.
# ask:
# enabled: true # false désactive entièrement am ask
# provider: deepseek # optionnel (défaut: settings.default_provider)
# model: deepseek-chat # optionnel (défaut: modèle par défaut du provider)
# Registre communautaire (#77) : sources de catalogues de confiance +
# auteur par défaut pour am registry publish. L'installation d'une source
# inconnue exige une confirmation (checksum sha256 vérifié avant tout).
# registry:
# sources:
# - https://git.dracodev.net/bruno/am-catalog/raw/branch/main/am-catalog.yaml
# author: bruno
# am ai (#96 #97) : politique de sécurité Shell AI. dry-run par défaut —
# aucune commande modifiante n'est exécutée sans confirmation explicite
# (--yes). `confirm` demande validation pour les commandes risky ;
# `auto` exécute tout (déconseillé). Les motifs supplémentaires s'ajoutent
# aux patterns intégrés (rm -rf, dd if, mkfs, chmod -R 777, ...).
# shell_ai:
# default_safety: dry-run # dry-run | confirm | auto
# risky_patterns:
# - "rm -rf"
# - "> /dev"
# - "dd if"
# Profil sandbox par agent (#79) : commandes autorisées (binaires), répertoires
# de travail et politique réseau. Désactivé par défaut (mode non sandboxé).
# Les tentatives refusées sont journalisées (events sandbox) pour l'audit.
# Exemple dans un agent :
# sandbox:
# enabled: true
# commands: [python, git]
# dirs: ["~/workspace"]
# network: false
# Registre des providers LLM (#88) : nom -> base_url, modèles, modèle par
# défaut. Le provider par défaut est utilisé à l'install/au run quand aucun
# n'est donné (issue #90). Les tokens ne vont JAMAIS ici — ils vivent dans
# le keyring OS sous providers/<nom>/api_key (issue #89, am providers set-token).
# Pour retirer un provider du catalogue par défaut : am providers remove <nom>
# (écrit "<nom>: null" dans votre config — le null supprime l'entrée au merge).
default_provider: anthropic
providers:
anthropic:
base_url: https://api.anthropic.com/v1
default_model: claude-sonnet-4-5
models: [claude-sonnet-4-5, claude-opus-4-1, claude-haiku-4-5]
openai:
base_url: https://api.openai.com/v1
default_model: gpt-5.2
models: [gpt-5.2, gpt-5.1-mini, o4-mini]
deepseek:
base_url: https://api.deepseek.com
default_model: deepseek-chat
models: [deepseek-chat, deepseek-reasoner]
google:
base_url: https://generativelanguage.googleapis.com/v1beta
default_model: gemini-2.5-pro
models: [gemini-2.5-pro, gemini-2.5-flash]
# QwenCloud (Alibaba) — deux modes de facturation, deux providers :
# - qwen-cloud-token-plan : abonnement Credits (Personal/Team), clé
# dédiée Token Plan, modèles restreints (voir docs.qwencloud.com).
# Base URL internationale (ap-southeast-1) ; la variante Pékin
# token-plan.cn-beijing.maas.aliyuncs.com sert la Chine.
# - qwen-cloud : pay-as-you-go (clé sk- Model Studio / DashScope).
qwen-cloud-token-plan:
base_url: https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1
default_model: qwen3.8-max
models: [qwen3.8-max, qwen3.8-flash, qwen3.7-max, qwen3.7-plus, qwen3.6-flash, deepseek-v4-pro, glm-5.2]
qwen-cloud:
base_url: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
default_model: qwen3.7-plus
models: [qwen3.8-max, qwen3.7-max, qwen3.7-plus, qwen3.6-flash, qwen3-coder-plus, qwen3-coder-next, deepseek-v4-pro]
openrouter:
base_url: https://openrouter.ai/api/v1
default_model: deepseek/deepseek-chat-v3-0324
models:
- deepseek/deepseek-chat-v3-0324
- anthropic/claude-sonnet-4.5
- openai/gpt-4o
- google/gemini-2.5-pro
- meta-llama/llama-3.3-70b-instruct
- mistralai/mistral-large-2411
# --- Command aliases ----------------------------------------------------------
aliases:
cc: claude-code
gemini: gemini-cli
# Gemini CLI (npm @google/gemini-cli) ne sert plus les comptes Google
# gratuits/Pro/Ultra depuis le 2026-06-18 — remplacé par Antigravity CLI.
gemini: antigravity-cli
agy: antigravity-cli
gh-copilot: github-copilot
q: amazon-q
droid: factory-droid
gjc: gajae-code
tiny: tiny-agents
continue: continue-cli
ai: aichat
# --- Groups (start/stop/restart several agents together) ----------------------
groups:
dev: [claude-code, aider, codex]
local: [atomic-agent, nanocoder, gptme, goose]
claw: [openclaw, zeroclaw, picoclaw]
mainstream: [claude-code, opencode, gemini-cli, codex, qwen-code]
mainstream: [claude-code, opencode, antigravity-cli, codex, qwen-code]
# ============================================================================
# Agents
@@ -54,6 +171,12 @@ agents:
dependencies:
- { name: node, min_version: "18.0.0", install_hint: "https://nodejs.org" }
run: claude
provider: anthropic
config:
env_map:
api_key: ANTHROPIC_API_KEY
model: ANTHROPIC_MODEL
base_url: ANTHROPIC_BASE_URL
tags: [anthropic, assistant, source-available, mainstream]
- name: deepseek-harness
@@ -67,6 +190,7 @@ agents:
dependencies:
- { name: node, min_version: "20.0.0", install_hint: "https://nodejs.org" }
run: dsh
provider: deepseek
tags: [deepseek, harness, multi-agent, plugins, web-ui]
- name: hermes-agent
@@ -183,9 +307,26 @@ agents:
note: "projet en mode musée — maintenance 100 % automatisée"
tags: [rust, clean-room, fork]
- name: antigravity-cli
display_name: "Antigravity CLI"
description: "Agent terminal officiel de Google (successseur de Gemini CLI, fermé, binaire Go). Même harnais d'agents qu'Antigravity 2.0 : multi-agents asynchrones, skills, hooks, plugins, MCP. Auth Google via keyring système, quota partagé avec l'app desktop (surveiller /usage)."
category: coding-agent
website: https://antigravity.google/cli
install:
type: binary
repo: google-antigravity/antigravity-cli
binary: agy
run: agy
provider: google
setup_hints:
- "agy (premier lancement : setup interactif + auth Google via le trousseau)"
- "agy plugin import gemini (importe extensions/skills de l'ancien Gemini CLI)"
tags: [google, mainstream, antigravity]
note: "Remplace Gemini CLI : le 2026-06-18, Gemini CLI a cessé de servir les comptes Google gratuits/Pro/Ultra. Import des extensions/skills Gemini : 'agy plugin import gemini' ; GEMINI.md et ~/.gemini/ restent lus (config native : ~/.gemini/antigravity-cli/, skills workspace : .agents/skills/, MCP : mcp_config.json avec clé 'serverUrl')."
- name: gemini-cli
display_name: "Gemini CLI"
description: "Agent terminal officiel Google (Apache-2.0), outils repo + recherche."
display_name: "Gemini CLI (déprécié)"
description: "Ancien agent terminal Google (Apache-2.0). Ne sert plus les comptes Google gratuits/Pro/Ultra depuis le 2026-06-18 ; reste utilisable avec une clé API Gemini payante. Migrer vers antigravity-cli."
category: coding-agent
website: https://github.com/google-gemini/gemini-cli
install:
@@ -194,7 +335,9 @@ agents:
dependencies:
- { name: node, min_version: "18.0.0", install_hint: "https://nodejs.org" }
run: gemini
tags: [google, mainstream]
installable: false
tags: [google, deprecated]
note: "déprécié — remplacé par Antigravity CLI ('am install antigravity-cli'), voir la note de cette entrée"
- name: codex
display_name: "Codex CLI"
@@ -207,6 +350,11 @@ agents:
dependencies:
- { name: node, min_version: "18.0.0", install_hint: "https://nodejs.org" }
run: codex
config:
env_map:
api_key: OPENAI_API_KEY
model: OPENAI_MODEL
base_url: OPENAI_BASE_URL
tags: [openai, mainstream]
- name: openhands
@@ -323,6 +471,15 @@ agents:
dependencies:
- { name: node, min_version: "18.0.0", install_hint: "https://nodejs.org" }
run: qwen-code
provider: qwen-cloud
config:
env_map:
api_key: OPENAI_API_KEY
model: OPENAI_MODEL
base_url: OPENAI_BASE_URL
setup_hints:
- "am install qwen-code --provider qwen-cloud-token-plan (abonnement Credits Token Plan au lieu du pay-as-you-go)"
- "am providers set-token qwen-cloud-token-plan (clé dédiée Token Plan ; pay-as-you-go : clé sk- Model Studio)"
tags: [alibaba, qwen]
- name: grok-build
@@ -341,14 +498,14 @@ agents:
- name: kimi-cli
display_name: "Kimi CLI"
description: "Agent CLI officiel Moonshot AI, skills, MCP, intégration ACP IDE (Apache-2.0)."
description: "Agent CLI officiel Moonshot AI, skills, MCP, intégration ACP IDE (Apache-2.0). Installé via uv (paquet PyPI kimi-cli)."
category: coding-agent
website: https://github.com/MoonshotAI/kimi-cli
install:
type: npm
package: "@moonshotai/kimi-cli"
type: uv
package: kimi-cli
dependencies:
- { name: node, min_version: "18.0.0", install_hint: "https://nodejs.org" }
- { name: uv, min_version: "0.4.0", install_hint: "https://docs.astral.sh/uv" }
run: kimi
tags: [moonshot, skills, mcp]
@@ -457,6 +614,15 @@ agents:
repo: 1ay1/agentty
binary: agentty
run: agentty
config:
provider_default: openai
env_map:
api_key: AGENTTY_API_KEY
model: AGENTTY_MODEL
base_url: AGENTTY_BASE_URL
files:
- path: ~/.config/agentty/config.toml
keys: [model, base_url]
tags: [c++, static, sandbox]
- name: nullclaw
@@ -699,6 +865,9 @@ agents:
dependencies:
- { name: node, min_version: "18.0.0", install_hint: "https://nodejs.org" }
run: "npx lazycodex-ai"
# Sonde PATH explicite : le premier mot de `run` est npx (interpréteur) —
# sans `detect`, npx sur le PATH suffirait à déclarer l'agent « external ».
detect: lazycodex-ai
note: "s'intègre dans Codex (nécessite @openai/codex)"
tags: [harness, codex, plan]
@@ -771,6 +940,71 @@ agents:
note: "étapes de build spécifiques au repo — consultez son README"
tags: [simulator, orchestration]
# ---------------------------------------------------------------- Shell AI
- name: aichat
display_name: "AIChat"
description: "All-in-one LLM CLI avec Shell Assistant, Chat-REPL, RAG, AI Tools & Agents et support fichiers/répertoires (-f). Idéal pour exécuter des micro-tâches shell via langage naturel (issue #94)."
category: shell-ai
website: https://github.com/sigoden/aichat
install:
type: binary
repo: sigoden/aichat
binary: aichat
run: aichat
tags: [shell, rust, multi-provider, rag, local, fast]
- name: ai-cli
display_name: "AI CLI"
description: "Traduit le langage naturel en commandes shell (OpenAI, OpenRouter ou serveur local) avec politique de sécurité (risk / certainty) avant exécution (issue #95)."
category: shell-ai
website: https://github.com/kriserickson/ai-cli
install:
type: binary
repo: kriserickson/ai-cli
binary: ai
run: ai
tags: [shell, go, safety, multi-provider]
- name: fabric
display_name: "Fabric"
description: "Framework open source pour augmenter les humains avec l'IA : patterns réutilisables (summarize, extract wisdom, analyse de contenu), CLI Go 43k+ stars (issue #95)."
category: shell-ai
website: https://github.com/danielmiessler/fabric
install:
type: go
package: github.com/danielmiessler/fabric/cmd/fabric@latest
dependencies:
- { name: go, min_version: "1.22.0", install_hint: "https://go.dev/dl" }
run: fabric
tags: [patterns, go, content]
- name: shell-ai
display_name: "Shell AI"
description: "Agent ReAct local-first propulsé par Ollama : zéro réseau, outils filesystem, exécution de commandes shell et intégration MCP (issue #95)."
category: shell-ai
website: https://github.com/nishant9083/shell-ai
install:
type: npm
package: "@shell-ai/cli"
dependencies:
- { name: node, min_version: "18.0.0", install_hint: "https://nodejs.org" }
run: shell-ai
note: "nécessite Ollama et un modèle (ollama pull gpt-oss) — agent jeune (15 stars)"
tags: [shell, ollama, local, mcp, typescript]
- name: shellgpt
display_name: "ShellGPT"
description: "Outil de productivité CLI propulsé par LLM (GPT-5…) : génère et exécute des commandes shell, écrit du code et des docs, 12k+ stars (issue #95)."
category: shell-ai
website: https://github.com/TheR1D/shell_gpt
install:
type: pip
package: shell-gpt
dependencies:
- { name: python, min_version: "3.10.0", install_hint: "https://python.org" }
run: sgpt
tags: [shell, python, multi-provider]
# ----------------------------------------------------- Écosystème OpenClaw
- name: openclaw
display_name: "OpenClaw"
@@ -796,6 +1030,9 @@ agents:
dependencies:
- { name: python, min_version: "3.9.0", install_hint: "https://python.org" }
run: "python -m nanobot"
# Sonde PATH explicite : le premier mot de `run` est python (interpréteur) —
# sans `detect`, /usr/bin/python suffirait à déclarer l'agent « external ».
detect: nanobot
tags: [python, lightweight]
- name: zeroclaw
@@ -829,11 +1066,16 @@ agents:
category: assistant
website: https://github.com/sipeed/picoclaw
install:
type: git
repo: "https://github.com/sipeed/picoclaw"
dependencies:
- { name: go, min_version: "1.21.0", install_hint: "https://go.dev/dl" }
type: binary
repo: sipeed/picoclaw
binary: picoclaw
run: picoclaw
# PicoClaw gère sa config par sous-commandes (pas de fichier à écrire) :
# ces commandes sont affichées après l'install avec {model} substitué.
setup_hints:
- "picoclaw onboard"
- "picoclaw model {model}"
- "picoclaw auth login"
tags: [go, tiny]
- name: ironclaw
+8
View File
@@ -0,0 +1,8 @@
# Tâche de benchmark (issue #62) : les mêmes arguments sont passés à la
# commande de chaque agent. Copier dans <state_dir>/lab/ ou passer un
# chemin explicite :
# am lab --agents claude-code,aider --task hello.yaml --json
name: hello
description: "Répondre à la question la plus simple (sanity check du lab)."
args: ["--prompt", "Réponds uniquement 'coucou' et rien d'autre."]
# timeout: 300 # secondes par agent (défaut 600) — --timeout l'emporte
+31
View File
@@ -0,0 +1,31 @@
# Plugin scripts — agent-manager (issue #75)
#
# Les plugins sont des points d'extension par script, exécutés sur les
# événements du cycle de vie des agents (complément des hooks de l'axe 6) :
# on_install · on_start · on_stop · on_update
#
# Contrat :
# - entrée : l'événement JSON sur stdin
# {"event":"on_start","kind":"start","ts":"…","agent":"claude-code",
# "pid":1234,"cwd":"…","project":"…","args":[…],"env_keys":[…],…}
# - sortie : un objet JSON sur stdout
# {"ok": true, "message": "…", "data": {…}}
# ou {"ok": false, "error": "…"} — signalé en warning, jamais fatal
# - une sortie invalide (pas de JSON) est signalée en warning sans casser am
# - un plugin qui dépasse son timeout est tué (défaut 10 s)
# - les plugins n'ont pas accès aux valeurs des secrets (env_keys seulement)
# - AM_PLUGINS_RUNNING=1 est exporté pendant un plugin : un am imbriqué
# saute les plugins (anti-récursion)
#
# Installation :
# cp notify.py notify.yaml ~/.local/state/agent-manager/plugins/ (Linux)
# cp notify.py notify.yaml %LOCALAPPDATA%\agent-manager\plugins\ (Windows)
#
# Vérification :
# am plugins # liste les plugins découverts
# am plugins --test notify # exécute le contrat sur un événement de test
#
# Configuration (config.yaml) :
# plugins:
# timeout_secs: 10 # temps max d'un plugin (défaut 10 s)
# enabled: [notify] # vide = tous les plugins du répertoire
+38
View File
@@ -0,0 +1,38 @@
#!/usr/bin/env python3
"""Plugin exemple (issue #75) : poste les événements install/update vers un
webhook CI. Si la variable d'environnement CI_WEBHOOK_URL n'est pas définie,
le plugin répond ok sans rien faire (échec non bloquant, jamais fatal).
Exemple : CI_WEBHOOK_URL=https://hooks.example.com/am-ci am update --all
"""
import json
import os
import sys
import urllib.request
def main() -> int:
ev = json.load(sys.stdin)
url = os.environ.get("CI_WEBHOOK_URL")
if not url:
print(json.dumps({"ok": True, "message": "CI_WEBHOOK_URL non définie — rien à faire"}))
return 0
req = urllib.request.Request(
url,
data=json.dumps(ev).encode(),
headers={"Content-Type": "application/json"},
method="POST",
)
try:
with urllib.request.urlopen(req, timeout=5) as resp:
status = resp.status
except Exception as exc: # échec non bloquant : warning seulement
print(json.dumps({"ok": False, "error": f"webhook: {exc}"}))
return 0
print(json.dumps({"ok": True, "message": f"webhook {status}"}))
return 0
if __name__ == "__main__":
sys.exit(main())
+4
View File
@@ -0,0 +1,4 @@
# Manifest du plugin ci-webhook (issue #75).
command: "python ci-webhook.py" # Linux : "python3 ci-webhook.py"
events: [on_install, on_update]
timeout_secs: 10
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env python3
"""Plugin exemple (issue #75) : notifie le démarrage / l'arrêt d'un agent.
Contrat : l'événement JSON arrive sur stdin, la réponse JSON part sur stdout.
Installation : copier notify.py + notify.yaml dans <state_dir>/plugins/ puis
relancer am. Test : am plugins --test notify
"""
import json
import sys
def main() -> int:
ev = json.load(sys.stdin)
agent = ev.get("agent") or "inconnu"
event = ev.get("event", "?")
pid = ev.get("pid")
detail = f" (pid {pid})" if pid else ""
print(json.dumps({"ok": True, "message": f"{event} de {agent}{detail}"}))
return 0
if __name__ == "__main__":
sys.exit(main())
+7
View File
@@ -0,0 +1,7 @@
# Manifest du plugin notify (issue #75).
# command: interpréteur + script (indispensable sur Windows pour .py).
command: "python notify.py" # Linux : "python3 notify.py"
# Événements écoutés (défaut : les 4 événements du cycle de vie).
events: [on_start, on_stop]
# Temps maximal d'exécution avant kill (défaut : settings.plugins.timeout_secs, 10).
timeout_secs: 5
+11 -1
View File
@@ -24,7 +24,7 @@ function Install-FromSource {
Write-Host "Installation depuis les sources (cargo install --git $BaseUrl.git) ..."
cargo install --git "$BaseUrl.git" --locked
if ($LASTEXITCODE -ne 0) { Fail "cargo install a echoue" }
$bin = Join-Path $env:USERPROFILE ".cargo\binam.exe"
$bin = Join-Path $env:USERPROFILE ".cargo\bin\am.exe"
Write-Host ""
Write-Host "OK - am est installe dans $bin"
Write-Host "Essayez : am list | am doctor (mise a jour : relancez ce script)"
@@ -47,7 +47,10 @@ if ($arch -eq "x86_64") {
$tmpDir = Join-Path $env:TEMP "am-$tag"
Remove-Item $tmpDir -Recurse -Force -ErrorAction SilentlyContinue
Expand-Archive -Path $tmp -DestinationPath $tmpDir -Force
# L'entrée de l'archive varie selon le pipeline : « am.exe » ou
# « am-windows-x86_64.exe » (nom de l'asset). Accepter les deux.
$exe = Join-Path $tmpDir "am.exe"
if (-not (Test-Path $exe)) { $exe = Join-Path $tmpDir "am-windows-x86_64.exe" }
if (Test-Path $exe) {
New-Item -ItemType Directory -Force -Path $binDir | Out-Null
Copy-Item $exe (Join-Path $binDir "am.exe") -Force
@@ -75,6 +78,13 @@ if (-not $InstallDir) {
$env:Path = "$binDir;$env:Path"
& (Join-Path $binDir "am.exe") --version
Write-Host ""
# Épique v1.1.0 : wizard d'onboarding (provider + token + aichat + rôles)
# uniquement quand stdin est un terminal interactif (pas en CI).
if ([Console]::IsInputRedirected -eq $false) {
Write-Host "Configuration initiale (provider, token, aichat) :"
& (Join-Path $binDir "am.exe") setup
}
Write-Host ""
Write-Host "OK - 'am' est installe. Essayez :"
Write-Host " am list"
Write-Host " am doctor"
+26 -3
View File
@@ -22,6 +22,13 @@ case "$arch" in
*) fail "architecture non supportée: $arch" ;;
esac
os=$(uname -s | tr '[:upper:]' '[:lower:]')
case "$os" in
linux) platform="linux" ;;
darwin) platform="macos" ;;
*) fail "système non supporté: $os" ;;
esac
install_from_source() {
if ! command -v cargo >/dev/null 2>&1; then
fail "pas de binaire précompilé pour $arch et cargo est absent — installez Rust (https://rustup.rs) puis relancez"
@@ -45,14 +52,23 @@ fi
installed=""
if [ -n "$tag" ] && command -v curl >/dev/null 2>&1; then
asset="am-linux-$arch.tar.gz"
asset="am-$platform-$arch.tar.gz"
url="$BASE_URL/releases/download/$tag/$asset"
echo "Téléchargement de $url …"
if curl -fsSL --connect-timeout 20 -o "$tmpdir/am.tar.gz" "$url"; then
tar -xzf "$tmpdir/am.tar.gz" -C "$tmpdir" 2>/dev/null || true
if [ -f "$tmpdir/am" ]; then
# L'entrée de l'archive varie selon le pipeline CI : « am » ou
# « am-linux-x86_64 » (nom de la release). Prendre le premier fichier
# extrait.
bin=""
for cand in "$tmpdir/am" "$tmpdir/am-$platform-$arch" "$tmpdir/am-$arch" "$tmpdir"/*; do
if [ -f "$cand" ] && [ -z "$bin" ]; then
bin="$cand"
fi
done
if [ -n "$bin" ]; then
mkdir -p "$INSTALL_DIR"
cp "$tmpdir/am" "$INSTALL_DIR/am"
cp "$bin" "$INSTALL_DIR/am"
chmod +x "$INSTALL_DIR/am"
installed=1
fi
@@ -77,6 +93,13 @@ esac
"$INSTALL_DIR/am" --version || true
echo ""
# Épique v1.1.0 : wizard d'onboarding (provider + token + aichat + rôles)
# uniquement quand stdin est un terminal interactif (pas en CI).
if [ -t 0 ]; then
echo "Configuration initiale (provider, token, aichat) :"
"$INSTALL_DIR/am" setup
fi
echo ""
echo "OK — 'am' est installé. Essayez :"
echo " am list"
echo " am doctor"
+31
View File
@@ -0,0 +1,31 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-ai 1 "ai "
.SH NAME
ai \- Langage naturel → action shell via AIChat (issues #96 #97); alias: shell
.SH SYNOPSIS
\fBai\fR [\fB\-e\fR|\fB\-\-exec\fR] [\fB\-f\fR|\fB\-\-files\fR] [\fB\-\-provider\fR] [\fB\-\-model\fR] [\fB\-\-role\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fIPROMPT\fR>
.SH DESCRIPTION
Langage naturel → action shell via AIChat (issues #96 #97); alias: shell
.SH OPTIONS
.TP
\fB\-e\fR, \fB\-\-exec\fR
Execute the generated shell command (after the safety policy)
.TP
\fB\-f\fR, \fB\-\-files\fR \fI<PATH>\fR
Files or directories passed as context (repeatable; default: the current directory)
.TP
\fB\-\-provider\fR \fI<ID>\fR
Provider of the registry used by aichat (env vars + model)
.TP
\fB\-\-model\fR \fI<MODEL>\fR
Force a model (aichat \-\-model)
.TP
\fB\-\-role\fR \fI<ROLE>\fR
Use one of the generated copilot roles (am\-copilot, am\-operator, am\-dev, am\-do, am\-analyst, am\-orchestrator — issue v1.1.0 F3)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIPROMPT\fR>
The request in natural language
+26
View File
@@ -0,0 +1,26 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-alias 1 "alias "
.SH NAME
alias \- Manage command aliases (cc \-> claude\-code)
.SH SYNOPSIS
\fBalias\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIsubcommands\fR>
.SH DESCRIPTION
Manage command aliases (cc \-> claude\-code)
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.SH SUBCOMMANDS
.TP
alias\-add(1)
Add an alias (am alias add cc claude\-code)
.TP
alias\-remove(1)
Remove an alias
.TP
alias\-list(1)
List every alias
.TP
alias\-help(1)
Print this message or the help of the given subcommand(s)
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-ask 1 "ask "
.SH NAME
ask \- Ask a natural\-language request and get the matching am command(s) (issue #78): local rules first, optional LLM refinement, confirmation before execution
.SH SYNOPSIS
\fBask\fR [\fB\-\-yes\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fIREQUEST\fR>
.SH DESCRIPTION
Ask a natural\-language request and get the matching am command(s) (issue #78): local rules first, optional LLM refinement, confirmation before execution
.SH OPTIONS
.TP
\fB\-\-yes\fR
Skip the confirmation prompt
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIREQUEST\fR>
The request in natural language
+13
View File
@@ -0,0 +1,13 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-audit 1 "audit "
.SH NAME
audit \- Audit the configuration: who changed what, when (issue #63)
.SH SYNOPSIS
\fBaudit\fR [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Audit the configuration: who changed what, when (issue #63)
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+26
View File
@@ -0,0 +1,26 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-catalog 1 "catalog "
.SH NAME
catalog \- Manage remote catalogs: update the official one, add external ones
.SH SYNOPSIS
\fBcatalog\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIsubcommands\fR>
.SH DESCRIPTION
Manage remote catalogs: update the official one, add external ones
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.SH SUBCOMMANDS
.TP
catalog\-update(1)
Fetch the official catalog, show the diff and register it as an include
.TP
catalog\-add(1)
Register an external catalog (same YAML format) by URL
.TP
catalog\-list(1)
List the registered remote catalogs
.TP
catalog\-help(1)
Print this message or the help of the given subcommand(s)
+35
View File
@@ -0,0 +1,35 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-completion 1 "completion "
.SH NAME
completion \- Generate a shell completion script
.SH SYNOPSIS
\fBcompletion\fR [\fB\-\-installed\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fISHELL\fR>
.SH DESCRIPTION
Generate a shell completion script
.SH OPTIONS
.TP
\fB\-\-installed\fR
Add dynamic completion of the installed agents, aliases and groups (queried from \*(Aqam _agents\*(Aq at Tab time)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fISHELL\fR>
Shell to generate completions for
.br
.br
\fIPossible values:\fR
.RS 14
.IP \(bu 2
bash
.IP \(bu 2
elvish
.IP \(bu 2
fish
.IP \(bu 2
powershell
.IP \(bu 2
zsh
.RE
+35
View File
@@ -0,0 +1,35 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-config 1 "config "
.SH NAME
config \- Manage the configuration file
.SH SYNOPSIS
\fBconfig\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIsubcommands\fR>
.SH DESCRIPTION
Manage the configuration file
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.SH SUBCOMMANDS
.TP
config\-show(1)
Print the effective (merged) configuration as YAML
.TP
config\-path(1)
Print the location of the configuration file(s)
.TP
config\-edit(1)
Open the user configuration file in your editor
.TP
config\-validate(1)
Validate the configuration file(s)
.TP
config\-add(1)
Add another agent definition file to the user configuration
.TP
config\-set(1)
Set one configuration key without an editor (config set settings.default_shell pwsh)
.TP
config\-help(1)
Print this message or the help of the given subcommand(s)
+13
View File
@@ -0,0 +1,13 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-dashboard 1 "dashboard "
.SH NAME
dashboard \- Live TUI dashboard: overview, activity, stats, sessions, projects
.SH SYNOPSIS
\fBdashboard\fR [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Live TUI dashboard: overview, activity, stats, sessions, projects
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-doctor 1 "doctor "
.SH NAME
doctor \- Check the environment: tools, config validity, paths, permissions
.SH SYNOPSIS
\fBdoctor\fR [\fB\-\-fix\fR] [\fB\-\-watch\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Check the environment: tools, config validity, paths, permissions
.SH OPTIONS
.TP
\fB\-\-fix\fR
Attempt to repair problems (create directories, fix the state file)
.TP
\fB\-\-watch\fR \fI<SECONDS>\fR
Re\-run the checks every N seconds, alerting on failure (issue #59)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-export 1 "export "
.SH NAME
export \- Export the configuration and installation state (backup)
.SH SYNOPSIS
\fBexport\fR [\fB\-\-output\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Export the configuration and installation state (backup)
.SH OPTIONS
.TP
\fB\-\-output\fR \fI<FILE>\fR [default: am\-export.json]
Output file (default: am\-export.json)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-favorite 1 "favorite "
.SH NAME
favorite \- Mark an agent as a favorite (star in list and status)
.SH SYNOPSIS
\fBfavorite\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR>
.SH DESCRIPTION
Mark an agent as a favorite (star in list and status)
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-help 1 "help "
.SH NAME
help \- Display help: the overview, a command, the command list, or a search
.SH SYNOPSIS
\fBhelp\fR [\fB\-\-find\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fICOMMAND\fR]
.SH DESCRIPTION
Display help: the overview, a command, the command list, or a search
.SH OPTIONS
.TP
\fB\-\-find\fR \fI<TEXT>\fR
Search through all help commands table
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fICOMMAND\fR]
Command name (also accepts an agent name or alias); "commands" lists every command
+40
View File
@@ -0,0 +1,40 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-history 1 "history "
.SH NAME
history \- Search the command history (am and shell commands)
.SH SYNOPSIS
\fBhistory\fR [\fB\-\-kind\fR] [\fB\-\-cwd\fR] [\fB\-\-search\fR] [\fB\-\-failed\fR] [\fB\-\-session\fR] [\fB\-\-limit\fR] [\fB\-\-rerun\fR] [\fB\-\-save\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fIRANGE\fR]
.SH DESCRIPTION
Search the command history (am and shell commands)
.SH OPTIONS
.TP
\fB\-\-kind\fR \fI<KIND>\fR
Only commands of this kind (am or shell)
.TP
\fB\-\-cwd\fR \fI<DIR>\fR
Only commands run in this directory
.TP
\fB\-\-search\fR \fI<TEXT>\fR
Full\-text search in the command line
.TP
\fB\-\-failed\fR
Only failed commands
.TP
\fB\-\-session\fR \fI<ID>\fR
Only commands of this session
.TP
\fB\-\-limit\fR \fI<N>\fR [default: 100]
Maximum number of entries (default: 100)
.TP
\fB\-\-rerun\fR \fI<N>\fR
Re\-run the Nth most recent entry (with confirmation)
.TP
\fB\-\-save\fR \fI<FILE>\fR
Export the range as a playbook YAML file (issue #51)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIRANGE\fR]
Range to export as a playbook: "12..25" (1\-based, newest first)
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-import 1 "import "
.SH NAME
import \- Import a previously exported configuration and state
.SH SYNOPSIS
\fBimport\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIFILE\fR>
.SH DESCRIPTION
Import a previously exported configuration and state
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIFILE\fR>
File exported by the export command
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-info 1 "info "
.SH NAME
info \- Show detailed information about one agent
.SH SYNOPSIS
\fBinfo\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR>
.SH DESCRIPTION
Show detailed information about one agent
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-init 1 "init "
.SH NAME
init \- Generate a local agent\-manager.yaml for the current directory
.SH SYNOPSIS
\fBinit\fR [\fB\-\-force\fR] [\fB\-\-template\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Generate a local agent\-manager.yaml for the current directory
.SH OPTIONS
.TP
\fB\-\-force\fR
Overwrite an existing agent\-manager.yaml
.TP
\fB\-\-template\fR \fI<TEMPLATE>\fR
Use a template (web, python, rust, cli) instead of stack detection; "list" shows the available templates
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+31
View File
@@ -0,0 +1,31 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-install 1 "install "
.SH NAME
install \- Install an agent and its dependencies
.SH SYNOPSIS
\fBinstall\fR [\fB\-\-method\fR] [\fB\-\-force\fR] [\fB\-\-provider\fR] [\fB\-\-model\fR] [\fB\-\-no\-config\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR>
.SH DESCRIPTION
Install an agent and its dependencies
.SH OPTIONS
.TP
\fB\-\-method\fR \fI<METHOD>\fR
Select the install method (index, or type: npm, pip, uv, cargo, go, bun, curl, binary, git)
.TP
\fB\-\-force\fR
Reinstall even if already installed
.TP
\fB\-\-provider\fR \fI<PROVIDER>\fR
Provider to configure (default: the agent\*(Aqs provider, else settings.default_provider) (issue #90)
.TP
\fB\-\-model\fR \fI<MODEL>\fR
Model to configure (default: the provider\*(Aqs default model) (issue #90)
.TP
\fB\-\-no\-config\fR
Skip the post\-install provider configuration (issue #91)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
+28
View File
@@ -0,0 +1,28 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-lab 1 "lab "
.SH NAME
lab \- Benchmark: run the same task on several agents and compare (issue #62)
.SH SYNOPSIS
\fBlab\fR [\fB\-\-agents\fR] [\fB\-\-task\fR] [\fB\-\-parallel\fR] [\fB\-\-timeout\fR] [\fB\-\-list\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Benchmark: run the same task on several agents and compare (issue #62)
.SH OPTIONS
.TP
\fB\-\-agents\fR \fI<AGENTS>\fR
Comma\-separated agent names (or aliases) to benchmark
.TP
\fB\-\-task\fR \fI<FILE>\fR
Task file (a bare name resolves under state_dir/lab/, .yaml appended)
.TP
\fB\-\-parallel\fR
Run every agent concurrently instead of one after another
.TP
\fB\-\-timeout\fR \fI<SECS>\fR
Override the task timeout in seconds
.TP
\fB\-\-list\fR
List the task files of the lab directory
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+25
View File
@@ -0,0 +1,25 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-list 1 "list "
.SH NAME
list \- List installed agents (default); use \-\-all for the whole catalog
.SH SYNOPSIS
\fBlist\fR [\fB\-\-all\fR] [\fB\-\-category\fR] [\fB\-\-running\fR] [\fB\-\-sort\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
List installed agents (default); use \-\-all for the whole catalog
.SH OPTIONS
.TP
\fB\-\-all\fR
Show every agent known to the catalog, not only the installed ones
.TP
\fB\-\-category\fR \fI<CATEGORY>\fR
Only show agents of this category
.TP
\fB\-\-running\fR
Only show running agents
.TP
\fB\-\-sort\fR \fI<KEY>\fR
Sort by name, version or status (default: name)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+28
View File
@@ -0,0 +1,28 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-log 1 "log "
.SH NAME
log \- Read the event journal: everything am did
.SH SYNOPSIS
\fBlog\fR [\fB\-\-kind\fR] [\fB\-\-since\fR] [\fB\-\-limit\fR] [\fB\-\-follow\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fIAGENT\fR]
.SH DESCRIPTION
Read the event journal: everything am did
.SH OPTIONS
.TP
\fB\-\-kind\fR \fI<KINDS>\fR
Only these event kinds (comma separated: start,stop,run,install,...)
.TP
\fB\-\-since\fR \fI<DATE>\fR
Only events at or after this date (YYYY\-MM\-DD or RFC 3339)
.TP
\fB\-\-limit\fR \fI<N>\fR [default: 50]
Maximum number of events (default: 50)
.TP
\fB\-\-follow\fR
Follow the journal as new events arrive
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIAGENT\fR]
Only events of this agent
+22
View File
@@ -0,0 +1,22 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-logs 1 "logs "
.SH NAME
logs \- Tail the log file of an agent (\-\-follow for a live view)
.SH SYNOPSIS
\fBlogs\fR [\fB\-\-lines\fR] [\fB\-\-follow\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR>
.SH DESCRIPTION
Tail the log file of an agent (\-\-follow for a live view)
.SH OPTIONS
.TP
\fB\-\-lines\fR \fI<N>\fR [default: 20]
Number of lines to show (default: 20)
.TP
\fB\-\-follow\fR
Follow the log as it grows
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-man 1 "man "
.SH NAME
man \- Generate a man page for am (or for one command)
.SH SYNOPSIS
\fBman\fR [\fB\-\-output\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fICOMMAND\fR]
.SH DESCRIPTION
Generate a man page for am (or for one command)
.SH OPTIONS
.TP
\fB\-\-output\fR \fI<DIR>\fR
Write the page(s) to this directory instead of stdout
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fICOMMAND\fR]
Command name (omit for the whole CLI)
+22
View File
@@ -0,0 +1,22 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-migrate 1 "migrate "
.SH NAME
migrate \- Transfer the installation and state to another machine (issue #68)
.SH SYNOPSIS
\fBmigrate\fR [\fB\-\-export\fR] [\fB\-\-output\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fIBUNDLE\fR]
.SH DESCRIPTION
Transfer the installation and state to another machine (issue #68)
.SH OPTIONS
.TP
\fB\-\-export\fR
Export the bundle (default) or import one
.TP
\fB\-\-output\fR \fI<FILE>\fR
Bundle path for export (default agent\-manager\-migrate.amx)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIBUNDLE\fR]
Bundle path to import
+25
View File
@@ -0,0 +1,25 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-models 1 "models "
.SH NAME
models \- List local models (ollama, llama.cpp, LM Studio) and prune unused ones
.SH SYNOPSIS
\fBmodels\fR [\fB\-\-prune\fR] [\fB\-\-dry\-run\fR] [\fB\-\-yes\fR] [\fB\-\-days\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
List local models (ollama, llama.cpp, LM Studio) and prune unused ones
.SH OPTIONS
.TP
\fB\-\-prune\fR
Purge unused models instead of listing them
.TP
\fB\-\-dry\-run\fR
Only list what would be pruned, delete nothing
.TP
\fB\-\-yes\fR
Answer yes to the deletion prompt
.TP
\fB\-\-days\fR \fI<DAYS>\fR
Consider a model unused after N days (default: 30)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-monitor 1 "monitor "
.SH NAME
monitor \- Real\-time monitor of the managed processes (issue #50)
.SH SYNOPSIS
\fBmonitor\fR [\fB\-\-interval\fR] [\fB\-\-json\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Real\-time monitor of the managed processes (issue #50)
.SH OPTIONS
.TP
\fB\-\-interval\fR \fI<SECONDS>\fR
Refresh interval in seconds (default 2)
.TP
\fB\-\-json\fR
Print one JSON document per tick instead of the TUI
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-note 1 "note "
.SH NAME
note \- Attach a free\-form note to an agent (shown in \*(Aqam info\*(Aq); \*(Aqam note <agent>\*(Aq without text prints the current note
.SH SYNOPSIS
\fBnote\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR> [\fITEXT...\fR]
.SH DESCRIPTION
Attach a free\-form note to an agent (shown in \*(Aqam info\*(Aq); \*(Aqam note <agent>\*(Aq without text prints the current note
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
.TP
[\fITEXT...\fR]
Note text (several words are joined); empty prints the note
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-open 1 "open "
.SH NAME
open \- Open an agent\*(Aqs installation directory in the file manager
.SH SYNOPSIS
\fBopen\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR>
.SH DESCRIPTION
Open an agent\*(Aqs installation directory in the file manager
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-playbook 1 "playbook "
.SH NAME
playbook \- Replay a saved playbook step by step with confirmation (issue #51)
.SH SYNOPSIS
\fBplaybook\fR [\fB\-\-var\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fIFILE\fR>
.SH DESCRIPTION
Replay a saved playbook step by step with confirmation (issue #51)
.SH OPTIONS
.TP
\fB\-\-var\fR \fI<NAME=VALUE>\fR
Variable values, repeatable: \-\-var name=value
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIFILE\fR>
Playbook file (state_dir/playbooks/ when a bare name is given)
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-plugins 1 "plugins "
.SH NAME
plugins \- List the event plugins and test one (issue #75)
.SH SYNOPSIS
\fBplugins\fR [\fB\-\-test\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
List the event plugins and test one (issue #75)
.SH OPTIONS
.TP
\fB\-\-test\fR \fI<NAME>\fR
Run one plugin against a synthetic event and print its response
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+23
View File
@@ -0,0 +1,23 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-profile 1 "profile "
.SH NAME
profile \- Manage environment profiles (dev, prod, ...)
.SH SYNOPSIS
\fBprofile\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIsubcommands\fR>
.SH DESCRIPTION
Manage environment profiles (dev, prod, ...)
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.SH SUBCOMMANDS
.TP
profile\-list(1)
List every defined profile
.TP
profile\-show(1)
Show one profile in detail (agent, env, args)
.TP
profile\-help(1)
Print this message or the help of the given subcommand(s)
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-projects 1 "projects "
.SH NAME
projects \- Show which agent works on which project
.SH SYNOPSIS
\fBprojects\fR [\fB\-h\fR|\fB\-\-help\fR] [\fINAME\fR]
.SH DESCRIPTION
Show which agent works on which project
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fINAME\fR]
Project name (omit to list every project)
+38
View File
@@ -0,0 +1,38 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-providers 1 "providers "
.SH NAME
providers \- Manage the LLM provider registry: base URLs, models, default provider
.SH SYNOPSIS
\fBproviders\fR [\fB\-h\fR|\fB\-\-help\fR] [\fIsubcommands\fR]
.SH DESCRIPTION
Manage the LLM provider registry: base URLs, models, default provider
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.SH SUBCOMMANDS
.TP
providers\-list(1)
List the registered providers (the default one is starred)
.TP
providers\-show(1)
Show one provider in detail (base URL, models, default model)
.TP
providers\-add(1)
Register a provider, or update an existing one
.TP
providers\-remove(1)
Remove a provider from the registry
.TP
providers\-set\-token(1)
Store the provider API token in the OS keyring (shared by every agent of this provider through the @secret cascade, issue #89)
.TP
providers\-token(1)
Check whether a provider token exists (the value is never shown)
.TP
providers\-default(1)
Set the default provider
.TP
providers\-help(1)
Print this message or the help of the given subcommand(s)
+29
View File
@@ -0,0 +1,29 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-registry 1 "registry "
.SH NAME
registry \- Community registry (issue #77): publish, search and install agent catalogs hosted on Gitea
.SH SYNOPSIS
\fBregistry\fR [\fB\-h\fR|\fB\-\-help\fR] [\fIsubcommands\fR]
.SH DESCRIPTION
Community registry (issue #77): publish, search and install agent catalogs hosted on Gitea
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.SH SUBCOMMANDS
.TP
registry\-publish(1)
Prepare a catalog + manifest (source, version, author, sha256) for publication on Gitea
.TP
registry\-search(1)
Search agents across the registered sources (settings.registry.sources)
.TP
registry\-install(1)
Install a catalog from the registry: manifest + checksum validation, then an explicit trust decision for unknown sources
.TP
registry\-list(1)
List the registered sources
.TP
registry\-help(1)
Print this message or the help of the given subcommand(s)
+22
View File
@@ -0,0 +1,22 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-report 1 "report "
.SH NAME
report \- Write a markdown activity report
.SH SYNOPSIS
\fBreport\fR [\fB\-\-last\-week\fR] [\fB\-\-last\-month\fR] [\fB\-\-output\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Write a markdown activity report
.SH OPTIONS
.TP
\fB\-\-last\-week\fR
Cover the last 7 days
.TP
\fB\-\-last\-month\fR
Cover the last 30 days
.TP
\fB\-\-output\fR \fI<FILE>\fR
Output file (default: report\-YYYYMMDD.md in the state directory)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+55
View File
@@ -0,0 +1,55 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-restart 1 "restart "
.SH NAME
restart \- Restart an agent: stop, then start with the same options
.SH SYNOPSIS
\fBrestart\fR [\fB\-b\fR|\fB\-\-background\fR] [\fB\-f\fR|\fB\-\-foreground\fR] [\fB\-\-args\fR] [\fB\-\-env\fR] [\fB\-\-notify\fR] [\fB\-\-profile\fR] [\fB\-\-model\fR] [\fB\-\-provider\fR] [\fB\-\-no\-sandbox\fR] [\fB\-\-parallel\fR] [\fB\-\-container\fR] [\fB\-\-force\fR] [\fB\-\-timeout\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fIAGENT\fR]
.SH DESCRIPTION
Restart an agent: stop, then start with the same options
.SH OPTIONS
.TP
\fB\-b\fR, \fB\-\-background\fR
Run detached in the background; output goes to the agent log file
.TP
\fB\-f\fR, \fB\-\-foreground\fR
Run in the foreground, attached to this terminal (the default)
.TP
\fB\-\-args\fR [\fI<ARGS>...\fR]
Extra arguments passed to the agent (repeatable; quoted strings are split on spaces)
.TP
\fB\-\-env\fR \fI<KEY=VALUE>\fR
Set an environment variable for the agent (repeatable): \-\-env KEY=VALUE
.TP
\fB\-\-notify\fR
Send a desktop notification once the agent has started
.TP
\fB\-\-profile\fR \fI<NAME>\fR
Apply an environment profile (env + args, defined in the config)
.TP
\fB\-\-model\fR \fI<MODEL>\fR
Local model to use for this run (validated against the local runtimes)
.TP
\fB\-\-provider\fR \fI<PROVIDER>\fR
Provider to use for this run (issue #92): resolved from the registry
.TP
\fB\-\-no\-sandbox\fR
Skip the agent\*(Aqs sandbox profile for this run (issue #79)
.TP
\fB\-\-parallel\fR
Start every member of a group simultaneously (issue #57)
.TP
\fB\-\-container\fR
Run the agent inside a container (issue #58)
.TP
\fB\-\-force\fR
Kill immediately instead of terminating gracefully
.TP
\fB\-\-timeout\fR \fI<SECS>\fR
Grace period in seconds before killing (default: from config, 5s)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIAGENT\fR]
Agent name, alias, or group:<name> (defaults to the project\*(Aqs default agent)
+31
View File
@@ -0,0 +1,31 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-run 1 "run "
.SH NAME
run \- Run the agent command directly with the given arguments (no process management)
.SH SYNOPSIS
\fBrun\fR [\fB\-\-model\fR] [\fB\-\-provider\fR] [\fB\-\-no\-sandbox\fR] [\fB\-\-container\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR> [\fIARGS...\fR]
.SH DESCRIPTION
Run the agent command directly with the given arguments (no process management)
.SH OPTIONS
.TP
\fB\-\-model\fR \fI<MODEL>\fR
Local model to use for this run (validated against the local runtimes)
.TP
\fB\-\-provider\fR \fI<PROVIDER>\fR
Provider to use for this run (issue #92): registry lookup, base_url + keyring token + model
.TP
\fB\-\-no\-sandbox\fR
Skip the agent\*(Aqs sandbox profile (issue #79)
.TP
\fB\-\-container\fR
Run the agent inside a container (issue #58)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
.TP
[\fIARGS...\fR]
Arguments passed through to the agent command
+29
View File
@@ -0,0 +1,29 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-schedule 1 "schedule "
.SH NAME
schedule \- Schedule am commands (issue #56)
.SH SYNOPSIS
\fBschedule\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIsubcommands\fR>
.SH DESCRIPTION
Schedule am commands (issue #56)
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.SH SUBCOMMANDS
.TP
schedule\-add(1)
Add a daily schedule (ex: \*(Aqam schedule add update \-\-all\*(Aq)
.TP
schedule\-list(1)
List the schedules
.TP
schedule\-remove(1)
Remove a schedule by id
.TP
schedule\-run(1)
Run a schedule now (invoked by the OS task, issue #56)
.TP
schedule\-help(1)
Print this message or the help of the given subcommand(s)
+22
View File
@@ -0,0 +1,22 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-search 1 "search "
.SH NAME
search \- Search the catalog by keyword (name, description, category, tags)
.SH SYNOPSIS
\fBsearch\fR [\fB\-\-category\fR] [\fB\-\-tag\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fIKEYWORD\fR]
.SH DESCRIPTION
Search the catalog by keyword (name, description, category, tags)
.SH OPTIONS
.TP
\fB\-\-category\fR \fI<CATEGORY>\fR
Restrict to this category
.TP
\fB\-\-tag\fR \fI<TAG>\fR
Only agents carrying this personal tag
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIKEYWORD\fR]
Keyword to search for (case\-insensitive substring)
+26
View File
@@ -0,0 +1,26 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-secret 1 "secret "
.SH NAME
secret \- Manage secrets in the OS keyring (never in plaintext config)
.SH SYNOPSIS
\fBsecret\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIsubcommands\fR>
.SH DESCRIPTION
Manage secrets in the OS keyring (never in plaintext config)
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.SH SUBCOMMANDS
.TP
secret\-set(1)
Store a secret for an agent (or a provider, issue #89)
.TP
secret\-unset(1)
Remove a secret
.TP
secret\-list(1)
List stored secret names (values are never shown)
.TP
secret\-help(1)
Print this message or the help of the given subcommand(s)
+15
View File
@@ -0,0 +1,15 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-self-uninstall 1 "self-uninstall "
.SH NAME
self\-uninstall \- Remove agent\-manager and everything it created from this machine
.SH SYNOPSIS
\fBself\-uninstall\fR [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Remove agent\-manager and everything it created from this machine
.PP
Stops every managed background agent, then deletes the data, state and configuration directories, and finally the executable itself. Combine with \-\-yes for a fully automated one\-liner.
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help (see a summary with \*(Aq\-h\*(Aq)
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-self-update 1 "self-update "
.SH NAME
self\-update \- Update agent\-manager itself from the latest release
.SH SYNOPSIS
\fBself\-update\fR [\fB\-\-check\fR] [\fB\-\-to\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Update agent\-manager itself from the latest release
.SH OPTIONS
.TP
\fB\-\-check\fR
Only check whether a newer version exists
.TP
\fB\-\-to\fR \fI<FILE>\fR
Download the new binary to this path instead of replacing the current one
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+25
View File
@@ -0,0 +1,25 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-serve 1 "serve "
.SH NAME
serve \- Authenticated HTTP + WebSocket API to drive am remotely (issue #80)
.SH SYNOPSIS
\fBserve\fR [\fB\-\-token\fR] [\fB\-\-host\fR] [\fB\-\-port\fR] [\fB\-\-rate\-limit\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Authenticated HTTP + WebSocket API to drive am remotely (issue #80)
.SH OPTIONS
.TP
\fB\-\-token\fR \fI<TOKEN>\fR
Bearer token required on every request (mandatory)
.TP
\fB\-\-host\fR \fI<HOST>\fR
Listen address (default 127.0.0.1)
.TP
\fB\-\-port\fR \fI<PORT>\fR
Listening port (default 8080)
.TP
\fB\-\-rate\-limit\fR \fI<N>\fR
Per\-IP request budget per minute (default 120)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+26
View File
@@ -0,0 +1,26 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-service 1 "service "
.SH NAME
service \- Register an agent as a system service (issue #55)
.SH SYNOPSIS
\fBservice\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIsubcommands\fR>
.SH DESCRIPTION
Register an agent as a system service (issue #55)
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.SH SUBCOMMANDS
.TP
service\-install(1)
Install the service unit (systemd / launchd / Task Scheduler)
.TP
service\-uninstall(1)
Remove the service unit
.TP
service\-status(1)
Show whether the service is installed
.TP
service\-help(1)
Print this message or the help of the given subcommand(s)
+37
View File
@@ -0,0 +1,37 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-sessions 1 "sessions "
.SH NAME
sessions \- List the sessions of every agent (and of the interactive shell)
.SH SYNOPSIS
\fBsessions\fR [\fB\-\-project\fR] [\fB\-\-status\fR] [\fB\-\-show\fR] [\fB\-\-resume\fR] [\fB\-\-export\fR] [\fB\-\-output\fR] [\fB\-\-retention\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fIAGENT\fR]
.SH DESCRIPTION
List the sessions of every agent (and of the interactive shell)
.SH OPTIONS
.TP
\fB\-\-project\fR \fI<PROJECT>\fR
Only sessions of this project
.TP
\fB\-\-status\fR \fI<STATUS>\fR
Only sessions with this status (running, stopped, failed, interrupted)
.TP
\fB\-\-show\fR \fI<ID>\fR
Show one session in detail (summary + log excerpt)
.TP
\fB\-\-resume\fR \fI<ID>\fR
Resume a finished session: relaunch the agent with its recorded arguments
.TP
\fB\-\-export\fR \fI<ID>\fR
Export one session (metadata, commands, log excerpt) to a JSON file
.TP
\fB\-\-output\fR \fI<FILE>\fR
Destination of the export (default: ./am\-session\-<ID>.json)
.TP
\fB\-\-retention\fR \fI<DAYS>\fR
Purge sessions finished more than N days ago (settings default 90)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIAGENT\fR]
Only sessions of this agent
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-setup 1 "setup "
.SH NAME
setup \- Onboarding wizard: provider, token, modèle par défaut, aichat, rôles copilot (épique v1.1.0)
.SH SYNOPSIS
\fBsetup\fR [\fB\-\-roles\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Onboarding wizard: provider, token, modèle par défaut, aichat, rôles copilot (épique v1.1.0)
.SH OPTIONS
.TP
\fB\-\-roles\fR
Only (re)generate the am\-* copilot roles for aichat
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+49
View File
@@ -0,0 +1,49 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-start 1 "start "
.SH NAME
start \- Start an agent (foreground by default, or detached with \-\-background)
.SH SYNOPSIS
\fBstart\fR [\fB\-b\fR|\fB\-\-background\fR] [\fB\-f\fR|\fB\-\-foreground\fR] [\fB\-\-args\fR] [\fB\-\-env\fR] [\fB\-\-notify\fR] [\fB\-\-profile\fR] [\fB\-\-model\fR] [\fB\-\-provider\fR] [\fB\-\-no\-sandbox\fR] [\fB\-\-parallel\fR] [\fB\-\-container\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fIAGENT\fR]
.SH DESCRIPTION
Start an agent (foreground by default, or detached with \-\-background)
.SH OPTIONS
.TP
\fB\-b\fR, \fB\-\-background\fR
Run detached in the background; output goes to the agent log file
.TP
\fB\-f\fR, \fB\-\-foreground\fR
Run in the foreground, attached to this terminal (the default)
.TP
\fB\-\-args\fR [\fI<ARGS>...\fR]
Extra arguments passed to the agent (repeatable; quoted strings are split on spaces)
.TP
\fB\-\-env\fR \fI<KEY=VALUE>\fR
Set an environment variable for the agent (repeatable): \-\-env KEY=VALUE
.TP
\fB\-\-notify\fR
Send a desktop notification once the agent has started
.TP
\fB\-\-profile\fR \fI<NAME>\fR
Apply an environment profile (env + args, defined in the config)
.TP
\fB\-\-model\fR \fI<MODEL>\fR
Local model to use for this run (validated against the local runtimes)
.TP
\fB\-\-provider\fR \fI<PROVIDER>\fR
Provider to use for this run (issue #92): resolved from the registry
.TP
\fB\-\-no\-sandbox\fR
Skip the agent\*(Aqs sandbox profile for this run (issue #79)
.TP
\fB\-\-parallel\fR
Start every member of a group simultaneously (issue #57)
.TP
\fB\-\-container\fR
Run the agent inside a container (issue #58)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIAGENT\fR]
Agent name, alias, or group:<name> (defaults to the project\*(Aqs default agent)
+22
View File
@@ -0,0 +1,22 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-stats 1 "stats "
.SH NAME
stats \- Show usage statistics computed from the event journal
.SH SYNOPSIS
\fBstats\fR [\fB\-\-period\fR] [\fB\-\-costs\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fIAGENT\fR]
.SH DESCRIPTION
Show usage statistics computed from the event journal
.SH OPTIONS
.TP
\fB\-\-period\fR \fI<PERIOD>\fR
Only events of the last period (7d, 30d, 90d, all)
.TP
\fB\-\-costs\fR
Show token usage and estimated spend per agent (issue #49)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIAGENT\fR]
Agent name or alias (omit for the global view)
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-status 1 "status "
.SH NAME
status \- Show the state of one agent, or of every installed agent
.SH SYNOPSIS
\fBstatus\fR [\fB\-h\fR|\fB\-\-help\fR] [\fIAGENT\fR]
.SH DESCRIPTION
Show the state of one agent, or of every installed agent
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIAGENT\fR]
Agent name or alias (omit to show all installed agents)
+22
View File
@@ -0,0 +1,22 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-stop 1 "stop "
.SH NAME
stop \- Stop a background agent (SIGTERM, then SIGKILL after the timeout)
.SH SYNOPSIS
\fBstop\fR [\fB\-\-force\fR] [\fB\-\-timeout\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR>
.SH DESCRIPTION
Stop a background agent (SIGTERM, then SIGKILL after the timeout)
.SH OPTIONS
.TP
\fB\-\-force\fR
Kill immediately instead of terminating gracefully
.TP
\fB\-\-timeout\fR \fI<SECS>\fR
Grace period in seconds before killing (default: from config, 5s)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name, alias, or group:<name>
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-suggest 1 "suggest "
.SH NAME
suggest \- Suggest agents matching a query, boosted by real usage (issue #61)
.SH SYNOPSIS
\fBsuggest\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIQUERY\fR>
.SH DESCRIPTION
Suggest agents matching a query, boosted by real usage (issue #61)
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIQUERY\fR>
Free\-form request ("un agent pour du Python")
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-sync 1 "sync "
.SH NAME
sync \- Push the state into the configured git repository (issue #66)
.SH SYNOPSIS
\fBsync\fR [\fB\-\-message\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Push the state into the configured git repository (issue #66)
.SH OPTIONS
.TP
\fB\-\-message\fR \fI<MESSAGE>\fR
Commit message (default: "am sync — state update")
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-tag 1 "tag "
.SH NAME
tag \- Add a personal tag to an agent
.SH SYNOPSIS
\fBtag\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR> <\fITAG\fR>
.SH DESCRIPTION
Add a personal tag to an agent
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
.TP
<\fITAG\fR>
One or more tags to add
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-tags 1 "tags "
.SH NAME
tags \- List personal tags (with counts), optionally for one agent
.SH SYNOPSIS
\fBtags\fR [\fB\-h\fR|\fB\-\-help\fR] [\fIAGENT\fR]
.SH DESCRIPTION
List personal tags (with counts), optionally for one agent
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIAGENT\fR]
Only show the tags of this agent
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-theme 1 "theme "
.SH NAME
theme \- Set or show the active color theme (persisted for the next run)
.SH SYNOPSIS
\fBtheme\fR [\fB\-h\fR|\fB\-\-help\fR] [\fINAME\fR]
.SH DESCRIPTION
Set or show the active color theme (persisted for the next run)
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fINAME\fR]
Theme name (omit to list available themes)
+25
View File
@@ -0,0 +1,25 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-timeline 1 "timeline "
.SH NAME
timeline \- One chronological view of every activity (journal + REPL history)
.SH SYNOPSIS
\fBtimeline\fR [\fB\-\-project\fR] [\fB\-\-since\fR] [\fB\-\-limit\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fIAGENT\fR]
.SH DESCRIPTION
One chronological view of every activity (journal + REPL history)
.SH OPTIONS
.TP
\fB\-\-project\fR \fI<PROJECT>\fR
Only activity of this project
.TP
\fB\-\-since\fR \fI<DATE>\fR
Only activity at or after this date (YYYY\-MM\-DD or RFC 3339)
.TP
\fB\-\-limit\fR \fI<N>\fR [default: 50]
Maximum number of entries (default: 50)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIAGENT\fR]
Only activity of this agent
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-tip 1 "tip "
.SH NAME
tip \- Cheat sheet: the most useful commands, their key options, your most\-used commands and a rotating tip of the day
.SH SYNOPSIS
\fBtip\fR [\fB\-\-random\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Cheat sheet: the most useful commands, their key options, your most\-used commands and a rotating tip of the day
.SH OPTIONS
.TP
\fB\-\-random\fR
Show a single random tip instead of the whole page
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-top 1 "top "
.SH NAME
top \- Show the most used agents (top 10)
.SH SYNOPSIS
\fBtop\fR [\fB\-\-period\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Show the most used agents (top 10)
.SH OPTIONS
.TP
\fB\-\-period\fR \fI<PERIOD>\fR
Only events of the last period (7d, 30d, 90d, all)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+16
View File
@@ -0,0 +1,16 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-unfavorite 1 "unfavorite "
.SH NAME
unfavorite \- Remove the favorite star from an agent
.SH SYNOPSIS
\fBunfavorite\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR>
.SH DESCRIPTION
Remove the favorite star from an agent
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-uninstall 1 "uninstall "
.SH NAME
uninstall \- Uninstall an agent (managed or external) and clean its files
.SH SYNOPSIS
\fBuninstall\fR [\fB\-\-purge\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR>
.SH DESCRIPTION
Uninstall an agent (managed or external) and clean its files
.SH OPTIONS
.TP
\fB\-\-purge\fR
Also remove logs and the agent entry from the user config file
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-untag 1 "untag "
.SH NAME
untag \- Remove a personal tag from an agent
.SH SYNOPSIS
\fBuntag\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR> <\fITAG\fR>
.SH DESCRIPTION
Remove a personal tag from an agent
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
.TP
<\fITAG\fR>
Tag to remove
+22
View File
@@ -0,0 +1,22 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-update 1 "update "
.SH NAME
update \- Update an installed agent to the latest available version
.SH SYNOPSIS
\fBupdate\fR [\fB\-\-all\fR] [\fB\-\-rollback\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fIAGENT\fR]
.SH DESCRIPTION
Update an installed agent to the latest available version
.SH OPTIONS
.TP
\fB\-\-all\fR
Update every installed managed agent
.TP
\fB\-\-rollback\fR [\fI<ROLLBACK>\fR]
Roll back to a pre\-update backup instead of updating ("latest" or a backup id; "\-\-rollback list" shows them)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fIAGENT\fR]
Agent name or alias (required unless \-\-all)
+13
View File
@@ -0,0 +1,13 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-version 1 "version "
.SH NAME
version \- Display version and build information
.SH SYNOPSIS
\fBversion\fR [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Display version and build information
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+25
View File
@@ -0,0 +1,25 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-watch 1 "watch "
.SH NAME
watch \- Supervise an agent and optionally restart it on crash
.SH SYNOPSIS
\fBwatch\fR [\fB\-\-restart\fR] [\fB\-\-notify\fR] [\fB\-\-interval\fR] [\fB\-h\fR|\fB\-\-help\fR] <\fIAGENT\fR>
.SH DESCRIPTION
Supervise an agent and optionally restart it on crash
.SH OPTIONS
.TP
\fB\-\-restart\fR
Restart the agent automatically when it dies (with backoff)
.TP
\fB\-\-notify\fR
Desktop notification on every restart
.TP
\fB\-\-interval\fR \fI<SECS>\fR [default: 5]
Check interval in seconds (default: 5)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
<\fIAGENT\fR>
Agent name or alias
+19
View File
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am-web 1 "web "
.SH NAME
web \- Local read\-only web dashboard with charts (issue #54)
.SH SYNOPSIS
\fBweb\fR [\fB\-\-port\fR] [\fB\-\-no\-open\fR] [\fB\-h\fR|\fB\-\-help\fR]
.SH DESCRIPTION
Local read\-only web dashboard with charts (issue #54)
.SH OPTIONS
.TP
\fB\-\-port\fR \fI<PORT>\fR
Port to listen on (default 7878)
.TP
\fB\-\-no\-open\fR
Do not open the browser automatically
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
+253
View File
@@ -0,0 +1,253 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH am 1 "am 1.1.9"
.SH NAME
am \- agent\-manager (am) — manage local AI coding agents
.SH SYNOPSIS
\fBam\fR [\fB\-c\fR|\fB\-\-config\fR] [\fB\-v\fR|\fB\-\-verbose\fR] [\fB\-q\fR|\fB\-\-quiet\fR] [\fB\-y\fR|\fB\-\-yes\fR] [\fB\-\-dry\-run\fR] [\fB\-\-json\fR] [\fB\-\-no\-color\fR] [\fB\-\-theme\fR] [\fB\-\-lang\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] [\fIsubcommands\fR]
.SH DESCRIPTION
agent\-manager (am) — a CLI to manage local AI coding agents.
.PP
Install, uninstall, start, stop, restart and update AI agents from a YAML
catalog. Handles dependencies (Node, Python, Go, Rust, Bun), binaries from
GitHub Releases, install scripts, and git repositories. All state lives under
your user directories; nothing pollutes the system.
.SH OPTIONS
.TP
\fB\-c\fR, \fB\-\-config\fR \fI<FILE>\fR
Use an alternate configuration file
.TP
\fB\-v\fR, \fB\-\-verbose\fR
Verbose output: show every command executed and its details
.TP
\fB\-q\fR, \fB\-\-quiet\fR
Quiet mode: only errors are printed
.TP
\fB\-y\fR, \fB\-\-yes\fR
Answer yes to every confirmation prompt
.TP
\fB\-\-dry\-run\fR
Simulate the action without changing anything
.TP
\fB\-\-json\fR
Emit machine\-readable JSON on stdout (for scripts)
.TP
\fB\-\-no\-color\fR
Disable ANSI colors
.TP
\fB\-\-theme\fR \fI<THEME>\fR
Color theme for the output (see \*(Aqam help theme\*(Aq for the list)
.TP
\fB\-\-lang\fR \fI<LANG>\fR
Output language: fr (default) or en (issue #74)
.br
.br
\fIPossible values:\fR
.RS 14
.IP \(bu 2
fr
.IP \(bu 2
en
.RE
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help (see a summary with \*(Aq\-h\*(Aq)
.TP
\fB\-V\fR, \fB\-\-version\fR
Print version
.SH SUBCOMMANDS
.TP
am\-list(1)
List installed agents (default); use \-\-all for the whole catalog
.TP
am\-logs(1)
Tail the log file of an agent (\-\-follow for a live view)
.TP
am\-open(1)
Open an agent\*(Aqs installation directory in the file manager
.TP
am\-watch(1)
Supervise an agent and optionally restart it on crash
.TP
am\-dashboard(1)
Live TUI dashboard: overview, activity, stats, sessions, projects
.TP
am\-favorite(1)
Mark an agent as a favorite (star in list and status)
.TP
am\-unfavorite(1)
Remove the favorite star from an agent
.TP
am\-note(1)
Attach a free\-form note to an agent (shown in \*(Aqam info\*(Aq); \*(Aqam note <agent>\*(Aq without text prints the current note
.TP
am\-tag(1)
Add a personal tag to an agent
.TP
am\-untag(1)
Remove a personal tag from an agent
.TP
am\-tags(1)
List personal tags (with counts), optionally for one agent
.TP
am\-profile(1)
Manage environment profiles (dev, prod, ...)
.TP
am\-man(1)
Generate a man page for am (or for one command)
.TP
am\-theme(1)
Set or show the active color theme (persisted for the next run)
.TP
am\-alias(1)
Manage command aliases (cc \-> claude\-code)
.TP
am\-secret(1)
Manage secrets in the OS keyring (never in plaintext config)
.TP
am\-audit(1)
Audit the configuration: who changed what, when (issue #63)
.TP
am\-service(1)
Register an agent as a system service (issue #55)
.TP
am\-schedule(1)
Schedule am commands (issue #56)
.TP
am\-models(1)
List local models (ollama, llama.cpp, LM Studio) and prune unused ones
.TP
am\-registry(1)
Community registry (issue #77): publish, search and install agent catalogs hosted on Gitea
.TP
am\-catalog(1)
Manage remote catalogs: update the official one, add external ones
.TP
am\-providers(1)
Manage the LLM provider registry: base URLs, models, default provider
.TP
am\-suggest(1)
Suggest agents matching a query, boosted by real usage (issue #61)
.TP
am\-ask(1)
Ask a natural\-language request and get the matching am command(s) (issue #78): local rules first, optional LLM refinement, confirmation before execution
.TP
am\-ai(1)
Langage naturel → action shell via AIChat (issues #96 #97); alias: shell
.TP
am\-setup(1)
Onboarding wizard: provider, token, modèle par défaut, aichat, rôles copilot (épique v1.1.0)
.TP
am\-start(1)
Start an agent (foreground by default, or detached with \-\-background)
.TP
am\-stop(1)
Stop a background agent (SIGTERM, then SIGKILL after the timeout)
.TP
am\-restart(1)
Restart an agent: stop, then start with the same options
.TP
am\-status(1)
Show the state of one agent, or of every installed agent
.TP
am\-sessions(1)
List the sessions of every agent (and of the interactive shell)
.TP
am\-stats(1)
Show usage statistics computed from the event journal
.TP
am\-monitor(1)
Real\-time monitor of the managed processes (issue #50)
.TP
am\-web(1)
Local read\-only web dashboard with charts (issue #54)
.TP
am\-serve(1)
Authenticated HTTP + WebSocket API to drive am remotely (issue #80)
.TP
am\-sync(1)
Push the state into the configured git repository (issue #66)
.TP
am\-migrate(1)
Transfer the installation and state to another machine (issue #68)
.TP
am\-top(1)
Show the most used agents (top 10)
.TP
am\-report(1)
Write a markdown activity report
.TP
am\-projects(1)
Show which agent works on which project
.TP
am\-timeline(1)
One chronological view of every activity (journal + REPL history)
.TP
am\-log(1)
Read the event journal: everything am did
.TP
am\-install(1)
Install an agent and its dependencies
.TP
am\-uninstall(1)
Uninstall an agent (managed or external) and clean its files
.TP
am\-update(1)
Update an installed agent to the latest available version
.TP
am\-search(1)
Search the catalog by keyword (name, description, category, tags)
.TP
am\-history(1)
Search the command history (am and shell commands)
.TP
am\-playbook(1)
Replay a saved playbook step by step with confirmation (issue #51)
.TP
am\-lab(1)
Benchmark: run the same task on several agents and compare (issue #62)
.TP
am\-plugins(1)
List the event plugins and test one (issue #75)
.TP
am\-info(1)
Show detailed information about one agent
.TP
am\-init(1)
Generate a local agent\-manager.yaml for the current directory
.TP
am\-help(1)
Display help: the overview, a command, the command list, or a search
.TP
am\-version(1)
Display version and build information
.TP
am\-tip(1)
Cheat sheet: the most useful commands, their key options, your most\-used commands and a rotating tip of the day
.TP
am\-config(1)
Manage the configuration file
.TP
am\-doctor(1)
Check the environment: tools, config validity, paths, permissions
.TP
am\-run(1)
Run the agent command directly with the given arguments (no process management)
.TP
am\-completion(1)
Generate a shell completion script
.TP
am\-self\-update(1)
Update agent\-manager itself from the latest release
.TP
am\-self\-uninstall(1)
Remove agent\-manager and everything it created from this machine
.TP
am\-export(1)
Export the configuration and installation state (backup)
.TP
am\-import(1)
Import a previously exported configuration and state
.SH VERSION
v1.1.9
+33
View File
@@ -0,0 +1,33 @@
#!/bin/sh
# Builds an am_<version>_amd64.deb from dist/am-linux-x86_64.
# Usage: packaging/deb/make-deb.sh <version> [arch]
set -e
VERSION="$1"
ARCH="${2:-amd64}"
ROOT="$(mktemp -d)"
PKG="am_${VERSION}_${ARCH}"
mkdir -p "$ROOT/$PKG/usr/bin" "$ROOT/$PKG/usr/share/doc/am" "$ROOT/$PKG/DEBIAN"
cp dist/am-linux-x86_64 "$ROOT/$PKG/usr/bin/am"
chmod 755 "$ROOT/$PKG/usr/bin/am"
cat > "$ROOT/$PKG/DEBIAN/control" <<EOF
Package: am
Version: $VERSION
Section: utils
Priority: optional
Architecture: $ARCH
Maintainer: bruno <[email protected]>
Description: Manage local AI coding agents
List, install, start, stop and update local AI coding agents with
automatic dependency handling and a YAML-driven catalog.
EOF
cat > "$ROOT/$PKG/usr/share/doc/am/copyright" <<EOF
Copyright (c) 2026 bruno
License: MIT
EOF
dpkg-deb --build --root-owner-group "$ROOT/$PKG" "dist/$PKG.deb"
rm -rf "$ROOT"
echo "built dist/$PKG.deb"
+36
View File
@@ -0,0 +1,36 @@
# Homebrew formula - pour un tap local, ou a soumettre a homebrew/core.
# Rendu : scripts/render-manifests.ps1 (remplace {{VERSION}} et les sha256).
class Am < Formula
desc "Manage local AI coding agents: list, install, start, stop, update"
homepage "https://git.dracodev.net/Projets/agent-manager"
license "MIT"
version "{{VERSION}}"
on_macos do
if Hardware::CPU.arm?
url "https://git.dracodev.net/Projets/agent-manager/releases/download/v{{VERSION}}/am-macos-aarch64.tar.gz"
sha256 "{{SHA256_MACOS_AARCH64}}"
else
url "https://git.dracodev.net/Projets/agent-manager/releases/download/v{{VERSION}}/am-macos-x86_64.tar.gz"
sha256 "{{SHA256_MACOS_X86_64}}"
end
end
on_linux do
if Hardware::CPU.arm?
url "https://git.dracodev.net/Projets/agent-manager/releases/download/v{{VERSION}}/am-linux-aarch64.tar.gz"
sha256 "{{SHA256_LINUX_AARCH64}}"
else
url "https://git.dracodev.net/Projets/agent-manager/releases/download/v{{VERSION}}/am-linux-x86_64.tar.gz"
sha256 "{{SHA256_LINUX_X86_64}}"
end
end
def install
bin.install "am"
end
test do
system bin/"am", "version"
end
end
+26
View File
@@ -0,0 +1,26 @@
# RPM spec - build avec: rpmbuild -bb packaging/rpm/am.spec
# (rendu par scripts/render-manifests.ps1: %%{VERSION} -> version)
Name: am
Version: {{VERSION}}
Release: 1%{?dist}
Summary: Manage local AI coding agents
License: MIT
URL: https://git.dracodev.net/Projets/agent-manager
Source0: am-linux-x86_64.tar.gz
%description
am lists, installs, starts, stops and updates local AI coding agents
(Claude Code, Codex, Aider, ...) with automatic dependency handling and a
YAML-driven catalog.
%prep
%setup -c -T
tar -xzf %{SOURCE0}
%install
install -Dm755 am %{buildroot}%{_bindir}/am
%files
%{_bindir}/am
%changelog
+24
View File
@@ -0,0 +1,24 @@
{
"version": "{{VERSION}}",
"description": "Manage local AI coding agents: list, install, start, stop, update - with automatic dependency handling and a YAML-driven catalog.",
"homepage": "https://git.dracodev.net/Projets/agent-manager",
"license": "MIT",
"architecture": {
"64bit": {
"url": "https://git.dracodev.net/Projets/agent-manager/releases/download/v{{VERSION}}/am-windows-x86_64.zip",
"hash": "{{SHA256_WINDOWS}}"
}
},
"bin": "am.exe",
"checkver": {
"url": "https://git.dracodev.net/api/v1/repos/Projets/agent-manager/releases/latest",
"regex": "tag_name\":\s*\"v([\d.]+)\""
},
"autoupdate": {
"architecture": {
"64bit": {
"url": "https://git.dracodev.net/Projets/agent-manager/releases/download/v$version/am-windows-x86_64.zip"
}
}
}
}
@@ -0,0 +1,16 @@
# Winget manifest (version 1.6) - submit to microsoft/winget-pkgs
# Rendering: scripts/render-manifests.ps1
PackageIdentifier: BrunoDracodev.AgentManager
PackageVersion: {{VERSION}}
MinimumOSVersion: 10.0.0.0
InstallerType: zip
Installers:
- Architecture: x64
InstallerUrl: https://git.dracodev.net/Projets/agent-manager/releases/download/v{{VERSION}}/am-windows-x86_64.zip
InstallerSha256: {{SHA256_WINDOWS}}
NestedInstallerType: portable
NestedInstallerFiles:
- RelativeFilePath: am.exe
PortableCommandAlias: am
ManifestType: installer
ManifestVersion: 1.6.0
@@ -0,0 +1,18 @@
# Winget locale manifest - submit to microsoft/winget-pkgs
PackageIdentifier: BrunoDracodev.AgentManager
PackageVersion: {{VERSION}}
PackageLocale: en-US
Publisher: bruno (dracodev)
PackageName: agent-manager (am)
PackageUrl: https://git.dracodev.net/Projets/agent-manager
License: MIT
ShortDescription: Manage local AI coding agents - list, install, start, stop, update - with automatic dependency handling.
Moniker: am
Tags:
- agent
- claude
- cli
- coding
- llm
ManifestType: defaultLocale
ManifestVersion: 1.6.0
+6
View File
@@ -0,0 +1,6 @@
# Winget version manifest - submit to microsoft/winget-pkgs
PackageIdentifier: BrunoDracodev.AgentManager
PackageVersion: {{VERSION}}
DefaultLocale: en-US
ManifestType: version
ManifestVersion: 1.6.0
+29
View File
@@ -0,0 +1,29 @@
# Builds the release artefacts for the current platform (Windows):
# target/release/am.exe -> dist/am-windows-x86_64.zip
# Also prints the sha256 of every archive (for the packaging manifests).
param([switch]$NoTest)
$ErrorActionPreference = "Stop"
cargo build --release --locked
if (-not $NoTest) { cargo test --release --locked }
New-Item -ItemType Directory -Force dist | Out-Null
$zip = "dist/am-windows-x86_64.zip"
Remove-Item $zip -ErrorAction SilentlyContinue
Compress-Archive -Path target/release/am.exe -DestinationPath $zip
function Get-Sha256Net([string]$path) {
$stream = [System.IO.File]::OpenRead($path)
try {
$sha = [System.Security.Cryptography.SHA256]::Create()
$bytes = $sha.ComputeHash($stream)
return ([BitConverter]::ToString($bytes) -replace '-', '').ToLower()
} finally { $stream.Close() }
}
Write-Host ""
Write-Host "Artefacts:"
Get-ChildItem dist -File | ForEach-Object {
$hash = Get-Sha256Net $_.FullName
Write-Host (" {0,-32} {1} sha256:{2}" -f $_.Name, $_.Length, $hash)
}
+50
View File
@@ -0,0 +1,50 @@
# Renders the packaging templates (scoop, winget, homebrew, rpm) with the
# version and the sha256 of every release archive.
# Usage: scripts/render-manifests.ps1 -Version 0.4.3 [-DistDir dist]
param(
[Parameter(Mandatory = $true)][string]$Version,
[string]$DistDir = "dist"
)
$ErrorActionPreference = "Stop"
function Get-Sha([string]$file) {
$p = Join-Path $DistDir $file
if (-not (Test-Path $p)) {
Write-Warning "missing $p - placeholder 0000... (build it or wait for the CI runner)"
return "0000000000000000000000000000000000000000000000000000000000000000"
}
(Get-FileHash $p -Algorithm SHA256).Hash.ToLower()
}
$vars = [ordered]@{
"{{VERSION}}" = $Version
"{{SHA256_WINDOWS}}" = Get-Sha "am-windows-x86_64.zip"
"{{SHA256_LINUX_X86_64}}" = Get-Sha "am-linux-x86_64.tar.gz"
"{{SHA256_LINUX_AARCH64}}" = Get-Sha "am-linux-aarch64.tar.gz"
"{{SHA256_MACOS_X86_64}}" = Get-Sha "am-macos-x86_64.tar.gz"
"{{SHA256_MACOS_AARCH64}}" = Get-Sha "am-macos-aarch64.tar.gz"
}
$targets = @(
@{ Src = "packaging/scoop/am.json"; Dst = "dist/scoop/am.json" },
@{ Src = "packaging/winget/agent-manager.installer.yaml"; Dst = "dist/winget/agent-manager.installer.yaml" },
@{ Src = "packaging/winget/agent-manager.locale.en-US.yaml"; Dst = "dist/winget/agent-manager.locale.en-US.yaml" },
@{ Src = "packaging/winget/agent-manager.yaml"; Dst = "dist/winget/agent-manager.yaml" },
@{ Src = "packaging/homebrew/am.rb"; Dst = "dist/homebrew/am.rb" },
@{ Src = "packaging/rpm/am.spec"; Dst = "dist/rpm/am.spec" }
)
foreach ($t in $targets) {
$text = Get-Content $t.Src -Raw
foreach ($k in $vars.Keys) { $text = $text.Replace($k, $vars[$k]) }
New-Item -ItemType Directory -Force (Split-Path $t.Dst) | Out-Null
Set-Content -Path $t.Dst -Value $text -NoNewline -Encoding utf8
Write-Host "rendered $($t.Dst)"
}
Write-Host ""
Write-Host "Manifests rendus dans dist/. Puis :"
Write-Host " - scoop : scoop install dist/scoop/am.json (ou ajoutez-le a votre bucket)"
Write-Host " - winget : soumettez dist/winget/*.yaml a microsoft/winget-pkgs"
Write-Host " - homebrew : servez dist/homebrew/am.rb via un tap, ou soumettez a homebrew/core"
Write-Host " - rpm : copiez dist/rpm/am.spec + dist/am-linux-x86_64.tar.gz dans ~/rpmbuild/{SPECS,SOURCES} puis rpmbuild -bb"
Write-Host " - deb : packaging/deb/make-deb.sh $Version"
+298
View File
@@ -0,0 +1,298 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>am web — Cockpit sombre (mockup)</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg:#0b0f14; --panel:#121821; --panel2:#0f151c; --border:#1d2733;
--fg:#e6edf3; --muted:#8b98a5; --accent:#3ddc97; --accent2:#38bdf8;
--ok:#34d399; --warn:#f59e0b; --err:#f87171; --purple:#a78bfa;
}
body {
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
background:var(--bg); color:var(--fg); line-height:1.5; font-size:14px;
}
.layout { display:flex; min-height:100vh; }
/* ---------- Sidebar ---------- */
.side {
width:225px; flex-shrink:0; background:var(--panel2);
border-right:1px solid var(--border); padding:18px 12px;
display:flex; flex-direction:column; gap:4px; position:sticky; top:0; height:100vh;
}
.logo { display:flex; align-items:center; gap:10px; padding:4px 8px 18px; }
.logo-badge {
width:34px; height:34px; border-radius:9px; background:linear-gradient(135deg,#3ddc97,#38bdf8);
display:flex; align-items:center; justify-content:center; font-weight:800; font-size:16px; color:#0b0f14;
}
.logo b { font-size:16px; letter-spacing:.5px; }
.logo small { display:block; color:var(--muted); font-size:11px; font-weight:400; }
.nav-item {
display:flex; align-items:center; gap:10px; padding:9px 10px; border-radius:8px;
color:var(--muted); cursor:pointer; border:1px solid transparent; font-size:13.5px;
}
.nav-item:hover { background:rgba(61,220,151,.07); color:var(--fg); }
.nav-item.active { background:rgba(61,220,151,.12); color:var(--accent); border-color:rgba(61,220,151,.25); font-weight:600; }
.nav-item .ico { width:18px; text-align:center; }
.side-foot { margin-top:auto; padding:12px 8px 4px; border-top:1px solid var(--border); color:var(--muted); font-size:11.5px; }
.side-foot .dot { display:inline-block; width:8px; height:8px; border-radius:50%; background:var(--ok); margin-right:6px; }
/* ---------- Main ---------- */
.main { flex:1; padding:22px 28px 40px; max-width:1200px; }
.topbar { display:flex; align-items:center; justify-content:space-between; margin-bottom:22px; gap:12px; flex-wrap:wrap; }
.topbar h1 { font-size:20px; font-weight:700; }
.topbar .sub { color:var(--muted); font-size:12.5px; margin-top:2px; }
.top-actions { display:flex; align-items:center; gap:10px; }
.badge {
font-size:11.5px; padding:4px 10px; border-radius:99px; border:1px solid var(--border);
color:var(--muted); background:var(--panel); font-family:ui-monospace,Consolas,monospace;
}
.badge.live { color:var(--ok); border-color:rgba(52,211,153,.4); }
.badge.live::before { content:"● "; }
.btn {
background:var(--accent); color:#0b0f14; border:none; border-radius:8px; padding:7px 14px;
font-weight:700; font-size:13px; cursor:pointer;
}
.btn:hover { filter:brightness(1.1); }
.btn.ghost { background:transparent; color:var(--muted); border:1px solid var(--border); font-weight:500; }
.btn.ghost:hover { color:var(--fg); border-color:var(--muted); }
/* ---------- KPI cards ---------- */
.kpis { display:grid; grid-template-columns:repeat(4,1fr); gap:14px; margin-bottom:18px; }
.kpi { background:var(--panel); border:1px solid var(--border); border-radius:12px; padding:16px 18px; }
.kpi .label { color:var(--muted); font-size:12px; text-transform:uppercase; letter-spacing:.6px; }
.kpi .value { font-size:28px; font-weight:800; margin-top:6px; }
.kpi .delta { font-size:11.5px; margin-top:4px; }
.kpi .delta.up { color:var(--ok); } .kpi .delta.down { color:var(--err); }
.kpi .emoji { float:right; font-size:20px; opacity:.9; }
/* ---------- Panels ---------- */
.grid2 { display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-bottom:18px; }
.panel { background:var(--panel); border:1px solid var(--border); border-radius:12px; padding:16px 18px; }
.panel h3 { font-size:13px; text-transform:uppercase; letter-spacing:.6px; color:var(--muted); margin-bottom:14px; }
/* bars */
.bar-row { display:flex; align-items:center; gap:10px; margin-bottom:9px; font-size:12.5px; }
.bar-row .name { width:110px; color:var(--fg); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.bar-row .track { flex:1; height:14px; background:var(--panel2); border-radius:7px; overflow:hidden; }
.bar-row .fill { height:100%; border-radius:7px; background:linear-gradient(90deg,var(--accent),var(--accent2)); }
.bar-row .val { width:34px; text-align:right; color:var(--muted); font-family:ui-monospace,monospace; }
/* trend svg */
.trend-wrap { position:relative; }
.trend-axis { display:flex; justify-content:space-between; color:var(--muted); font-size:10.5px; margin-top:4px; font-family:ui-monospace,monospace; }
/* tables */
table { width:100%; border-collapse:collapse; font-size:12.5px; }
th { text-align:left; color:var(--muted); font-weight:600; font-size:11px; text-transform:uppercase; letter-spacing:.5px; padding:7px 10px; border-bottom:1px solid var(--border); }
td { padding:8px 10px; border-bottom:1px solid rgba(29,39,51,.5); }
tbody tr:hover { background:rgba(61,220,151,.05); }
.pill { font-size:10.5px; padding:2px 8px; border-radius:99px; font-weight:600; }
.pill.ok { background:rgba(52,211,153,.14); color:var(--ok); }
.pill.run { background:rgba(56,189,248,.14); color:var(--accent2); }
.pill.fail { background:rgba(248,113,113,.14); color:var(--err); }
.pill.mut { background:rgba(167,139,250,.14); color:var(--purple); }
.mono { font-family:ui-monospace,Consolas,monospace; font-size:11.5px; color:var(--muted); }
.search { width:100%; background:var(--panel2); border:1px solid var(--border); border-radius:8px; color:var(--fg); padding:8px 12px; font-size:12.5px; margin-bottom:10px; }
.search:focus { outline:none; border-color:var(--accent); }
/* timeline */
.tl { list-style:none; }
.tl li { display:flex; gap:12px; padding:8px 0; border-bottom:1px solid rgba(29,39,51,.5); align-items:baseline; }
.tl .dot { width:8px; height:8px; border-radius:50%; margin-top:6px; flex-shrink:0; }
.tl .t { color:var(--fg); } .tl .a { color:var(--accent); font-weight:600; }
.tl .m { color:var(--muted); font-size:11.5px; margin-left:auto; white-space:nowrap; font-family:ui-monospace,monospace; }
.empty-note { color:var(--muted); font-size:12px; text-align:center; padding:18px 0; }
.panel.hidden, .view { display:none; } .view.active { display:block; }
@media (max-width:900px){ .kpis{grid-template-columns:repeat(2,1fr);} .grid2{grid-template-columns:1fr;} .side{width:64px;} .side .lbl,.logo small,.side-foot span{display:none;} }
</style>
</head>
<body>
<div class="layout">
<aside class="side">
<div class="logo">
<div class="logo-badge">am</div>
<div><b>agent-manager</b><small>cockpit des agents</small></div>
</div>
<div class="nav-item active" data-view="overview"><span class="ico">▦</span><span class="lbl">Vue d'ensemble</span></div>
<div class="nav-item" data-view="stats"><span class="ico">📊</span><span class="lbl">Statistiques</span></div>
<div class="nav-item" data-view="sessions"><span class="ico">⏱</span><span class="lbl">Sessions</span></div>
<div class="nav-item" data-view="events"><span class="ico">📜</span><span class="lbl">Événements</span></div>
<div class="nav-item" data-view="projects"><span class="ico">🗂</span><span class="lbl">Projets</span></div>
<div class="side-foot">
<span><span class="dot"></span>v0.6.0 · lang FR ·<br>127.0.0.1:7878</span>
</div>
</aside>
<main class="main">
<div class="topbar">
<div>
<h1 id="view-title">Vue d'ensemble</h1>
<div class="sub" id="last-update">Dernière mise à jour : il y a 5 s</div>
</div>
<div class="top-actions">
<span class="badge live">serveur local</span>
<span class="badge">127.0.0.1:7878</span>
<button class="btn ghost" onclick="fakeRefresh()">↻ Actualiser</button>
</div>
</div>
<!-- ===== OVERVIEW ===== -->
<section class="view active" id="overview">
<div class="kpis">
<div class="kpi"><span class="emoji">🤖</span><div class="label">Agents installés</div><div class="value">9</div><div class="delta up">▲ +1 cette semaine</div></div>
<div class="kpi"><span class="emoji">⚡</span><div class="label">En cours</div><div class="value">2</div><div class="delta up">● claude-code · codex</div></div>
<div class="kpi"><span class="emoji">⏱</span><div class="label">Sessions (7 j)</div><div class="value">47</div><div class="delta up">▲ +12 % vs semaine préc.</div></div>
<div class="kpi"><span class="emoji">📜</span><div class="label">Événements (24 h)</div><div class="value">132</div><div class="delta down">▼ 8 % vs hier</div></div>
</div>
<div class="grid2">
<div class="panel">
<h3>Top agents — sessions (7 j)</h3>
<div class="bar-row"><span class="name">claude-code</span><div class="track"><div class="fill" style="width:100%"></div></div><span class="val">18</span></div>
<div class="bar-row"><span class="name">aider</span><div class="track"><div class="fill" style="width:50%"></div></div><span class="val">9</span></div>
<div class="bar-row"><span class="name">codex</span><div class="track"><div class="fill" style="width:44%"></div></div><span class="val">8</span></div>
<div class="bar-row"><span class="name">gemini-cli</span><div class="track"><div class="fill" style="width:28%"></div></div><span class="val">5</span></div>
<div class="bar-row"><span class="name">jcode</span><div class="track"><div class="fill" style="width:22%"></div></div><span class="val">4</span></div>
<div class="bar-row"><span class="name">opencode</span><div class="track"><div class="fill" style="width:17%"></div></div><span class="val">3</span></div>
</div>
<div class="panel">
<h3>Activité — sessions par jour (14 j)</h3>
<div class="trend-wrap">
<svg viewBox="0 0 480 150" width="100%" height="150">
<defs><linearGradient id="g" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#3ddc97" stop-opacity=".35"/><stop offset="1" stop-color="#3ddc97" stop-opacity="0"/></linearGradient></defs>
<path d="M0,120 L37,108 L74,116 L111,96 L148,104 L185,84 L222,92 L259,72 L296,80 L333,62 L370,70 L407,48 L444,58 L480,34 L480,150 L0,150 Z" fill="url(#g)"/>
<polyline points="0,120 37,108 74,116 111,96 148,104 185,84 222,92 259,72 296,80 333,62 370,70 407,48 444,58 480,34" fill="none" stroke="#3ddc97" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="480" cy="34" r="4" fill="#38bdf8"/>
</svg>
<div class="trend-axis"><span>04 août</span><span>11 août</span><span>aujourd'hui</span></div>
</div>
</div>
</div>
<div class="grid2">
<div class="panel">
<h3>Activité récente</h3>
<ul class="tl">
<li><span class="dot" style="background:var(--ok)"></span><span class="t"><span class="a">claude-code</span> terminé — session 3 h 12 min</span><span class="m">il y a 2 min</span></li>
<li><span class="dot" style="background:var(--accent2)"></span><span class="t"><span class="a">codex</span> démarré — projet flowdeck</span><span class="m">il y a 14 min</span></li>
<li><span class="dot" style="background:var(--purple)"></span><span class="t"><span class="a">jcode</span> mis à jour 0.76.0 → 0.78.1</span><span class="m">il y a 1 h</span></li>
<li><span class="dot" style="background:var(--err)"></span><span class="t"><span class="a">aider</span> échec — exit code 1</span><span class="m">il y a 3 h</span></li>
<li><span class="dot" style="background:var(--ok)"></span><span class="t"><span class="a">gemini-cli</span> terminé — session 42 min</span><span class="m">il y a 5 h</span></li>
</ul>
</div>
<div class="panel">
<h3>Sessions en cours</h3>
<table>
<thead><tr><th>Agent</th><th>Projet</th><th>Durée</th><th>Démarrée</th></tr></thead>
<tbody>
<tr><td>claude-code</td><td>agent-manager</td><td class="mono">3 h 12 min</td><td class="mono">14:26</td></tr>
<tr><td>codex</td><td>flowdeck</td><td class="mono">14 min</td><td class="mono">17:18</td></tr>
</tbody>
</table>
<div class="empty-note" id="running-empty" style="display:none">Aucune session en cours</div>
</div>
</div>
</section>
<!-- ===== STATS ===== -->
<section class="view" id="stats">
<div class="panel">
<h3>Statistiques par agent — période 30 j</h3>
<table>
<thead><tr><th>Agent</th><th>Sessions</th><th>Durée totale</th><th>Taux de succès</th><th>Coût estimé</th><th>Dernière activité</th></tr></thead>
<tbody>
<tr><td>claude-code</td><td>54</td><td class="mono">38 h 12 m</td><td><span class="pill ok">94 %</span></td><td class="mono">12,40 €</td><td class="mono">il y a 2 min</td></tr>
<tr><td>aider</td><td>31</td><td class="mono">21 h 48 m</td><td><span class="pill ok">87 %</span></td><td class="mono">4,10 €</td><td class="mono">il y a 3 h</td></tr>
<tr><td>codex</td><td>27</td><td class="mono">19 h 05 m</td><td><span class="pill ok">89 %</span></td><td class="mono">8,75 €</td><td class="mono">il y a 14 min</td></tr>
<tr><td>gemini-cli</td><td>14</td><td class="mono">6 h 33 m</td><td><span class="pill ok">79 %</span></td><td class="mono">0 € (local)</td><td class="mono">il y a 5 h</td></tr>
<tr><td>jcode</td><td>12</td><td class="mono">5 h 02 m</td><td><span class="pill run">67 %</span></td><td class="mono">1,20 €</td><td class="mono">hier</td></tr>
<tr><td>opencode</td><td>9</td><td class="mono">4 h 40 m</td><td><span class="pill fail">55 %</span></td><td class="mono">0,90 €</td><td class="mono">il y a 2 j</td></tr>
</tbody>
</table>
</div>
</section>
<!-- ===== SESSIONS ===== -->
<section class="view" id="sessions">
<div class="panel">
<h3>Sessions — 7 derniers jours</h3>
<input class="search" id="sess-search" placeholder="Filtrer par agent, projet ou id…" oninput="filterSessions(this.value)">
<table>
<thead><tr><th>Session</th><th>Agent</th><th>Projet</th><th>Statut</th><th>Durée</th><th>Fin</th></tr></thead>
<tbody id="sess-body">
<tr><td class="mono">20260818_172631_b4e2f1</td><td>claude-code</td><td>agent-manager</td><td><span class="pill run">en cours</span></td><td class="mono">3 h 12 min</td><td class="mono">—</td></tr>
<tr><td class="mono">20260818_171812_c9d0a4</td><td>codex</td><td>flowdeck</td><td><span class="pill run">en cours</span></td><td class="mono">14 min</td><td class="mono">—</td></tr>
<tr><td class="mono">20260818_153402_a1b2c3</td><td>claude-code</td><td>agent-manager</td><td><span class="pill ok">terminée</span></td><td class="mono">1 h 05 min</td><td class="mono">16:40</td></tr>
<tr><td class="mono">20260818_142118_d4e5f6</td><td>aider</td><td>obsigate</td><td><span class="pill fail">échec</span></td><td class="mono">12 min</td><td class="mono">14:33</td></tr>
<tr><td class="mono">20260818_113047_e7f8a9</td><td>gemini-cli</td><td>imago</td><td><span class="pill ok">terminée</span></td><td class="mono">42 min</td><td class="mono">12:12</td></tr>
<tr><td class="mono">20260817_220933_b0c1d2</td><td>claude-code</td><td>agent-manager</td><td><span class="pill ok">terminée</span></td><td class="mono">2 h 47 min</td><td class="mono">23:50</td></tr>
<tr><td class="mono">20260817_183011_e2f3a4</td><td>jcode</td><td>agent-manager</td><td><span class="pill ok">terminée</span></td><td class="mono">1 h 22 min</td><td class="mono">19:35</td></tr>
</tbody>
</table>
<div class="empty-note" id="sess-empty" style="display:none">Aucune session ne correspond au filtre</div>
</div>
</section>
<!-- ===== EVENTS ===== -->
<section class="view" id="events">
<div class="panel">
<h3>Journal d'événements — aujourd'hui</h3>
<ul class="tl">
<li><span class="dot" style="background:var(--accent2)"></span><span class="t"><span class="a">start</span> codex — projet flowdeck</span><span class="m">17:18</span></li>
<li><span class="dot" style="background:var(--ok)"></span><span class="t"><span class="a">stop</span> claude-code — session 1 h 05 min</span><span class="m">16:40</span></li>
<li><span class="dot" style="background:var(--accent2)"></span><span class="t"><span class="a">start</span> claude-code — projet agent-manager</span><span class="m">15:34</span></li>
<li><span class="dot" style="background:var(--err)"></span><span class="t"><span class="a">run</span> aider — exit code 1 (fichier manquant)</span><span class="m">14:33</span></li>
<li><span class="dot" style="background:var(--purple)"></span><span class="t"><span class="a">update</span> jcode 0.76.0 → 0.78.1</span><span class="m">13:05</span></li>
<li><span class="dot" style="background:var(--ok)"></span><span class="t"><span class="a">stop</span> gemini-cli — session 42 min</span><span class="m">12:12</span></li>
<li><span class="dot" style="background:var(--accent2)"></span><span class="t"><span class="a">start</span> gemini-cli — projet imago</span><span class="m">11:30</span></li>
<li><span class="dot" style="background:var(--purple)"></span><span class="t"><span class="a">install</span> opencode 0.14.2 — méthode binary</span><span class="m">10:02</span></li>
</ul>
</div>
</section>
<!-- ===== PROJECTS ===== -->
<section class="view" id="projects">
<div class="kpis" style="grid-template-columns:repeat(3,1fr)">
<div class="kpi"><div class="label">Projets suivis</div><div class="value">4</div><div class="delta up">▲ 1 nouveau cette semaine</div></div>
<div class="kpi"><div class="label">Sessions (7 j)</div><div class="value">47</div><div class="delta up">▲ +12 %</div></div>
<div class="kpi"><div class="label">Temps total</div><div class="value">96 h</div><div class="delta up">▲ +8 h vs semaine préc.</div></div>
</div>
<div class="panel">
<h3>Projets</h3>
<table>
<thead><tr><th>Projet</th><th>Agents</th><th>Sessions (7 j)</th><th>Temps</th><th>Dernière activité</th></tr></thead>
<tbody>
<tr><td><b>agent-manager</b> <span class="mono">· Rust</span></td><td>claude-code · jcode · codex</td><td>24</td><td class="mono">41 h</td><td class="mono">il y a 2 min</td></tr>
<tr><td><b>flowdeck</b> <span class="mono">· Python</span></td><td>codex · aider</td><td>11</td><td class="mono">19 h</td><td class="mono">il y a 14 min</td></tr>
<tr><td><b>obsigate</b> <span class="mono">· Python</span></td><td>aider · gemini-cli</td><td>8</td><td class="mono">22 h</td><td class="mono">il y a 3 h</td></tr>
<tr><td><b>imago</b> <span class="mono">· Python</span></td><td>gemini-cli</td><td>4</td><td class="mono">14 h</td><td class="mono">il y a 5 h</td></tr>
</tbody>
</table>
</div>
</section>
</main>
</div>
<script>
const titles = { overview:"Vue d'ensemble", stats:"Statistiques", sessions:"Sessions", events:"Événements", projects:"Projets" };
document.querySelectorAll('.nav-item').forEach(el => {
el.addEventListener('click', () => {
document.querySelectorAll('.nav-item').forEach(n => n.classList.remove('active'));
document.querySelectorAll('.view').forEach(v => v.classList.remove('active'));
el.classList.add('active');
const v = el.dataset.view;
document.getElementById(v).classList.add('active');
document.getElementById('view-title').textContent = titles[v];
});
});
function fakeRefresh(){
const t = new Date();
document.getElementById('last-update').textContent = 'Dernière mise à jour : ' + t.toLocaleTimeString('fr-FR');
}
function filterSessions(q){
q = q.toLowerCase();
let shown = 0;
document.querySelectorAll('#sess-body tr').forEach(tr => {
const ok = tr.textContent.toLowerCase().includes(q);
tr.style.display = ok ? '' : 'none';
if (ok) shown++;
});
document.getElementById('sess-empty').style.display = shown ? 'none' : 'block';
}
</script>
</body>
</html>
+216
View File
@@ -0,0 +1,216 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>am web — Admin clair (mockup)</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg:#f6f7f9; --panel:#ffffff; --border:#e3e7ec; --fg:#1c2430; --muted:#64748b;
--accent:#2563eb; --ok:#16a34a; --warn:#d97706; --err:#dc2626; --purple:#7c3aed;
}
body {
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
background:var(--bg); color:var(--fg); line-height:1.5; font-size:14px;
}
/* header bar */
.head {
background:var(--panel); border-bottom:1px solid var(--border);
padding:0 28px; height:56px; display:flex; align-items:center; gap:24px; position:sticky; top:0; z-index:5;
}
.head .brand { font-weight:800; font-size:16px; display:flex; align-items:center; gap:9px; }
.brand .sq { width:26px; height:26px; border-radius:7px; background:var(--accent); color:#fff; display:flex; align-items:center; justify-content:center; font-size:13px; }
.tabs { display:flex; gap:4px; height:100%; }
.tab { display:flex; align-items:center; padding:0 16px; color:var(--muted); cursor:pointer; font-size:13.5px; font-weight:500; border-bottom:2px solid transparent; }
.tab:hover { color:var(--fg); }
.tab.active { color:var(--accent); border-bottom-color:var(--accent); font-weight:600; }
.head .spacer { flex:1; }
.hbadge { font-size:11.5px; color:var(--muted); background:var(--bg); border:1px solid var(--border); padding:4px 10px; border-radius:99px; font-family:ui-monospace,Consolas,monospace; }
.hbadge.ok { color:var(--ok); }
.btn { background:var(--accent); color:#fff; border:none; border-radius:7px; padding:7px 14px; font-weight:600; font-size:13px; cursor:pointer; }
.btn:hover { background:#1d4ed8; }
.btn.ghost { background:transparent; color:var(--muted); border:1px solid var(--border); font-weight:500; }
.btn.ghost:hover { color:var(--fg); }
.wrap { max-width:1150px; margin:26px auto; padding:0 28px; }
.page-title { font-size:19px; font-weight:700; margin-bottom:4px; }
.page-sub { color:var(--muted); font-size:12.5px; margin-bottom:20px; }
.cards { display:grid; grid-template-columns:repeat(4,1fr); gap:14px; margin-bottom:18px; }
.card { background:var(--panel); border:1px solid var(--border); border-radius:10px; padding:15px 17px; box-shadow:0 1px 2px rgba(16,24,40,.04); }
.card .l { color:var(--muted); font-size:11.5px; text-transform:uppercase; letter-spacing:.5px; }
.card .v { font-size:26px; font-weight:800; margin-top:5px; color:#111827; }
.card .d { font-size:11.5px; margin-top:3px; } .card .d.up{color:var(--ok);} .card .d.down{color:var(--err);}
.grid2 { display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-bottom:18px; }
.panel { background:var(--panel); border:1px solid var(--border); border-radius:10px; padding:16px 18px; box-shadow:0 1px 2px rgba(16,24,40,.04); }
.panel h3 { font-size:12.5px; text-transform:uppercase; letter-spacing:.5px; color:var(--muted); margin-bottom:14px; }
table { width:100%; border-collapse:collapse; font-size:13px; }
th { text-align:left; color:var(--muted); font-weight:600; font-size:11px; text-transform:uppercase; letter-spacing:.4px; padding:7px 10px; border-bottom:1px solid var(--border); background:var(--bg); }
td { padding:9px 10px; border-bottom:1px solid var(--border); }
tbody tr:hover { background:#fafbfc; }
.pill { font-size:10.5px; padding:2px 9px; border-radius:99px; font-weight:600; }
.pill.ok { background:#dcfce7; color:var(--ok); } .pill.run { background:#dbeafe; color:#1d4ed8; }
.pill.fail { background:#fee2e2; color:var(--err); } .pill.mut { background:#ede9fe; color:var(--purple); }
.mono { font-family:ui-monospace,Consolas,monospace; font-size:11.5px; color:var(--muted); }
.bar-row { display:flex; align-items:center; gap:10px; margin-bottom:9px; font-size:12.5px; }
.bar-row .name { width:110px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.bar-row .track { flex:1; height:12px; background:#eef1f5; border-radius:6px; overflow:hidden; }
.bar-row .fill { height:100%; background:var(--accent); border-radius:6px; }
.bar-row .val { width:32px; text-align:right; color:var(--muted); font-family:ui-monospace,monospace; }
.search { width:100%; border:1px solid var(--border); border-radius:7px; padding:8px 12px; font-size:13px; margin-bottom:10px; background:#fff; }
.search:focus { outline:none; border-color:var(--accent); }
.view { display:none; } .view.active { display:block; }
@media (max-width:900px){ .cards{grid-template-columns:repeat(2,1fr);} .grid2{grid-template-columns:1fr;} }
</style>
</head>
<body>
<div class="head">
<div class="brand"><span class="sq">am</span> agent-manager</div>
<div class="tabs">
<div class="tab active" data-view="overview">Vue d'ensemble</div>
<div class="tab" data-view="stats">Statistiques</div>
<div class="tab" data-view="sessions">Sessions</div>
<div class="tab" data-view="events">Événements</div>
<div class="tab" data-view="projects">Projets</div>
</div>
<div class="spacer"></div>
<span class="hbadge ok">● local</span>
<span class="hbadge">127.0.0.1:7878 · v0.6.0</span>
<button class="btn ghost" onclick="fakeRefresh()">↻ Actualiser</button>
</div>
<div class="wrap">
<div class="page-title" id="view-title">Vue d'ensemble</div>
<div class="page-sub" id="last-update">Dernière mise à jour : il y a 5 s · lang FR</div>
<section class="view active" id="overview">
<div class="cards">
<div class="card"><div class="l">Agents installés</div><div class="v">9</div><div class="d up">▲ +1 cette semaine</div></div>
<div class="card"><div class="l">En cours</div><div class="v">2</div><div class="d up">● claude-code · codex</div></div>
<div class="card"><div class="l">Sessions (7 j)</div><div class="v">47</div><div class="d up">▲ +12 %</div></div>
<div class="card"><div class="l">Événements (24 h)</div><div class="v">132</div><div class="d down">▼ 8 % vs hier</div></div>
</div>
<div class="grid2">
<div class="panel">
<h3>Top agents — sessions (7 j)</h3>
<div class="bar-row"><span class="name">claude-code</span><div class="track"><div class="fill" style="width:100%"></div></div><span class="val">18</span></div>
<div class="bar-row"><span class="name">aider</span><div class="track"><div class="fill" style="width:50%"></div></div><span class="val">9</span></div>
<div class="bar-row"><span class="name">codex</span><div class="track"><div class="fill" style="width:44%"></div></div><span class="val">8</span></div>
<div class="bar-row"><span class="name">gemini-cli</span><div class="track"><div class="fill" style="width:28%"></div></div><span class="val">5</span></div>
<div class="bar-row"><span class="name">jcode</span><div class="track"><div class="fill" style="width:22%"></div></div><span class="val">4</span></div>
<div class="bar-row"><span class="name">opencode</span><div class="track"><div class="fill" style="width:17%"></div></div><span class="val">3</span></div>
</div>
<div class="panel">
<h3>Activité — sessions par jour (14 j)</h3>
<svg viewBox="0 0 480 150" width="100%" height="150">
<defs><linearGradient id="g2" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#2563eb" stop-opacity=".2"/><stop offset="1" stop-color="#2563eb" stop-opacity="0"/></linearGradient></defs>
<path d="M0,120 L37,108 L74,116 L111,96 L148,104 L185,84 L222,92 L259,72 L296,80 L333,62 L370,70 L407,48 L444,58 L480,34 L480,150 L0,150 Z" fill="url(#g2)"/>
<polyline points="0,120 37,108 74,116 111,96 148,104 185,84 222,92 259,72 296,80 333,62 370,70 407,48 444,58 480,34" fill="none" stroke="#2563eb" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="display:flex;justify-content:space-between;color:var(--muted);font-size:10.5px;font-family:ui-monospace,monospace;margin-top:4px"><span>04 août</span><span>11 août</span><span>aujourd'hui</span></div>
</div>
</div>
<div class="panel">
<h3>Sessions — 7 derniers jours</h3>
<input class="search" placeholder="Filtrer par agent, projet ou id…" oninput="filterSessions(this.value)">
<table>
<thead><tr><th>Session</th><th>Agent</th><th>Projet</th><th>Statut</th><th>Durée</th><th>Fin</th></tr></thead>
<tbody id="sess-body-ov">
<tr><td class="mono">20260818_172631_b4e2f1</td><td>claude-code</td><td>agent-manager</td><td><span class="pill run">en cours</span></td><td class="mono">3 h 12 min</td><td class="mono">—</td></tr>
<tr><td class="mono">20260818_171812_c9d0a4</td><td>codex</td><td>flowdeck</td><td><span class="pill run">en cours</span></td><td class="mono">14 min</td><td class="mono">—</td></tr>
<tr><td class="mono">20260818_153402_a1b2c3</td><td>claude-code</td><td>agent-manager</td><td><span class="pill ok">terminée</span></td><td class="mono">1 h 05 min</td><td class="mono">16:40</td></tr>
<tr><td class="mono">20260818_142118_d4e5f6</td><td>aider</td><td>obsigate</td><td><span class="pill fail">échec</span></td><td class="mono">12 min</td><td class="mono">14:33</td></tr>
<tr><td class="mono">20260818_113047_e7f8a9</td><td>gemini-cli</td><td>imago</td><td><span class="pill ok">terminée</span></td><td class="mono">42 min</td><td class="mono">12:12</td></tr>
<tr><td class="mono">20260817_220933_b0c1d2</td><td>claude-code</td><td>agent-manager</td><td><span class="pill ok">terminée</span></td><td class="mono">2 h 47 min</td><td class="mono">23:50</td></tr>
</tbody>
</table>
</div>
</section>
<section class="view" id="stats">
<div class="panel">
<h3>Statistiques par agent — période 30 j</h3>
<table>
<thead><tr><th>Agent</th><th>Sessions</th><th>Durée totale</th><th>Taux de succès</th><th>Coût estimé</th><th>Dernière activité</th></tr></thead>
<tbody>
<tr><td>claude-code</td><td>54</td><td class="mono">38 h 12 m</td><td><span class="pill ok">94 %</span></td><td class="mono">12,40 €</td><td class="mono">il y a 2 min</td></tr>
<tr><td>aider</td><td>31</td><td class="mono">21 h 48 m</td><td><span class="pill ok">87 %</span></td><td class="mono">4,10 €</td><td class="mono">il y a 3 h</td></tr>
<tr><td>codex</td><td>27</td><td class="mono">19 h 05 m</td><td><span class="pill ok">89 %</span></td><td class="mono">8,75 €</td><td class="mono">il y a 14 min</td></tr>
<tr><td>gemini-cli</td><td>14</td><td class="mono">6 h 33 m</td><td><span class="pill ok">79 %</span></td><td class="mono">0 € (local)</td><td class="mono">il y a 5 h</td></tr>
<tr><td>jcode</td><td>12</td><td class="mono">5 h 02 m</td><td><span class="pill run">67 %</span></td><td class="mono">1,20 €</td><td class="mono">hier</td></tr>
</tbody>
</table>
</div>
</section>
<section class="view" id="sessions">
<div class="panel">
<h3>Sessions — 7 derniers jours</h3>
<input class="search" placeholder="Filtrer par agent, projet ou id…" oninput="filterSessions(this.value)">
<table>
<thead><tr><th>Session</th><th>Agent</th><th>Projet</th><th>Statut</th><th>Durée</th><th>Fin</th></tr></thead>
<tbody id="sess-body">
<tr><td class="mono">20260818_172631_b4e2f1</td><td>claude-code</td><td>agent-manager</td><td><span class="pill run">en cours</span></td><td class="mono">3 h 12 min</td><td class="mono">—</td></tr>
<tr><td class="mono">20260818_171812_c9d0a4</td><td>codex</td><td>flowdeck</td><td><span class="pill run">en cours</span></td><td class="mono">14 min</td><td class="mono">—</td></tr>
<tr><td class="mono">20260818_153402_a1b2c3</td><td>claude-code</td><td>agent-manager</td><td><span class="pill ok">terminée</span></td><td class="mono">1 h 05 min</td><td class="mono">16:40</td></tr>
<tr><td class="mono">20260818_142118_d4e5f6</td><td>aider</td><td>obsigate</td><td><span class="pill fail">échec</span></td><td class="mono">12 min</td><td class="mono">14:33</td></tr>
</tbody>
</table>
</div>
</section>
<section class="view" id="events">
<div class="panel">
<h3>Journal d'événements — aujourd'hui</h3>
<table>
<thead><tr><th>Heure</th><th>Type</th><th>Agent</th><th>Détail</th></tr></thead>
<tbody>
<tr><td class="mono">17:18</td><td><span class="pill run">start</span></td><td>codex</td><td>projet flowdeck</td></tr>
<tr><td class="mono">16:40</td><td><span class="pill ok">stop</span></td><td>claude-code</td><td>session 1 h 05 min</td></tr>
<tr><td class="mono">15:34</td><td><span class="pill run">start</span></td><td>claude-code</td><td>projet agent-manager</td></tr>
<tr><td class="mono">14:33</td><td><span class="pill fail">run</span></td><td>aider</td><td>exit code 1</td></tr>
<tr><td class="mono">13:05</td><td><span class="pill mut">update</span></td><td>jcode</td><td>0.76.0 → 0.78.1</td></tr>
<tr><td class="mono">10:02</td><td><span class="pill mut">install</span></td><td>opencode</td><td>0.14.2 — méthode binary</td></tr>
</tbody>
</table>
</div>
</section>
<section class="view" id="projects">
<div class="panel">
<h3>Projets</h3>
<table>
<thead><tr><th>Projet</th><th>Agents</th><th>Sessions (7 j)</th><th>Temps</th><th>Dernière activité</th></tr></thead>
<tbody>
<tr><td><b>agent-manager</b> <span class="mono">· Rust</span></td><td>claude-code · jcode · codex</td><td>24</td><td class="mono">41 h</td><td class="mono">il y a 2 min</td></tr>
<tr><td><b>flowdeck</b> <span class="mono">· Python</span></td><td>codex · aider</td><td>11</td><td class="mono">19 h</td><td class="mono">il y a 14 min</td></tr>
<tr><td><b>obsigate</b> <span class="mono">· Python</span></td><td>aider · gemini-cli</td><td>8</td><td class="mono">22 h</td><td class="mono">il y a 3 h</td></tr>
<tr><td><b>imago</b> <span class="mono">· Python</span></td><td>gemini-cli</td><td>4</td><td class="mono">14 h</td><td class="mono">il y a 5 h</td></tr>
</tbody>
</table>
</div>
</section>
</div>
<script>
const titles = { overview:"Vue d'ensemble", stats:"Statistiques", sessions:"Sessions", events:"Événements", projects:"Projets" };
document.querySelectorAll('.tab').forEach(el => {
el.addEventListener('click', () => {
document.querySelectorAll('.tab').forEach(n => n.classList.remove('active'));
document.querySelectorAll('.view').forEach(v => v.classList.remove('active'));
el.classList.add('active');
document.getElementById(el.dataset.view).classList.add('active');
document.getElementById('view-title').textContent = titles[el.dataset.view];
});
});
function fakeRefresh(){
document.getElementById('last-update').textContent = 'Dernière mise à jour : ' + new Date().toLocaleTimeString('fr-FR') + ' · lang FR';
}
function filterSessions(q){
q = q.toLowerCase();
document.querySelectorAll('#sess-body tr, #sess-body-ov tr').forEach(tr => {
tr.style.display = tr.textContent.toLowerCase().includes(q) ? '' : 'none';
});
}
</script>
</body>
</html>
+222
View File
@@ -0,0 +1,222 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>am web — Terminal dense (mockup)</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg:#0d1117; --panel:#10161f; --border:#212a36; --fg:#c9d4e0; --muted:#6e7b8a;
--accent:#3fb950; --accent2:#58a6ff; --ok:#3fb950; --warn:#d29922; --err:#f85149; --purple:#bc8cff;
}
body {
font-family:ui-monospace,SFMono-Regular,Consolas,"Cascadia Mono",Menlo,monospace;
background:var(--bg); color:var(--fg); font-size:12.5px; line-height:1.5;
}
.top {
border-bottom:1px solid var(--border); padding:9px 16px; display:flex; align-items:center; gap:16px;
background:var(--panel); position:sticky; top:0; z-index:5;
}
.top .prompt { color:var(--accent); font-weight:700; }
.top .brand { color:var(--fg); }
.tabs { display:flex; gap:2px; }
.tab { padding:3px 10px; cursor:pointer; color:var(--muted); border:1px solid transparent; border-radius:5px; }
.tab:hover { color:var(--fg); }
.tab.active { color:var(--accent); background:rgba(63,185,80,.08); border-color:rgba(63,185,80,.3); }
.top .spacer { flex:1; }
.stat { color:var(--muted); font-size:11.5px; }
.stat b { color:var(--ok); font-weight:400; }
.btn { background:transparent; border:1px solid var(--border); color:var(--fg); border-radius:5px; padding:3px 10px; font-family:inherit; font-size:12px; cursor:pointer; }
.btn:hover { border-color:var(--accent); color:var(--accent); }
.wrap { max-width:1180px; margin:0 auto; padding:14px 16px 40px; }
/* overview row */
.kv { display:grid; grid-template-columns:repeat(4,1fr); gap:8px; margin-bottom:14px; }
.kv-item { border:1px solid var(--border); background:var(--panel); border-radius:6px; padding:9px 12px; }
.kv-item .k { color:var(--muted); font-size:10.5px; text-transform:uppercase; letter-spacing:.8px; }
.kv-item .v { font-size:21px; font-weight:700; color:var(--fg); margin-top:2px; }
.kv-item .v small { color:var(--muted); font-size:11px; font-weight:400; }
.kv-item.running .v { color:var(--accent); }
.kv-item.running .v::before { content:"● "; }
.row { display:grid; grid-template-columns:1fr 1fr; gap:8px; margin-bottom:14px; }
.box { border:1px solid var(--border); background:var(--panel); border-radius:6px; overflow:hidden; }
.box .h { padding:7px 12px; border-bottom:1px solid var(--border); color:var(--muted); font-size:10.5px; text-transform:uppercase; letter-spacing:.8px; display:flex; justify-content:space-between; }
.box .h .n { color:var(--accent); text-transform:none; letter-spacing:0; }
.box .b { padding:10px 12px; }
/* bars */
.br { display:grid; grid-template-columns:95px 1fr 30px; gap:8px; align-items:center; margin-bottom:6px; }
.br .nm { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.br .tr { height:10px; background:var(--bg); border-radius:3px; overflow:hidden; }
.br .fl { height:100%; background:var(--accent); opacity:.85; }
.br .vl { text-align:right; color:var(--muted); }
/* tables */
table { width:100%; border-collapse:collapse; }
th { text-align:left; color:var(--muted); font-weight:400; font-size:10.5px; text-transform:uppercase; letter-spacing:.6px; padding:5px 10px; border-bottom:1px solid var(--border); }
td { padding:5px 10px; border-bottom:1px solid rgba(33,42,54,.6); white-space:nowrap; }
td.wrap { white-space:normal; }
tbody tr:hover { background:rgba(63,185,80,.05); }
.st { font-size:11px; } .st::before { content:"● "; }
.st.ok { color:var(--ok); } .st.run { color:var(--accent2); } .st.fail { color:var(--err); } .st.mut { color:var(--purple); }
.dim { color:var(--muted); }
.view { display:none; } .view.active { display:block; }
@media (max-width:900px){ .row{grid-template-columns:1fr;} .kv{grid-template-columns:repeat(2,1fr);} }
</style>
</head>
<body>
<div class="top">
<span class="prompt">$</span><span class="brand">am web</span>
<div class="tabs">
<div class="tab active" data-view="overview">overview</div>
<div class="tab" data-view="stats">stats</div>
<div class="tab" data-view="sessions">sessions</div>
<div class="tab" data-view="events">events</div>
<div class="tab" data-view="projects">projects</div>
</div>
<div class="spacer"></div>
<span class="stat">v0.6.0 · <b>●</b> local · 127.0.0.1:7878</span>
<button class="btn" onclick="fakeRefresh()">↻ refresh</button>
</div>
<div class="wrap">
<section class="view active" id="overview">
<div class="kv">
<div class="kv-item"><div class="k">agents installés</div><div class="v">9</div></div>
<div class="kv-item running"><div class="k">en cours</div><div class="v">2</div></div>
<div class="kv-item"><div class="k">sessions 7j</div><div class="v">47 <small>▲12%</small></div></div>
<div class="kv-item"><div class="k">events 24h</div><div class="v">132 <small>▼8%</small></div></div>
</div>
<div class="row">
<div class="box">
<div class="h">top agents · sessions 7j</div>
<div class="b">
<div class="br"><span class="nm">claude-code</span><div class="tr"><div class="fl" style="width:100%"></div></div><span class="vl">18</span></div>
<div class="br"><span class="nm">aider</span><div class="tr"><div class="fl" style="width:50%"></div></div><span class="vl">9</span></div>
<div class="br"><span class="nm">codex</span><div class="tr"><div class="fl" style="width:44%"></div></div><span class="vl">8</span></div>
<div class="br"><span class="nm">gemini-cli</span><div class="tr"><div class="fl" style="width:28%"></div></div><span class="vl">5</span></div>
<div class="br"><span class="nm">jcode</span><div class="tr"><div class="fl" style="width:22%"></div></div><span class="vl">4</span></div>
<div class="br"><span class="nm">opencode</span><div class="tr"><div class="fl" style="width:17%"></div></div><span class="vl">3</span></div>
</div>
</div>
<div class="box">
<div class="h">activité 14j <span class="n">sessions/jour</span></div>
<div class="b">
<svg viewBox="0 0 480 150" width="100%" height="140">
<defs><linearGradient id="g3" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#3fb950" stop-opacity=".3"/><stop offset="1" stop-color="#3fb950" stop-opacity="0"/></linearGradient></defs>
<path d="M0,120 L37,108 L74,116 L111,96 L148,104 L185,84 L222,92 L259,72 L296,80 L333,62 L370,70 L407,48 L444,58 L480,34 L480,150 L0,150 Z" fill="url(#g3)"/>
<polyline points="0,120 37,108 74,116 111,96 148,104 185,84 222,92 259,72 296,80 333,62 370,70 407,48 444,58 480,34" fill="none" stroke="#3fb950" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="display:flex;justify-content:space-between;color:var(--muted);font-size:10px"><span>04/08</span><span>11/08</span><span>18/08</span></div>
</div>
</div>
</div>
<div class="box">
<div class="h">sessions en cours</div>
<div class="b" style="padding:0">
<table>
<thead><tr><th>id</th><th>agent</th><th>projet</th><th>durée</th><th>depuis</th></tr></thead>
<tbody>
<tr><td class="dim">20260818_172631_b4e2f1</td><td>claude-code</td><td>agent-manager</td><td>3h12m</td><td class="dim">14:26</td></tr>
<tr><td class="dim">20260818_171812_c9d0a4</td><td>codex</td><td>flowdeck</td><td>14m</td><td class="dim">17:18</td></tr>
</tbody>
</table>
</div>
</div>
</section>
<section class="view" id="stats">
<div class="box">
<div class="h">stats par agent · 30j</div>
<div class="b" style="padding:0">
<table>
<thead><tr><th>agent</th><th>sessions</th><th>durée</th><th>succès</th><th>coût</th><th>dernière act.</th></tr></thead>
<tbody>
<tr><td>claude-code</td><td>54</td><td>38h12m</td><td><span class="st ok">94%</span></td><td class="dim">12,40 €</td><td class="dim">2 min</td></tr>
<tr><td>aider</td><td>31</td><td>21h48m</td><td><span class="st ok">87%</span></td><td class="dim">4,10 €</td><td class="dim">3 h</td></tr>
<tr><td>codex</td><td>27</td><td>19h05m</td><td><span class="st ok">89%</span></td><td class="dim">8,75 €</td><td class="dim">14 min</td></tr>
<tr><td>gemini-cli</td><td>14</td><td>6h33m</td><td><span class="st ok">79%</span></td><td class="dim">0 € local</td><td class="dim">5 h</td></tr>
<tr><td>jcode</td><td>12</td><td>5h02m</td><td><span class="st run">67%</span></td><td class="dim">1,20 €</td><td class="dim">hier</td></tr>
<tr><td>opencode</td><td>9</td><td>4h40m</td><td><span class="st fail">55%</span></td><td class="dim">0,90 €</td><td class="dim">2 j</td></tr>
</tbody>
</table>
</div>
</div>
</section>
<section class="view" id="sessions">
<div class="box">
<div class="h">sessions · 7j</div>
<div class="b" style="padding:8px 12px 0">
<input id="sess-search" placeholder="$ grep sessions…" style="width:100%;background:var(--bg);border:1px solid var(--border);color:var(--fg);font-family:inherit;font-size:12px;padding:6px 10px;border-radius:4px;margin-bottom:6px" oninput="filterSessions(this.value)">
</div>
<div class="b" style="padding:0">
<table>
<thead><tr><th>id</th><th>agent</th><th>projet</th><th>statut</th><th>durée</th><th>fin</th></tr></thead>
<tbody id="sess-body">
<tr><td class="dim">20260818_172631_b4e2f1</td><td>claude-code</td><td>agent-manager</td><td><span class="st run">running</span></td><td>3h12m</td><td class="dim">—</td></tr>
<tr><td class="dim">20260818_171812_c9d0a4</td><td>codex</td><td>flowdeck</td><td><span class="st run">running</span></td><td>14m</td><td class="dim">—</td></tr>
<tr><td class="dim">20260818_153402_a1b2c3</td><td>claude-code</td><td>agent-manager</td><td><span class="st ok">done</span></td><td>1h05m</td><td class="dim">16:40</td></tr>
<tr><td class="dim">20260818_142118_d4e5f6</td><td>aider</td><td>obsigate</td><td><span class="st fail">failed</span></td><td>12m</td><td class="dim">14:33</td></tr>
<tr><td class="dim">20260818_113047_e7f8a9</td><td>gemini-cli</td><td>imago</td><td><span class="st ok">done</span></td><td>42m</td><td class="dim">12:12</td></tr>
<tr><td class="dim">20260817_220933_b0c1d2</td><td>claude-code</td><td>agent-manager</td><td><span class="st ok">done</span></td><td>2h47m</td><td class="dim">23:50</td></tr>
</tbody>
</table>
</div>
</div>
</section>
<section class="view" id="events">
<div class="box">
<div class="h">events · aujourd'hui</div>
<div class="b" style="padding:0">
<table>
<thead><tr><th>heure</th><th>type</th><th>agent</th><th class="wrap">détail</th></tr></thead>
<tbody>
<tr><td class="dim">17:18</td><td><span class="st run">start</span></td><td>codex</td><td class="wrap">projet flowdeck</td></tr>
<tr><td class="dim">16:40</td><td><span class="st ok">stop</span></td><td>claude-code</td><td class="wrap">session 1h05m</td></tr>
<tr><td class="dim">15:34</td><td><span class="st run">start</span></td><td>claude-code</td><td class="wrap">projet agent-manager</td></tr>
<tr><td class="dim">14:33</td><td><span class="st fail">run</span></td><td>aider</td><td class="wrap">exit code 1 — fichier manquant</td></tr>
<tr><td class="dim">13:05</td><td><span class="st mut">update</span></td><td>jcode</td><td class="wrap">0.76.0 → 0.78.1</td></tr>
<tr><td class="dim">10:02</td><td><span class="st mut">install</span></td><td>opencode</td><td class="wrap">0.14.2 — méthode binary</td></tr>
</tbody>
</table>
</div>
</div>
</section>
<section class="view" id="projects">
<div class="box">
<div class="h">projects</div>
<div class="b" style="padding:0">
<table>
<thead><tr><th>projet</th><th>agents</th><th>sessions 7j</th><th>temps</th><th>dernière act.</th></tr></thead>
<tbody>
<tr><td>agent-manager <span class="dim">· Rust</span></td><td>claude-code · jcode · codex</td><td>24</td><td class="dim">41h</td><td class="dim">2 min</td></tr>
<tr><td>flowdeck <span class="dim">· Python</span></td><td>codex · aider</td><td>11</td><td class="dim">19h</td><td class="dim">14 min</td></tr>
<tr><td>obsigate <span class="dim">· Python</span></td><td>aider · gemini-cli</td><td>8</td><td class="dim">22h</td><td class="dim">3 h</td></tr>
<tr><td>imago <span class="dim">· Python</span></td><td>gemini-cli</td><td>4</td><td class="dim">14h</td><td class="dim">5 h</td></tr>
</tbody>
</table>
</div>
</div>
</section>
</div>
<script>
document.querySelectorAll('.tab').forEach(el => {
el.addEventListener('click', () => {
document.querySelectorAll('.tab').forEach(n => n.classList.remove('active'));
document.querySelectorAll('.view').forEach(v => v.classList.remove('active'));
el.classList.add('active');
document.getElementById(el.dataset.view).classList.add('active');
});
});
function fakeRefresh(){}
function filterSessions(q){
q = q.toLowerCase();
document.querySelectorAll('#sess-body tr').forEach(tr => {
tr.style.display = tr.textContent.toLowerCase().includes(q) ? '' : 'none';
});
}
</script>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More