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.
This commit is contained in:
2026-08-20 10:22:21 -04:00
parent 38d38d51e3
commit d0f52eb7c0
10 changed files with 156 additions and 66 deletions
+49 -51
View File
@@ -1,28 +1,30 @@
# Gitea Actions : pipeline de release (issue #42). # Gitea Actions : pipeline de release (issue #42).
# #
# Sur chaque tag v* : construit les binaires de toutes les plateformes, # Sur chaque tag v* : construit les binaires de toutes les plateformes.
# archive + publie la release Gitea avec les artefacts. Les installateurs # Le job principal 'release' cross-compile Linux + Windows depuis un seul
# (install.sh / install.ps1) et 'am self-update' consomment ces artefacts. # 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.
# #
# Labels de runners attendus : ubuntu-latest, windows-latest, macos-latest. # Les installateurs one-liner (install.sh / install.ps1) et 'am self-update'
# Un runner manquant laisse son job en attente ; le job linux couvre la # consomment les artefacts attaches a la release.
# majorite des cas (les artefacts windows/macos peuvent aussi etre produits
# par les scripts locaux documentes dans RELEASING.md).
# #
# Prérequis du runner : pouvoir tirer les images docker.io (rust:1.94-alpine, # Cross-compilation utilisee :
# ~300 Mo) et le secret GITEA_TOKEN (jeton avec droit 'write:release') # - Linux x86_64 + aarch64 : cargo-zigbuild + musl (binaires statiques)
# positionné sur le dépôt. La release existante est écrasée # - Windows x86_64 : mingw-w64 + x86_64-pc-windows-gnu
# (release_overwrite). #
# 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) : # Note disque (runner avec espace limite) :
# - il faut ~1 Go libres sur / pour tirer l'image (rust:1.94-alpine) ; # - 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 # en cas de 'no space left on device' : docker system prune -af --volumes
# sur l'HOTE du runner (pas une autre machine !) ; # sur l'HOTE du runner (pas une autre machine !) ;
# - les builds compilent dans CARGO_TARGET_DIR=/tmp (hors du volume # - les builds compilent dans CARGO_TARGET_DIR=/tmp (hors du volume
# workspace) avec l'incremental desactive, donc rien ne persiste ; # workspace) avec l'incremental desactive, donc rien ne persiste ;
# - le job linux utilise cargo-zigbuild : zig (~50 Mo) fournit le linker # - zig (~50 Mo) fournit le linker croise pour Linux.
# croise pour les DEUX cibles musl statiques dans une seule image legere
# (rust:1.94-alpine n'embarque pas de compilateur croise aarch64).
name: release name: release
on: on:
@@ -35,41 +37,56 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
linux: release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: rust:1.94-alpine container: rust:1.94-bookworm
env: env:
CARGO_TARGET_DIR: /tmp/am-target CARGO_TARGET_DIR: /tmp/am-target
CARGO_INCREMENTAL: "0" CARGO_INCREMENTAL: "0"
steps: steps:
# actions/checkout (et son post-step) s'execute via node, absent de # actions/checkout (et son post-step) s'execute via node, absent de
# l'image rust:alpine : sans nodejs le job echoue des le checkout. # l'image rust:bookworm par defaut : sans nodejs le job echoue des le checkout.
- name: Prepare container (node for checkout action) - name: Prepare container (node for checkout action)
run: apk add --no-cache nodejs run: apt-get update && apt-get install -y nodejs
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Install build tools (zig + cargo-zigbuild) - name: Install build tools (zig + cargo-zigbuild + mingw)
run: | run: |
apk add --no-cache build-base zip curl apt-get update
rustup target add x86_64-unknown-linux-musl aarch64-unknown-linux-musl 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 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 tar -xf /tmp/zig.tar.xz -C /opt
echo "/opt/zig-x86_64-linux-0.14.1" >> "$GITHUB_PATH" echo "/opt/zig-x86_64-linux-0.14.1" >> "$GITHUB_PATH"
cargo install cargo-zigbuild --locked 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) - 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 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 - name: Stage archives
run: | run: |
mkdir -p dist mkdir -p dist
cp "$CARGO_TARGET_DIR/x86_64-unknown-linux-musl/release/am" dist/am-linux-x86_64 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/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 cd dist
tar -czf am-linux-x86_64.tar.gz am-linux-x86_64 tar -czf am-linux-x86_64.tar.gz am-linux-x86_64
tar -czf am-linux-aarch64.tar.gz am-linux-aarch64 tar -czf am-linux-aarch64.tar.gz am-linux-aarch64
sha256sum am-linux-*.tar.gz > checksums.txt 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 - name: Publish release
uses: https://gitea.com/actions/gitea-release-action@v1 uses: https://gitea.com/actions/gitea-release-action@v1
@@ -80,37 +97,16 @@ jobs:
files: | files: |
dist/am-linux-x86_64.tar.gz dist/am-linux-x86_64.tar.gz
dist/am-linux-aarch64.tar.gz dist/am-linux-aarch64.tar.gz
dist/checksums.txt
GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }}
release_overwrite: true
windows:
runs-on: windows-latest
env:
CARGO_TARGET_DIR: C:/am-target
CARGO_INCREMENTAL: "0"
steps:
- uses: actions/checkout@v4
- name: Build windows x86_64
run: cargo build --release --locked
- name: Stage archive
run: |
New-Item -ItemType Directory -Force dist | Out-Null
Compress-Archive -Path C:/am-target/release/am.exe -DestinationPath dist/am-windows-x86_64.zip -Force
(Get-FileHash dist/am-windows-x86_64.zip -Algorithm SHA256).Hash.ToLower() | Out-File dist/checksums.txt
- name: Publish release
uses: https://gitea.com/actions/gitea-release-action@v1
with:
files: |
dist/am-windows-x86_64.zip dist/am-windows-x86_64.zip
dist/checksums.txt dist/checksums.txt
GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }}
release_overwrite: true release_overwrite: true
macos: 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 runs-on: macos-latest
env: env:
CARGO_TARGET_DIR: /tmp/am-target CARGO_TARGET_DIR: /tmp/am-target
@@ -132,7 +128,7 @@ jobs:
cd dist cd dist
tar -czf am-macos-x86_64.tar.gz am-macos-x86_64 tar -czf am-macos-x86_64.tar.gz am-macos-x86_64
tar -czf am-macos-aarch64.tar.gz am-macos-aarch64 tar -czf am-macos-aarch64.tar.gz am-macos-aarch64
shasum -a 256 am-*.tar.gz > checksums.txt shasum -a 256 am-macos-*.tar.gz > checksums-macos.txt
- name: Publish release - name: Publish release
uses: https://gitea.com/actions/gitea-release-action@v1 uses: https://gitea.com/actions/gitea-release-action@v1
@@ -140,6 +136,8 @@ jobs:
files: | files: |
dist/am-macos-x86_64.tar.gz dist/am-macos-x86_64.tar.gz
dist/am-macos-aarch64.tar.gz dist/am-macos-aarch64.tar.gz
dist/checksums.txt dist/checksums-macos.txt
GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }}
release_overwrite: true # false = ajoute les assets macOS a la release creee par le job
# principal, sans ecraser Linux + Windows.
release_overwrite: false
+40 -2
View File
@@ -131,6 +131,7 @@ src/
├── app.rs 🧰 Contexte App (config, state, paths, logger, theme) ├── app.rs 🧰 Contexte App (config, state, paths, logger, theme)
├── config.rs ⚙️ Schéma YAML, chargement, fusion, validation ├── config.rs ⚙️ Schéma YAML, chargement, fusion, validation
├── catalog.rs 🔍 Index agents + recherche fuzzy + suggestions ├── catalog.rs 🔍 Index agents + recherche fuzzy + suggestions
├── catalog_remote.rs 🌐 Catalogues distants (fetch, cache, includes)
├── state.rs 💾 Base JSON des installations et annotations ├── state.rs 💾 Base JSON des installations et annotations
├── events.rs 📝 Journal d'événements JSONL ├── events.rs 📝 Journal d'événements JSONL
├── runner.rs 🏃 Trait d'exécution système / mock ├── runner.rs 🏃 Trait d'exécution système / mock
@@ -149,15 +150,33 @@ src/
├── tables.rs 📋 Rendu tabulaire ├── tables.rs 📋 Rendu tabulaire
├── theme.rs 🎨 Thèmes de couleur (REPL et tableaux) ├── theme.rs 🎨 Thèmes de couleur (REPL et tableaux)
├── web.rs 🌐 Serveur HTTP local (127.0.0.1) + API JSON + frontend embarqué ├── 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!) ├── frontend/ 📄 index.html — dashboard web (HTML5 + CSS + JS vanilla, include_str!)
├── history.rs ⏪ Historique des commandes ├── history.rs ⏪ Historique des commandes
├── sessions.rs 📅 Registre des sessions ├── sessions.rs 📅 Registre des sessions
├── projects.rs 🗂️️ Agrégation par projet ├── projects.rs 🗂️️ Agrégation par projet
├── hooks.rs 🪝 Hooks de cycle de vie ├── hooks.rs 🪝 Hooks de cycle de vie
├── secrets.rs 🔒 Gestion des secrets (keyring OS) ├── 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)
├── 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 ├── version.rs 🏷️ Informations de version
├── commands/ 📦 35 modules, un par commande ├── commands/ 📦 51 modules, un par commande
└── installers/ 📦 9 installateurs spécialisés └── installers/ 📦 8 installateurs spécialisés
``` ```
--- ---
@@ -435,6 +454,25 @@ flowchart TB
| `am version` | Version et build | | `am version` | Version et build |
| `am` (sans commande) | REPL interactif | | `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 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 ## 🌐 Options globales
Generated
+1 -1
View File
@@ -21,7 +21,7 @@ dependencies = [
[[package]] [[package]]
name = "agent-manager" name = "agent-manager"
version = "1.0.1" version = "1.0.2"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"base64", "base64",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "agent-manager" name = "agent-manager"
version = "1.0.1" version = "1.0.2"
edition = "2021" edition = "2021"
description = "Manage local AI coding agents: list, install, start, stop, update — with automatic dependency handling and a YAML-driven catalog." description = "Manage local AI coding agents: list, install, start, stop, update — with automatic dependency handling and a YAML-driven catalog."
license = "MIT" license = "MIT"
+4
View File
@@ -78,11 +78,14 @@ plateforme, il compile automatiquement depuis les sources.
| am list --all | tout le catalogue, avec l'état de chacun | | am list --all | tout le catalogue, avec l'état de chacun |
| am search <mot-clé> | recherche fuzzy : tolère les fautes de frappe, classe par pertinence, propose « vouliez-vous dire » | | 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 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 info <agent> | fiche détaillée (installation, dépendances, site…) | | am info <agent> | fiche détaillée (installation, dépendances, site…) |
| am status [agent] | état, version, PID, logs | | am status [agent] | état, version, PID, logs |
| am models | inventaire des modèles locaux (ollama, llama.cpp, LM Studio) | | 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 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 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 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 --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 sessions --retention <jours> | purge des sessions terminées au-delà de N jours |
@@ -207,6 +210,7 @@ Les variables d'environnement `AGENT_MANAGER_DATA`, `AGENT_MANAGER_STATE` et `AG
| am config show / edit / add / set | gère votre configuration (hooks on_start/on_stop/… dans settings.hooks) | | 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 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 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-update | met à jour am lui-même (si configuré) |
| am self-uninstall | désinstalle am et tout ce qu'il a créé (confirmation) | | 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 | | am | shell interactif : bannière, passerelle système, Tab et historique |
+17 -5
View File
@@ -1,6 +1,7 @@
# 🗺️ ROADMAP agent-manager — vers le « super outil » # 🗺️ ROADMAP agent-manager — vers le « super outil »
> **Version du document : 2.2** · Statut : propositions, non engagées > **Version du document : 2.3** · Statut : phases 0 à 3 livrées
> (v0.3.0 → v1.0.1), maintenance v1.0.2
> Base : analyse du code **v0.2.7** (Rust, 45+ tests, zéro dépendance runtime) > 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, > ✅ **Phase 0 livrée en v0.3.0 (2026-08-17)** : issues #2 à #16 clôturées,
@@ -18,8 +19,18 @@
> (#47–#75), 250+ tests. am web, i18n, services, schedule, lab, sync, > (#47–#75), 250+ tests. am web, i18n, services, schedule, lab, sync,
> migrate, models, plugins d'événements… Binaires publiés sur Gitea. > migrate, models, plugins d'événements… Binaires publiés sur Gitea.
> >
> 🔨 **Phase v0.7.0 en cours (priorité P0)** : providers & configuration > ✅ **Phase v0.7.0 livrée (2026-08-19)** : 5/5 issues clôturées (#88–#92) —
> automatisée (épique #87) — livrée AVANT la Phase 3 (v1.0), voir section 7 bis. > 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.2 (2026-08-20)** : commandes REPL ask/serve/registry
> routées vers am (au lieu du shell système) ; docs alignées.
--- ---
@@ -509,5 +520,6 @@ 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). *Document généré à partir de l'analyse du code (v0.2.7, commit d886de3).
La phase 0 est livrée (v0.3.0) ; les découpages des phases 1 (v0.4.0), Phases livrées : 0 (v0.3.0), 1 (v0.4.1), 2 (v0.6.0), v0.7.0 (providers,
2 (v0.5.0) et 3 (v1.0) sont en place sur Gitea (issues #25 à #80).* 2026-08-19), 3 (v1.0.0, #76–#80, 2026-08-20) ; maintenance v1.0.1/v1.0.2
(self-update décompression, REPL).*
+2 -2
View File
@@ -1,6 +1,6 @@
.ie \n(.g .ds Aq \(aq .ie \n(.g .ds Aq \(aq
.el .ds Aq ' .el .ds Aq '
.TH am 1 "am 1.0.0" .TH am 1 "am 1.0.2"
.SH NAME .SH NAME
am \- agent\-manager (am) — manage local AI coding agents am \- agent\-manager (am) — manage local AI coding agents
.SH SYNOPSIS .SH SYNOPSIS
@@ -244,4 +244,4 @@ Export the configuration and installation state (backup)
am\-import(1) am\-import(1)
Import a previously exported configuration and state Import a previously exported configuration and state
.SH VERSION .SH VERSION
v1.0.0 v1.0.2
+11 -2
View File
@@ -12,9 +12,18 @@ $zip = "dist/am-windows-x86_64.zip"
Remove-Item $zip -ErrorAction SilentlyContinue Remove-Item $zip -ErrorAction SilentlyContinue
Compress-Archive -Path target/release/am.exe -DestinationPath $zip 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 ""
Write-Host "Artefacts:" Write-Host "Artefacts:"
Get-ChildItem dist | ForEach-Object { Get-ChildItem dist -File | ForEach-Object {
$hash = (Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower() $hash = Get-Sha256Net $_.FullName
Write-Host (" {0,-32} {1} sha256:{2}" -f $_.Name, $_.Length, $hash) Write-Host (" {0,-32} {1} sha256:{2}" -f $_.Name, $_.Length, $hash)
} }
+25
View File
@@ -103,6 +103,12 @@ pub static SECTIONS: &[TipSection] = &[
options: &[("--json", "sortie machine-readable")], options: &[("--json", "sortie machine-readable")],
example: "suggest un agent pour du Python", example: "suggest un agent pour du Python",
}, },
TipEntry {
usage: "ask <demande>",
about: "langage naturel → commande(s) am : règles locales hors-ligne, raffinement LLM optionnel (issue #78)",
options: &[("--yes", "exécute la commande sans confirmation")],
example: "ask installe claude et lance-le",
},
TipEntry { TipEntry {
usage: "models", usage: "models",
about: "inventaire des modèles locaux (ollama, llama.cpp, LM Studio)", about: "inventaire des modèles locaux (ollama, llama.cpp, LM Studio)",
@@ -119,6 +125,15 @@ pub static SECTIONS: &[TipSection] = &[
options: &[("add <url>", "ajoute un catalogue d'équipe par URL")], options: &[("add <url>", "ajoute un catalogue d'équipe par URL")],
example: "catalog add https://git.dracodev.net/team/agents.yaml", example: "catalog add https://git.dracodev.net/team/agents.yaml",
}, },
TipEntry {
usage: "registry publish <catalogue.yaml> --source <url>",
about: "registre communautaire : publie, cherche ou installe un catalogue (manifeste + checksum sha256 vérifié)",
options: &[
("search <mot>", "cherche dans le registre"),
("install <url>", "installe après vérification du checksum et décision de confiance"),
],
example: "registry search agents python",
},
TipEntry { TipEntry {
usage: "audit", usage: "audit",
about: "qui a modifié quoi, quand (checksums config + journal d'événements)", about: "qui a modifié quoi, quand (checksums config + journal d'événements)",
@@ -251,6 +266,16 @@ pub static SECTIONS: &[TipSection] = &[
], ],
example: "web --port 9090", example: "web --port 9090",
}, },
TipEntry {
usage: "serve --token <tok>",
about: "API HTTP + WebSocket authentifiée pour piloter am à distance (stats, run, start, stop, ask) (issue #80)",
options: &[
("--port <p>", "port d'écoute (défaut 8080)"),
("--host <h>", "adresse d'écoute (défaut 127.0.0.1)"),
("--rate-limit <n>", "requêtes par IP et par minute (défaut 120)"),
],
example: "serve --token mon-token --port 9000",
},
TipEntry { TipEntry {
usage: "sync", usage: "sync",
about: "pousse l'état (state.json, journal, historique) dans le dépôt git configuré (sync_repo)", about: "pousse l'état (state.json, journal, historique) dans le dépôt git configuré (sync_repo)",
+6 -2
View File
@@ -113,6 +113,7 @@ const COMMAND_DESCRIPTIONS: &[(&str, &str)] = &[
("registry", "publish, search and install agent catalogs (Gitea)"), ("registry", "publish, search and install agent catalogs (Gitea)"),
("providers", "manage the LLM provider registry (base URLs, models, default)"), ("providers", "manage the LLM provider registry (base URLs, models, default)"),
("suggest", "recommend an agent for a request"), ("suggest", "recommend an agent for a request"),
("ask", "natural language → am commands (local rules first, optional LLM refinement)"),
("audit", "who changed what, when (config checksums)"), ("audit", "who changed what, when (config checksums)"),
("service", "register an agent as a system service (autostart)"), ("service", "register an agent as a system service (autostart)"),
("schedule", "plan am commands (daily) and check the fleet health"), ("schedule", "plan am commands (daily) and check the fleet health"),
@@ -798,7 +799,7 @@ pub fn banner_box(
.to_string(), .to_string(),
)); ));
rows.push(inner( rows.push(inner(
" models models · models --prune · catalog · suggest · audit".to_string(), " models models · models --prune · catalog · suggest · ask · audit".to_string(),
)); ));
rows.push(inner( rows.push(inner(
" automate service install · schedule add · doctor --watch · monitor · sync · migrate · playbook".to_string(), " automate service install · schedule add · doctor --watch · monitor · sync · migrate · playbook".to_string(),
@@ -2014,13 +2015,16 @@ pub fn is_am_command(word: &str) -> bool {
| "tip" | "tip"
| "models" | "models"
| "catalog" | "catalog"
| "registry"
| "providers" | "providers"
| "suggest" | "suggest"
| "ask"
| "audit" | "audit"
| "service" | "service"
| "schedule" | "schedule"
| "monitor" | "monitor"
| "web" | "web"
| "serve"
| "sync" | "sync"
| "migrate" | "migrate"
| "playbook" | "playbook"
@@ -2676,7 +2680,7 @@ mod tests {
for cmd in [ for cmd in [
"list", "status", "search", "info", "install", "uninstall", "update", "start", "list", "status", "search", "info", "install", "uninstall", "update", "start",
"stop", "restart", "run", "doctor", "config", "completion", "self-update", "stop", "restart", "run", "doctor", "config", "completion", "self-update",
"self-uninstall", "export", "import", "self-uninstall", "export", "import", "ask", "serve", "registry",
] { ] {
assert!(is_am_command(cmd), "{cmd}"); assert!(is_am_command(cmd), "{cmd}");
} }