Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions BACKLOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -341,3 +341,13 @@ Option : ajouter un paramètre `install_shim` pour mode "exec" vs "source", ou d
- Préciser que `chrome-devtools` peut apparaître dans OpenCode même si non coché au setup : il est préinstallé par agent-vm (pas par Albert Code).
- Documenter ce MCP dans la liste du README avec sa source (agent-vm). À investir avec Sylvain : le désactiver côté runtime quand non sélectionné, ou le documenter clairement.
**DoD :** le README mentionne chrome-devtools comme venant d'agent-vm. Investigation documentée.

### T6.12 🟠 `install_shim` idempotent : réécrire si contenu changé `<- AC-R025` ✅ implémenté
**But :** `install_shim` fait « si le fichier shim existe → return 0 » → quand le contenu du shim évolue (ex. fix exec d'AC-R022), une réinstall ne repose PAS le nouveau shim. Il faut `rm` manuel.
**Tâches :** dans `install_shim` (`lib/ui.sh`), avant de skip un shim existant, comparer les 3 premières lignes du fichier existant avec le `shim_content` attendu. Si différent : réécrire. Si identique : skip.
**DoD :** après un changement de contenu du shim, `./install.sh` réécrit le fichier (au lieu de « déjà présent »). → `TESTS.md` S36.

### T6.13 🟡 Bruit de debug « name= » dans sync_skills `<- AC-R026` ✅ implémenté
**But :** au boot VM (`runtime/agent-vm.runtime.sh`, sync_skills), des lignes « name=<skill> » parasites apparaissent dans la sortie (ex. name=datagouv-apis). Bruit dû aux variables `local name` + `name=$(basename …)` en bash 3.2.
**Tâches :** remplacer les déclarations `local name` puis `name="$(basename …)"` par `local name="$(basename …)"` (fusion local+assignation), et idem pour `local ename`, `local resolved`. Supprime la source probable du bruit.
**DoD :** la sortie de sync_skills n'affiche que les messages _ok/_info/_warn, plus de lignes « name= ». → `TESTS.md` S36 (vérification sortie propre).
4 changes: 3 additions & 1 deletion FEEDBACK.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,14 @@
| AC-R016 | 🎛️ | 🟡 | Choix de profil (beta.gouv / La Suite / IAE / Autre) déroutant pour qui n'est pas familier de cette typologie. Question posée trop tôt, avant toute configuration. La valeur « Autre » donne l'impression d'avoir choisi par défaut. | Test utilisateur S28 2026-07 | 🆕 à trier | — |
| AC-R017 | ✨ | 🟠 | Au setup, on aimerait choisir quelles skills et MCP on branche (Y/N). La config ouverte ne donne aucun contexte de ce qu'apporte chaque brique — « est-ce que j'ai besoin de playwright pour mon projet ? » | Test utilisateur S28 2026-07 | 🆕 à trier | — |
| AC-R018 | 🎛️ | 🟡 | Bascule FR->EN vers le wizard agent-vm : quand install.sh passe la main à `agent-vm setup`, le wizard natif d'agent-vm (en anglais) s'affiche sans prévenir. Déroutant pour un public non-tech francophone. | Dogfood install 2026-07 | ✅ traité | `BACKLOG.md` T6.5 · `TESTS.md` S30 |
| AC-R019 | 🐛 | 🔴 | À l'étape auth GitHub, `install.sh` demande « Email noreply GitHub » avec pour défaut le vrai email de l'utilisateur, qui échoue la validation. Un utilisateur non-tech ne connaît pas son email noreply ni comment le trouver. | Dogfood install 2026-07 | ✅ traité | `BACKLOG.md` T6.6 · `TESTS.md` S31 |
| AC-R019 | 🐛 | 🔴 | À l'étape auth GitHub, `install.sh` demande « Email noreply GitHub » avec pour défaut le vrai email de l'utilisateur, qui échoue la validation. Un utilisateur non-tech ne connaît pas son email noreply ni comment le trouver. | Dogfood install 2026-07 | 🔧 en cours (réouvert) | `BACKLOG.md` T6.6 · `TESTS.md` S31 (séd non matché, corrigé dans hotfix #2) |
| AC-R020 | ⚙️ | 🟠 | `agent-vm setup` installe 4 harnais (Claude Code, OpenCode, Codex, Mistral Vibe). En test réel, l'installeur Mistral Vibe a retourné HTTP 429 (rate limit) et TOUT le setup a échoué, alors qu'Albert Code n'a besoin que d'OpenCode. Un seul installeur qui rate = base non finalisée. Le retry a fonctionné (429 transitoire), mais risque de fiabilité à l'install party (plusieurs testeurs en parallèle). Dépendance upstream agent-vm. | Dogfood install 2026-07 | 📥 backlogué | `BACKLOG.md` T6.7 |
| AC-R021 | 🐛 | 🟠 | (a) install avortée sans shim : `install.sh` a `set -e` et `install_shim` est appelé APRÈS la création fragile de la VM de base. Un échec d'`agent-vm setup` (429) fait sortir l'installeur en erreur AVANT de poser le shim -> install incomplète, aucune commande `albert-code`. (b) ancien installeur MVP écrivait une fonction shell `albert-code()` dans ~/.zshrc, qui masque le shim PATH -> le nouveau shim est ignoré. | Dogfood install 2026-07 | ✅ traité | `BACKLOG.md` T6.8 · `TESTS.md` S32 |
| AC-R022 | 🐛 | 🔴 | Le shim `albert-code` (généré par `install_shim`) avale les prompts interactifs : il source le script avec `2>/dev/null` (avale stderr où `confirm()`/`prompt_*` écrivent) puis appelle `$name "$@"`. Résultat : `albert-code setup` affiche l'entête puis semble figé (questions MCP/skills invisibles, `read` attend). | Dogfood install 2026-07 | ✅ traité | `BACKLOG.md` T6.9 · `TESTS.md` S33 |
| AC-R023 | 🎛️ | 🟡 | MCP chrome-devtools présent malgré 0 MCP sélectionné : `agent-vm` le préinstalle au niveau global de la VM. Pas une fuite (MCP local), mais ça casse la transparence « ce que je choisis = ce que j'ai » du public souveraineté. À cadrer avec Sylvain (agent-vm). | Dogfood install 2026-07 | 📥 backlogué | `BACKLOG.md` T6.11 |
| AC-R024 | 🐛 | 🟠 | L'agent scaffold un projet react-dsfr (npm install) puis commit SANS .gitignore -> `node_modules/` dans la PR : 41659 fichiers, +5,4M lignes. Hygiène cassée + risque sécurité (sans .gitignore, un `.env` part aussi facilement). | Dogfood E2E 2026-07 | ✅ traité | `BACKLOG.md` T6.10 · `TESTS.md` S34 |
| AC-R025 | 🐛 | 🟠 | `install_shim` fait « si le fichier shim existe → return 0 » → quand le contenu change (ex. fix exec d'AC-R022), un `git pull && ./install.sh` ne repose PAS le nouveau shim. Il faut `rm` manuel. Pas idempotent pour les mises à jour. | Dogfood hotfix re-test 2026-07 | ✅ traité | `BACKLOG.md` T6.12 · `TESTS.md` S36 |
| AC-R026 | 🐛 | 🟡 | Au boot VM (`runtime/agent-vm.runtime.sh`, sync_skills), la sortie affiche des lignes parasites « name=<skill> » (ex. name=datagouv-apis, name=react-dsfr). Bruit de debug, comptage correct mais gène la lisibilité. | Dogfood hotfix re-test 2026-07 | ✅ traité | `BACKLOG.md` T6.13 |

---

Expand Down
21 changes: 21 additions & 0 deletions TESTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -264,3 +264,24 @@ et le bloc marqueur a disparu.
4. Vérifier que `git status` avant commit ne montre que des fichiers source (pas node_modules, pas .env).
5. (Négatif) Sans `.gitignore`, `git status` montre des dossiers inattendus → l'agent s'arrête et crée `.gitignore`.
**Attendu :** `.gitignore` adapté à Node, PR sans dépendances ni secrets.

## S35 — Dérivation noreply : sed match correct de la réponse JSON GitHub (T6.6, AC-R019) ☐
**Préconditions :** un PAT GitHub valide (scope `repo`), `curl` disponible.
**Étapes :**
1. Lancer `bash -c 'source lib/ui.sh; source lib/phases.sh'` dans un dossier sandbox.
2. Simuler la réponse de l'API : `curl -fsS -H "Authorization: Bearer $PAT" https://api.github.com/user`
3. Vérifier que le login et l'id sont extraits correctement avec les patterns sed corrigés.
4. Tester que `gh_login` contient l'id numérique, `gh_id` contient le login.
5. Vérifier l'email final = `{id}+{login}@users.noreply.github.com`.
**Attendu :** pas de fallback « Introuvable automatiquement » avec un PAT valide. L'email dérivé est correct.

## S36 — `install_shim` réécrit un shim obsolète + sortie sync_skills propre (T6.12, T6.13) ☐
**Préconditions :** dossier sandbox `/tmp/ac-test`, `install.sh` disponible.
**Étapes (install_shim) :**
1. Lancer `HOME=/tmp/ac-test SHIM_BIN_DIR=/tmp/ac-test/bin ./install.sh --dry-run` (crée shim vide).
2. Modifier le contenu attendu du shim (forcer une différence).
3. Relancer l'install → vérifier que le shim est réécrit (pas « déjà présent »).
**Étapes (sync_skills) :**
4. Simuler un boot VM : `bash runtime/agent-vm.runtime.sh --dry-run` dans un dossier projet scaffoldé.
5. Inspecter la sortie de `sync_skills` pour les lignes commençant par « name= ».
**Attendu :** (3) shim réécrit lors d'un changement de contenu, pas besoin de `rm` manuel. (5) aucun « name= » dans la sortie, seulement des `_ok`/`_info`/`_warn`.
4 changes: 2 additions & 2 deletions lib/phases.sh
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,8 @@ phase_a() {
_raw="$(printf '%s' "$_raw" | sed '$d')"
fi
if [ "${_http_code:-0}" -ge 200 ] 2>/dev/null && [ "${_http_code:-0}" -lt 300 ] 2>/dev/null && [ -n "$_raw" ]; then
gh_id="$(printf '%s' "$_raw" | sed -n 's/.*"login[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')"
gh_login="$(printf '%s' "$_raw" | sed -n 's/.*"id[[:space:]]*:[[:space:]]*\([0-9]*\).*/\1/p')"
gh_id="$(printf '%s' "$_raw" | sed -n 's/.*"login"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')"
gh_login="$(printf '%s' "$_raw" | sed -n 's/.*"id"[[:space:]]*:[[:space:]]*\([0-9]*\).*/\1/p')"
if [ -n "$gh_id" ] && [ -n "$gh_login" ]; then
git_name="$gh_id"
git_email_def="${gh_login}+${gh_id}@users.noreply.github.com"
Expand Down
8 changes: 6 additions & 2 deletions lib/ui.sh
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,12 @@ $name \"\$@\""
fi

if [ -f "$shim_path" ]; then
ok "shim $name déjà présent dans $shim_path"
return 0
local _existing
_existing="$(head -3 "$shim_path" 2>/dev/null || true)"
if [ "$_existing" = "$(printf '%s' "$shim_content" | head -3)" ]; then
ok "shim $name déjà présent et à jour dans $shim_path"
return 0
fi
fi
apply_write "créer le shim $name dans $shim_path" "$shim_path" "$shim_content"
apply_chmod "chmod +x 755 $shim_path" 755 "$shim_path"
Expand Down
9 changes: 3 additions & 6 deletions runtime/agent-vm.runtime.sh
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,7 @@ sync_skills() {
local all_skills=""
for _entry in "$SKILLS_CACHE/skills"/*/; do
[ -d "$_entry" ] || continue
local name
name="$(basename "$_entry")"
local name="$(basename "$_entry")"
case "$name" in .*|.experimental|.git) continue ;; esac
all_skills="${all_skills} ${name}"

Expand Down Expand Up @@ -221,11 +220,9 @@ sync_skills() {
if [ "$use_manifest" -eq 1 ]; then
for _existing in "$SKILLS_TARGET"/*/; do
[ -L "$_existing" ] || continue
local ename
ename="$(basename "$_existing")"
local ename="$(basename "$_existing")"
# Ne retirer QUE les symlinks vers le cache skills État
local resolved
resolved="$(readlink "$_existing" 2>/dev/null || true)"
local resolved="$(readlink "$_existing" 2>/dev/null || true)"
case "$resolved" in
*/etalab-ia/*|*/skills/*) ;;
*) continue ;; # pas une skill État, on laisse
Expand Down
Loading