Chronologie
D'où vient CapyCode, et pourquoi il est fait ainsi. Cette page retrace les grandes étapes ; le détail est dans git log, et les raisons des choix dans Décisions.
Le prototype (6 – 16 octobre)
Nicolas Poulain construit en dix jours, avec un agent IA, un prototype très complet : explorateur, onglets, CodeMirror, Git avec isomorphic-git (panneau, graphe, comparaisons), terminal avec ses commandes de fichiers, de Git et de Python, partage par URL, export ZIP, PWA. L'exécution repose sur Pyodide (un noyau « autonome » maison) et sur une intégration de Basthon.
Les notes de cette période (feuille de route en 21 étapes, plan RGAA, notes sur Git) sont conservées dans docs/historique/, hors du site.
La reprise (16 – 17 octobre)
Romain Casati reprend le projet. Une synthèse critique, vérifiée dans le navigateur, montre que l'intégration de Basthon ne tient pas :
- le bouton ▶ échouait sur tout script,
input()gelait le noyau,import utilsetsys.argvne marchaient pas, numpy ne se chargeait pas, une sortie turtle restait blanche ; - le code de l'élève tournait dans l'origine de l'application : il pouvait lire l'IndexedDB du projet et du dépôt Git ;
- 26 Mo de fichiers Basthon et Pyodide étaient commités dans
public/, le build pesait 74 Mo, dont 58 Mo précachés ; - les tests remplaçaient Basthon par Pyodide : aucun ne l'exécutait vraiment.
L'exécution est refaite de zéro : Pyodide autonome supprimé, noyaux Basthon officiels installés depuis npm et utilisés tels quels dans leurs workers isolés, publiés par un plugin Vite (build ramené à 29 Mo). Viennent ensuite le chargement à la demande de Ruff, la synchronisation des stores par événements (fini les rafraîchissements manuels), le découpage des plus gros fichiers (CommandPalette.vue 1 165 → 419 lignes, App.vue 850 → 388) et cette documentation, sous VitePress, avec la skill qui la tient à jour.
Démarrage rapide et refonte (20 octobre)
Basthon 0.84 garde un instantané mémoire de Pyodide : un noyau Python démarre en ~1 s au lieu de ~4 s. CapyCode passe en 0.85.2 et en profite sans rien changer à son intégration ; les fenêtres tkinter fonctionnent.
Un audit d'architecture liste ce qui empêchait le projet de grandir ; il est traité dans la foulée :
- CI qui lance enfin les tests, ESLint avec frontières entre couches ;
- objet
Workspaceet instantanés de projet versionnés (les anciens liens de partage cessent de fonctionner, choix assumé) ; - registre des langages, registre de commandes (menus, palette, raccourcis), contrôleurs d'éditeur ;
- terminal sans dépendance aux stores, une session par console (avant, « Terminal 2 » montrait le contenu du premier) ;
- interface en anglais par défaut, traduite, sans aucun texte en dur ; plus aucun dialogue natif.
Accessibilité, tests et langues (21 octobre)
- RGAA : couleurs sémantiques contrastées, motifs WAI-ARIA portés par des briques communes, tout au clavier, 0 violation axe-core sur 17 états de l'interface dans les deux thèmes.
- Fin de l'audit :
GitServicepar composition, storeruntimeséparé de l'affichage, erreurs typées, skills des agents en un seul endroit. - Tests : le cahier des charges de Frédéric Zinelli (
testing.md) est appliqué : tests rangés par domaine, documentés, et tests de bout en bout Playwright avec les vrais noyaux. Ils révèlent un bug (python -m paquet) ;pythonseul bascule désormais vers la console Python,pip installinstalle vraiment. - Qualité : plus aucun avertissement ESLint, hook
pre-commitqui le garantit. - Dix langues d'interface (traductions automatiques à faire relire).
- Exécution : tracebacks qui nomment le fichier, Ctrl+D dans
input(). - Déploiement : une mise à jour n'apparaissait qu'après Ctrl+Maj+R. Le service worker charge désormais la page depuis le réseau, recharge une page restée ouverte, les noyaux sont publiés sous un dossier versionné, et une configuration Apache part avec le site.
Vers Capytale (22 octobre)
Première option réglable par la page hôte : Git désactivable par postMessage, à chaud, sans paramètre d'URL.
Documentation publiée (24 octobre)
Cette documentation est complétée (visite guidée, recettes, pages Git, éditeur, projet, analyse Python, section Évolution) et publiée avec l'application, sous /p/capycode/doc/. Elle s'ouvre aux utilisateurs avec un guide d'utilisation pour les élèves et les enseignants, illustré de captures d'écran prises dans l'application par un script Playwright rejouable. Le guide existe aussi en anglais (25 octobre), langue par défaut de l'interface, avec ses propres captures ; un bouton de la barre du haut passe d'une langue à l'autre sur la même page.
Les défauts repérés en la rédigeant sont corrigés : textes du linter traduits, historique d'annulation gardé par onglet, fichiers binaires écartés des liens de partage. Surtout, une fusion en conflit ne s'arrête plus sur un refus : comme avec Git, elle laisse des marqueurs dans les fichiers, que l'élève résout dans l'éditeur (boutons ou commandes), puis termine par un commit de fusion ou abandonne, depuis le panneau Git ou le terminal.
Basthon 0.88 (27 octobre)
CapyCode passe de Basthon 0.85.2 à 0.88 sans changer son intégration : Graphviz 16, p5.js 1.11 avec le son et la webcam dans le noyau isolé, tortue largement complétée (undo, formes, textinput, mode logo…), IPython.display.Code. Seule la demande d'accès à la caméra, que Basthon faisait par un window.confirm en français, passe par une fenêtre de CapyCode, traduite.
Extensions intégrées (27 octobre)
Les fonctionnalités avancées et les langages secondaires deviennent des extensions intégrées, activables depuis un panneau Extensions (Ctrl+Maj+X, icône de blocs). Le linter est activé par défaut ; Git, le formateur de code, la structure du document, le support SQL et le support OCaml sont désactivés par défaut. SQL et OCaml ne chargent pas leurs interpréteurs tant que leur extension n'est pas activée. Chaque extension affiche son logo officiel de langage (Python, Git, SQL, OCaml).
Sous-menus dans la barre de menus (27 octobre)
Le menu Affichage s'allège : les réglages de Thème, de Langue et de Police d'écriture deviennent des sous-menus déroulants ouverts au survol ou au clavier (→), refermables avec ← ou Échap. La navigation reste accessible (motif WAI-ARIA menubar, 0 violation axe-core).
Partage compressé fflate et transmission des extensions (27 octobre)
Le format d'instantané de projet passe en version 2 (SNAPSHOT_VERSION = 2) : compression fflate (DEFLATE + Base64URL) remplaçant lz-string. Les fragments d'URL partagés gagnent entre 60 % et 75 % de compacité, assurant la pérennité des liens même avec de nombreux commits ou fichiers. La fenêtre de partage permet désormais de choisir les extensions actives requises par le projet pour les activer chez le destinataire.
Tenir cette page à jour
Une étape marquante (nouvelle fonction visible, changement d'architecture, intégration) s'ajoute ici, dans le même commit que le changement. Une simple correction n'y a pas sa place.