Il y a quelque temps, j’ai décidé d’apprendre un peu de Rust. J’ai acheté un livre, je l’ai ouvert des mois plus tard et j’ai lancé un petit projet parallèle : porter mon package R saperlipopette sur le terminal en écrivant une CLI avec Rust. J’ai alors perdu de la vigueur et abandonné le projet. Maintenant, enseigner davantage de Git avec saperlipopette me donne envie de faire la même chose en dehors de R, pour toucher plus d’apprenants. Et en attendant, même si j’ai des sentiments contradictoires à ce sujet, j’ai réalisé que recourir à un LLM, notamment Claude Code (Opus 4.6), m’aiderait à faire franchir la ligne d’arrivée à ma CLI !
Ce que ma CLI avait déjà
Le projet CLI comportait déjà quelques exercices, tous les « Oh merde, Git ! exercices de saperlipopette. Il avait une mauvaise réputation : ohcrabgit, un jeu de mots basé sur « Oh merde, Git ! et sur le logo de Rust étant un crabe. Ce n’est certainement pas quelque chose que vous souhaitez taper encore et encore dans un terminal.
Son interface était la suivante :
- Vous créeriez un exercice dans un dossier en tapant une commande dans le terminal.
- Vous ouvririez ensuite ce dossier et liriez le fichier
instructions.txtpour savoir quoi faire, alors le fichiertip.txtau cas où vous auriez besoin d’indices.
Je voulais conserver cette interface, car elle est assez simple et fonctionnerait quel que soit ce que les gens utilisent habituellement pour travailler avec Git. Ils utilisent sûrement Git quelque part où ils peuvent lire des fichiers texte.
Il disposait d’une infrastructure interne : par exemple un fichier appelé git.rs qui avait des fonctions utilitaires telles que init_playground ou create_branch. Il utilisait notamment la Rust crate git2, pour les aspects Git.
Chaque ligne avait été minutieusement écrite par moi, avec l’aide d’un moteur de recherche et des messages d’erreur utiles du compilateur. 😅
Ce que je voulais pour la CLI
Je n’étais plus tellement intéressé à écrire du code Rust moi-même. Peut-être qu’un jour cela sera pertinent pour mon travail, mais ce n’est pas le cas pour le moment. Je voulais agrandir la CLI pour qu’elle corresponde aux fonctionnalités de saperlipopette : plus d’exercices, et des traductions des instructions/astuces en français et en espagnol. Avec ce produit final, je devrais pouvoir enseigner les mêmes ateliers qu’avant, mais en utilisant la CLI au lieu de saperlipopette si mon public n’était pas uniquement composé d’utilisateurs de R.
J’ai également souhaité améliorer la mise en forme de l’aide, ainsi que les instructions d’installation.
Le projet s’est bien passé ! J’ai un abonnement Claude Code, j’appelle Claude depuis le terminal, depuis Positron IDE. Notez que j’ai atteint la limite de débit d’une séance juste avant l’heure de mon cours de Pilates, donc ce n’était pas trop mal d’attendre. 🧘
Voici ce qui a été produit dans le code source de zut, et examiné par moi, le débutant de Rust, donc pas extrêmement en profondeur :
- Améliorations du formatage de l’aide. J’ai repoussé les chaînes ANSI dans le code et demandé des couleurs plus accessibles (je ne suis pas sûr qu’elles soient le meilleur choix). Commettre.
- J’ai choisi un meilleur nom pour la CLI, le mot maudit français « zut » (« putain »). Claude a renommé partout, ce qui était particulièrement paresseux de ma part. Commettre.
- Les instructions d’installation doivent maintenant être exécutées
cargo install --gitsuggestion de Claude, puisque le public de mon outil devrait être majoritairement constitué de développeurs. Je suppose que je verrai quels sont les problèmes lorsque les gens essaieront de l’installer sur différentes plates-formes… S’engager. - La CLI génère désormais des instructions et des conseils dans différentes langues en fonction des paramètres régionaux du système, d’une variable d’environnement ou d’un indicateur. J’ai demandé que les paramètres régionaux du système soient ceux par défaut. Dans ce même flux de travail, Claude a ajouté d’autres tests unitaires, que je n’ai même pas demandés, et des tests d’intégration, que j’ai demandés après avoir vu que le dossier tests était vide. Commettre
- Tous les nouveaux exercices de saperlipopette ont été portés sur zut en français, anglais et espagnol, et ils ont été classés dans l’aide ainsi que dans la documentation (qui est pour le moment… le README). J’ai essayé de les exécuter, ce qui a conduit à de petits ajustements (lignes vides à la fin des fichiers) et à des ajustements plus importants (par exemple, l’exercice git bisect dans saperlipopette vous demande d’exécuter un script R, mais il devait devenir un script shell pour qu’il ait un sens en zut). Commettre.
- Correction d’un bug, puisque zut ne fonctionnait que… depuis le dossier contenant sa source. 🤦 S’engager.
L’état de zut
Pour installer zut :
cargo install --git
Pour afficher l’aide :
zut --help
dont la sortie est :
Create example Git messes to solve, inspired by
Usage: zut <EXO>[TARGET]. In the exercise folder, open instructions.txt.
Arguments:
<EXO>
Name of the exercise
Possible values:
- time-machine: Oh shit, I did something terribly wrong, please tell me git has a magic time machine!?!
- small-change: Oh shit, I committed and immediately realized I need to make one small change!
- latest-message: Oh shit, I need to change the message on my last commit!
- committed-to-main: Oh shit, I accidentally committed something to main that should have been on a brand new branch!
- committed-to-wrong: Oh shit, I accidentally committed to the wrong branch!
- undo-commit: Oh shit, I need to undo a commit from like 5 commits ago!
- undo-file: Oh shit, I need to undo my changes to a file!
- split-changes: Hey I'd like to split these changes to the same file into several commits!
- clean-dir: Hey, how do I remove all my debugging left-over stuff at once?
- conflict: Hey I'd like to see what merge conflicts look like!
- rebase-i: Hey I'd like to make my commits in a branch look informative and smart! (interactive rebase)
- reset: Hey I'd like to restart from scratch and reorganize my commits! (git reset --mixed)
- bisect: Hey I'd like to find which commit introduced a bug!
- log-deleted-file: I want to find which commit deleted a file!
- log-deleted-line: I want to find which commit deleted a line!
- revparse: I want to understand ancestry references like HEAD~5 and HEAD^^!
- blame: I want to find who added a specific line and when!
- worktree: I need to see what the project looked like at a certain version!
[TARGET]
Where to create the exercise directory. Default: temporary directory
[default: tempdir]
Options:
--lang <LANG>
Language (default: auto-detected from system locale)
[possible values: en, fr, es]
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
Examples:
zut small-change creates the small-change exercise folder in a temporary folder.
zut latest-message .. creates the latest-message exercise folder in the parent of the current folder.
Categories:
Oh shit, Git!:
time-machine, small-change, latest-message, committed-to-main,
committed-to-wrong, undo-commit, undo-file
Clean history:
split-changes, clean-dir, conflict, rebase-i, reset
Use history:
bisect, log-deleted-file, log-deleted-line, revparse, blame, worktree
Pour créer l’exercice Time Machine dans un dossier temporaire :
zut time-machine
Le chemin d’accès au dossier est imprimé à l’écran afin que vous puissiez l’ouvrir, lire instructions.txt là-bas et mettez-vous au travail : dans ce défi, un git reset --hard trop de choses ont été exécutées, donc vous en avez besoin git reflog pour sauver un commit important.
Pour créer l’exercice de blâme dans un dossier au dessus de celui actuel, en français :
zut blame .. --lang fr
Dans ce défi, vous devez trouver qui a commis une ligne donnée dans un script. Dr Jekyll ou M. Hyde ? git blame va aider!
Enfin et surtout, si vous essayez de créer un exercice quelque part où il existe :
zut blame .. --lang fr
vous obtenez :
Exercise folder already exists: ../exo-blame — delete it or choose a different target.
Conclusion : travaux futurs
L’utilisation de Claude Code m’a aidé à porter les fonctionnalités du package saperlipopette R vers la CLI zut. Les prochaines étapes consistent à utiliser zut davantage au-delà des tests que j’ai effectués, pour détecter d’autres problèmes. Supposons que je doive enseigner à nouveau « Améliorez sans douleur votre historique Git », je referais tous les exercices d’affilée. Je ferais cela dans le langage humain de l’atelier.
Je pourrais également améliorer le code de la CLI en fonction des commentaires des utilisateurs et, disons, des commentaires de Claude Code en utilisant la compétence posit-dev/critical-code-reviewer (merci à Mo de m’en avoir parlé !). La documentation pourrait également nécessiter un peu de travail, par rapport à saperlipopette, mais en tant que compagnon d’ateliers, cela pourrait être acceptable.
Le package saperlipopette lui-même a été soumis à l’examen par les pairs du logiciel rOpenSci, je m’attends donc à ce qu’il change pour le mieux. Lorsque j’ai besoin de porter ces modifications, en fonction de leur nature, je pourrais à nouveau recourir à Claude Code.
En rapport
Berita Terkini
Berita Terbaru
Daftar Terbaru
News
Jasa Impor China
Berita Terbaru
Flash News
RuangJP
Pemilu
Berita Terkini
Prediksi Bola
Technology
Otomotif
Berita Terbaru
Teknologi
Berita terkini
Berita Pemilu
Berita Teknologi
Hiburan
master Slote
Berita Terkini
Pendidikan
Resep
Jasa Backlink
Slot gacor terpercaya
Anime Batch