Deux défauts d'usage de la zone centrale de l'IDE.
1. Ouvrir un fichier affichait une page vide. Le conteneur de l'unique instance
Monaco vivait sous le `v-if="activeTab"` : monté sans onglet actif (premier
usage, ou après avoir tout fermé), `onMounted` sortait en silence sur
`!host.value`, `ready` restait faux pour toujours, et les deux watchers
d'affichage étaient gardés par lui. Le conteneur est désormais toujours monté
(v-show, jamais v-if : sous un v-if, fermer le dernier onglet détruisait le
DOM et l'éditeur gardait une référence sur un noeud détaché) et l'éditeur est
créé paresseusement depuis `showTab`, devenu l'unique entonnoir d'affichage.
`useMonaco` ne mémoïse plus un échec, l'attente et l'erreur sont visibles, et
la relecture disque ne se tait plus. Sur mobile, ouvrir un fichier amène enfin
la zone centrale au premier plan et la valeur morte `mobilePanel = 'sidebar'`
disparaît (migrée).
Trouvé par l'E2E : seul l'`editor.worker` était fourni, donc ouvrir un `.ts`
lançait le service TypeScript contre un worker qui n'en connaissait pas les
méthodes, et jetait un rejet non géré à chaque ouverture. Les workers de
langage sont fournis (chunks à la demande), diagnostics sémantiques coupés
(sans tsconfig ni node_modules, ils inventeraient des erreurs).
2. Le statut git était à l'étroit et mono-projet. La zone centrale porte un mode
« Fichiers / Changements » (bascule à icônes dans la barre d'onglets, donc
accessible même sans onglet ouvert). La vue Changements montre un bloc par
worktree pour TOUS les projets ouverts : fichiers indexés et non indexés, diff
déplié sur place, commit, push, fetch, pull et historique par bloc. Le panneau
Git de la barre latérale devient l'index (compteurs déjà diffusés par WS, donc
zéro requête) et le badge de la barre d'activité, codé à 0, compte enfin les
worktrees à traiter.
Au passage : `canPush` était faux dans les deux sens (actif sans rien à
pousser, bloqué en étant seulement en retard), l'amend d'un message seul est
accepté comme le serveur le permettait déjà, le rebase est proposé dès qu'on
est en retard, une confirmation d'abandon ne survit plus au rechargement de la
liste, et `commit`/`fetch`/`push` émettent enfin `worktree_changes` (le
compteur « n non poussés » restait périmé juste après un push).
Vérifié : 528 tests, acceptations P7/P9/P14/P15, `verify-ui` (4 captures
nouvelles) et un `verify-editor` qui prouve par clics réels l'ouverture d'un
fichier sans onglet persisté, la fermeture/réouverture, la bascule mobile et le
chunk éditeur absent. Ce dernier échoue bien si l'on remet le conteneur sous un
v-if.
Remplace les 547 tirets cadratins (U+2014) et demi-cadratins (U+2013) des fichiers versionnés par la ponctuation contextuelle adaptée (point médian, deux-points, virgule, parenthèses ; tiret simple pour les plages), sur 122 fichiers (appli, vitrine, doc, tests, workflows, scripts).
Ajoute le job CI « lint-dashes » (git grep -P) qui échoue si un tiret cadratin/demi-cadratin réapparaît, hors logo binaire et captures brutes du terminal (fidélité des fixtures de détection de dialogue).
- renomme le paquet en @johanleroy/git-arboretum (scope routé vers le registre npm Gitea privé)
- embarque @arboretum/shared via bundleDependencies (scripts/vendor-shared.mjs au prepack)
- joint README/LICENSE au tarball (scripts/copy-meta.mjs) + metadata, keywords, publishConfig
- CI pack-smoke en mono-tarball avec assertion bundleDep ; nouveau workflow release.yml (publish sur tag v*)
- version 1.0.0 ; README mis à jour (install scopé + service systemd)
Les `packages/*/tsconfig.tsbuildinfo` étaient commités alors que `dist/`
est gitignoré. Sur un checkout neuf de la CI, `tsc -b` lit ce tsbuildinfo,
juge `@arboretum/shared` déjà émis et saute la génération de `dist/` →
`TS2307: Cannot find module '@arboretum/shared'` sur tout le serveur
(+ une `TS7006` en cascade). On dé-tracke les tsbuildinfo et on les ignore.
README et CLAUDE.md reflètent désormais la réalité : découverte/reprise,
worktrees multi-repo, états fins et dashboard sont livrés et testés. La
prochaine phase est P4 (supervision mobile : answer + Web Push + PWA).
Fan-out integration + fixes found by the test/acceptance pass:
- FIX ring-buffer: chunks >= capacity skipped bytes now count into the
monotonic offset (invariant: stream byte k lives at k % capacity) —
window order was corrupted on unaligned big chunks
- FIX auth: non-numeric cookie expiry no longer bypasses expiration
- FIX protocol: safe-integer validation on ack.bytes / hello.protocol
- FIX @fastify/websocket v11: websocket route must be registered in an
encapsulated context after plugin load (handler got REST signature)
- FIX flow-control deadlock found by e2e acceptance: client only ACKs
on data receipt, so pausing with an unACKed residue in (LOW,
ACK_EVERY] stalled both sides at 0.9 MB. ACK_EVERY now 64 KiB (<=
LOW invariant, tested) + trailing debounced ACK in the web client
- Web: Vue 3 + Vite + Pinia + Tailwind 4 + vue-i18n (EN/FR) + xterm 6
(fit + webgl fallback), multiplexed ws-client with reconnect/backoff
and resync epochs
- Tests: 100 vitest (protocol fuzz, ring edges, auth, pty-manager flow
control with mocked pty, REST e2e) ; CI Node 22/24 + pack-smoke
- scripts/acceptance-p1.mjs: real daemon + real WS client — boot,
login, attach, stdin, 10 MB flood w/ ACK (13.7 MB/1.9s, RSS bounded),
brutal disconnect + replay resync, kill broadcast, SIGTERM drain
Arboretum — self-hosted web dashboard for git worktrees and the Claude
Code sessions running on them. README states the positioning vs
GitKraken Agent Mode, Happy/CloudCLI and Anthropic Remote Control, the
security model (localhost-first + Tailscale), and the Claude usage note.