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
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,21 @@

---

## ✳️ 2 octobre 2026 — Les jokers `*`, `?` et `[...]` fonctionnent

*Terminal Linux et macOS · comportement vérifié sur bash 5.2 (Ubuntu 24.04)*

- **`ls *.md`, `rm documents/*.txt`, `cat documents/*`, `wc -l documents/*`** : le terminal remplace maintenant les jokers par les fichiers qui correspondent, comme bash. Avant, `*` restait écrit tel quel et la commande cherchait un fichier nommé « * ».
- Les règles sont celles de bash : les fichiers cachés ne sont pris que par un motif qui commence par un point, `*/` ne garde que les dossiers, `[!d]*` exclut, et un motif entre guillemets ou précédé de `\` reste écrit tel quel. Quand rien ne correspond, le mot reste inchangé : `ls *.txt` répond `cannot access '*.txt'`, comme sur un vrai système.
- **`ls` avec plusieurs fichiers ou dossiers** les affiche tous, comme GNU `ls` : d'abord les fichiers, puis chaque dossier sous son nom. Avant, seul le premier apparaissait. `ls -A`, `ls -r`, `ls -lF`, `--all` et `--` répondent aussi comme le vrai, et une erreur rend le code de sortie 2.
- **Les commandes qui reçoivent plusieurs fichiers les traitent tous** : `chmod +x documents/*`, `rm *` (un message par dossier refusé), `mkdir`, et `head` / `tail`, qui affichent chaque fichier sous un en-tête `==> nom <==`. `head -2` fonctionne, et `rm -f` se tait quand il n'y a rien à effacer.
- **Les jokers marchent aussi dans les redirections** : `echo hi > documents/*.md` écrit dans `rapport.md`, et `echo hi > *` répond `ambiguous redirect` comme bash. `cd d*` répond `too many arguments` quand deux dossiers correspondent.
- Les classes `[[:alpha:]]`, `[[:lower:]]`… sont reconnues entre crochets.
- Un audit de 573 commandes comparées au vrai bash a guidé ces corrections.
- Sous Windows, rien ne change : PowerShell laisse chaque cmdlet lire les jokers elle-même.

---

## 🔎 2 octobre 2026 — Chercher des fichiers et enchaîner : `find`, `xargs`, `rmdir`

*Phase 5d, lot 1 · sorties vérifiées sur Ubuntu 24.04 (findutils 4.9, coreutils 9.4, grep 3.11)*
Expand Down
10 changes: 10 additions & 0 deletions STORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -1295,6 +1295,16 @@ Une capture a aussi mal tourné. Une commande passée à WSL a été découpée

Dernière découverte, la plus importante pour la suite : le terminal Linux ne remplace pas les jokers. `ls *.txt` ou `rm documents/*` échouent, alors que c'est l'un des premiers réflexes de bash. Ce sera la prochaine correction.

### Une étoile qui ne voulait rien dire (2 octobre 2026)

Le dernier défaut révélé par `find` était le plus étonnant : depuis le début, le terminal ne connaissait pas les jokers. Un élève qui tapait `rm *.txt` recevait « No such file or directory », comme si un fichier s'appelait vraiment « * ».

Dans bash, ce n'est pas la commande qui comprend l'étoile, c'est le shell. Avant même que `rm` démarre, bash remplace `*.txt` par la liste des fichiers qui correspondent. Le simulateur le fait maintenant au même endroit, au moment où il découpe la ligne en mots. Il retient pour chaque caractère s'il a été tapé librement ou protégé par des guillemets ou une barre oblique inverse, puisque `'*'` et `\*` doivent rester des étoiles.

Les quarante captures faites sur le vrai bash ont fixé le reste : l'ordre des résultats, les fichiers cachés, `*/` pour les dossiers, et le mot laissé tel quel quand rien ne correspond. Elles ont aussi montré que `ls` n'affichait que le premier fichier quand on lui en donnait plusieurs, un défaut invisible tant que personne ne pouvait taper `ls documents/*`.

L'auditeur de fidélité a ensuite rejoué 573 commandes contre le vrai bash. Le cœur des jokers tenait bon, mais l'étoile a révélé une famille entière de défauts cachés : `chmod`, `rm`, `mkdir`, `head` et `tail` ne traitaient que leur premier fichier. Personne ne l'avait vu, parce qu'avant les jokers, presque personne ne leur en donnait plusieurs. Une seule nouveauté a suffi à rendre visibles des écarts anciens : c'est pour cela que chaque PR repasse devant un vrai shell.

---

## Épilogue ouvert
Expand Down
5 changes: 3 additions & 2 deletions docs/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> **Decision (1 October 2026, @thierry):** Terminal Learning becomes **the reference for learning the terminal from scratch up to an intermediate level**, within what a faithful simulation can do. Job-specific tools (offensive security, network analysis, OSINT) are not simulated; the site points to the free platforms that already teach them. Ordered plan: [Phase 5d](#phase-5d--from-the-basics-to-an-intermediate-level--planned-1-october-2026). Delivery checklist: [`docs/processes/curriculum-delivery-checklist.md`](processes/curriculum-delivery-checklist.md).
>
> **Last update:** 2 October 2026 — **Phase 5d, Lot 1, PR 2** (#418): `find`, `xargs`, `rmdir`, GNU `wc` widths, `grep -l`; reference now 81 commands. Next: globbing (`ls *.txt`). Before: **PR 1** (#417): `sort`, `uniq`, `cut` faithful to GNU coreutils 9.4 (captured on WSL's Ubuntu), `Sort-Object`, `Get-Unique`, `Group-Object`; reference now 79 commands. Before: **Lot 0b** (#416): `llms.txt`, `llms-full.txt` and the `index.html` metadata are checked against the curriculum by a test; 10 stale lesson titles fixed. Next: Lot 1 (`sort`, `uniq`, `cut`).
> **Last update:** 2 October 2026 — **Phase 5d, Lot 1, PR 2b** (#419): wildcards `*`, `?`, `[...]` expand as in bash; `ls` with several operands. Before: **PR 2** (#418): `find`, `xargs`, `rmdir`, GNU `wc` widths, `grep -l`; reference now 81 commands. Next: globbing (`ls *.txt`). Before: **PR 1** (#417): `sort`, `uniq`, `cut` faithful to GNU coreutils 9.4 (captured on WSL's Ubuntu), `Sort-Object`, `Get-Unique`, `Group-Object`; reference now 79 commands. Before: **Lot 0b** (#416): `llms.txt`, `llms-full.txt` and the `index.html` metadata are checked against the curriculum by a test; 10 stale lesson titles fixed. Next: Lot 1 (`sort`, `uniq`, `cut`).
>
> **Previous update:** 1 October 2026 CEST — 🩺 **Full check-up (P1 terminal fidelity, THI-353), continued**: #396 every reference example runs · #397 tables, blank lines and mobile keys · #398 the installed app clears iOS 26's edge blur · #399 git reads real files, outputs match Git 2.56 · **#400 real git branches** (commit graph, ids identical to real git, merges and real conflicts; two fidelity audits, two code reviews) · #401 the landing page only lists commands the terminal runs and the lessons teach, and its terminal preview prints what real shells print. Planned: a **customising the terminal** module (idea from @thierry, #402). **Multi-step exercises checked on the terminal state** (the conflict lesson now resolves a real conflict end to end; no more auto-advance, a « Suivant » button instead). **Git module as steps** (init, first commit, diff, branch, merge). **Remote repositories as in real git** (`push`, `pull`, `fetch`, `clone`, `remote`, branch tracking in `status` and `branch -vv`, #406). **A remote where a colleague pushes** (`fetch`/`pull` bring real commits, a push is rejected with "fetch first", `gh` says it is not simulated; theory gaps 146 → 120). **GitHub module as steps** (remote, push & pull, fetch, pull request, merge strategies, GitHub Actions; #410, theory gaps 120 → 90). **The top of the installed iPhone app is clear at last** (#411, confirmed on @thierry's iPhone). **#413 Windows fidelity** (`ls`/`Get-ChildItem` print PowerShell 7.6's real table, `rm`/`cp`/`mv` are the cmdlets with their parameters — `rm -rf` is refused —, PowerShell's error messages, reference page updated; bash shown on Windows 34 → 32). Next: the ~20 commands taught but not simulated yet (`find`, `sort`, `diff`, `tar`, `Where-Object`…) and the remaining Windows debt (`New-Item`'s table, case-insensitive paths).
>
Expand Down Expand Up @@ -170,7 +170,8 @@ Full rationale and scope: [`docs/strategy/2026-10-01-bases-vers-intermediaire.md
- [ ] **Lot 1** — search and sort: `sort`, `uniq`, `cut`, `find`, `xargs`, `diff`, useful `wc`/`grep` options; PowerShell `Sort-Object`, `Where-Object`, `Select-Object` (3–4 PRs)
- [x] PR 1 (#417): `sort`, `uniq`, `cut` on files and pipes (GNU coreutils 9.4, en_US.UTF-8), `Sort-Object`, `Get-Unique`, `Select-Object -Unique`, `Group-Object`; reference 76 → 79 commands
- [x] PR 2 (#418): `find` (tests, `-exec`, `-delete`, documented NTFS order), `xargs`, `rmdir`, `wc` with GNU widths, `grep -v/-c/-l/-L` on files, bash backslash removal; reference 79 → 81
- [ ] PR 2b: pathname globbing (`*`, `?`, `[...]`) in the Linux/macOS terminal · PR 3: `diff`, `Where-Object`, `Compare-Object` · PR 4: lesson(s) on searching, sorting, counting and cutting
- [x] PR 2b (#419): pathname globbing (`*`, `?`, `[...]`) in the Linux/macOS terminal, as bash 5.2 does it; `ls` with several operands as GNU `ls`, and `ls -d`
- [ ] PR 3: `diff`, `Where-Object`, `Compare-Object` · PR 4: lesson(s) on searching, sorting, counting and cutting
- [ ] **Lot 2** — archives and disk: `tar`, `gzip`, `zip`/`unzip`, `Compress-Archive`, `du`, `df`, `which`/`type`/`Get-Command` (1–2 PRs)
- [ ] **Lot 3** — `sed` and `awk`, the subset a beginner uses, with an honest note beyond it (1–2 PRs)
- [ ] **Lot 4** — "Investigating logs" module: fictional auth and web server logs, step-by-step missions without the answer (2–3 PRs)
Expand Down
4 changes: 2 additions & 2 deletions docs/plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> **Décision du 1er octobre 2026 (@thierry)** : Terminal Learning devient **la référence pour apprendre le terminal de zéro jusqu'au niveau intermédiaire**, dans les limites d'une simulation fidèle. Les outils de métier (sécurité offensive, analyse réseau, OSINT) ne sont pas simulés : le site oriente vers les plateformes gratuites qui les enseignent. Plan ordonné : [`docs/strategy/2026-10-01-bases-vers-intermediaire.md`](strategy/2026-10-01-bases-vers-intermediaire.md) · procédure de livraison : [`docs/processes/curriculum-delivery-checklist.md`](processes/curriculum-delivery-checklist.md).
>
> Dernière mise à jour : **2 octobre 2026** — **Phase 5d, lot 1, PR 2** (#418) : `find`, `xargs`, `rmdir`, `wc` aux largeurs GNU, `grep -l` ; Référence 81 commandes. Suite : les jokers (`ls *.txt`). Avant : **PR 1** (#417) : `sort`, `uniq`, `cut` fidèles à GNU coreutils 9.4 (capturés sur l'Ubuntu de WSL), `Sort-Object`, `Get-Unique`, `Group-Object` ; Référence 79 commandes. Avant : **lot 0b** (#416) : `llms.txt`, `llms-full.txt` et les métadonnées d'`index.html` sont comparés au curriculum par un test ; 10 titres de leçon périmés corrigés. Suite : lot 1 (`sort`, `uniq`, `cut`).
> Dernière mise à jour : **2 octobre 2026** — **Phase 5d, lot 1, PR 2b** (#419) : les jokers `*`, `?`, `[...]` sont développés comme dans bash ; `ls` avec plusieurs fichiers. Avant : **PR 2** (#418) : `find`, `xargs`, `rmdir`, `wc` aux largeurs GNU, `grep -l` ; Référence 81 commandes. Suite : les jokers (`ls *.txt`). Avant : **PR 1** (#417) : `sort`, `uniq`, `cut` fidèles à GNU coreutils 9.4 (capturés sur l'Ubuntu de WSL), `Sort-Object`, `Get-Unique`, `Group-Object` ; Référence 79 commandes. Avant : **lot 0b** (#416) : `llms.txt`, `llms-full.txt` et les métadonnées d'`index.html` sont comparés au curriculum par un test ; 10 titres de leçon périmés corrigés. Suite : lot 1 (`sort`, `uniq`, `cut`).
>
> Précédente mise à jour : **1er octobre 2026 CEST** — **🩺 Grand Check-up, P1 « fidélité du terminal » (THI-353), suite** : #396 exemples de la Référence tous exécutables · #397 tableaux, lignes vides et touches du clavier mobile · #398 haut de l'app installée dégagé du flou d'iOS 26 · #399 git lit les vrais fichiers, sorties identiques à Git 2.56 · **#400 vraies branches Git** (graphe de commits, identifiants identiques au vrai Git, fusions et vrais conflits ; deux audits de fidélité et deux revues de code) · #401 page d'accueil : ne promet plus que des commandes simulées · #402 module « Personnaliser son terminal » annoncé · **exercices en plusieurs étapes vérifiés sur l'état du terminal** (le conflit Git se résout de A à Z, plus de saut automatique : bouton « Suivant »). · **module Git en étapes** (init, premier commit, diff, branche, fusion) · **dépôts distants identiques au vrai Git** (`push`, `pull`, `fetch`, `clone`, `remote`, suivi de branche dans `status` et `branch -vv`, #406) · **dépôt distant où un collègue pousse** (`fetch`/`pull` ramènent de vrais commits, push refusé « fetch first », `gh` dit qu'il n'est pas simulé ; écarts théorie 146 → 120) · **module GitHub en étapes** (remote, push & pull, fetch, Pull Request, stratégies de merge, GitHub Actions ; #410, écarts théorie 120 → 90) · **haut de l'app installée sur iPhone enfin net** (#411, confirmé sur l'iPhone de @thierry). **#413 fidélité Windows** (`ls`/`Get-ChildItem` affichent le vrai tableau de PowerShell 7.6, `rm`/`cp`/`mv` sont les cmdlets avec leurs paramètres — `rm -rf` refusé —, erreurs de PowerShell, page Référence à jour ; bash montré sous Windows 34 → 32). Suite : les ~20 commandes enseignées mais pas encore simulées (`find`, `sort`, `diff`, `tar`, `Where-Object`…) et la dette Windows restante (tableau de `New-Item`, chemins insensibles à la casse).
> Précédent : **26 septembre 2026 CEST** — **🩺 Grand Check-up, P1 « fidélité du terminal » (THI-353)** : #389 vraie couche shell (**198/198 exercices sans ligne rouge**) · #390 sorties d'un vrai shell · #391 rejeu permanent de la théorie · #392 `cp`/`mv` vers un dossier + chemins Windows natifs (écarts théorie **174 → 162**) · #393 agents d'audit remis à jour + `terminal-fidelity-auditor` · roadmap publique corrigée. Suite : messages d'erreur PowerShell, page Référence, écarts restants.
Expand Down Expand Up @@ -256,7 +256,7 @@ Détail, périmètre et justification : [`docs/strategy/2026-10-01-bases-vers-in
- [ ] **Lot 1** — chercher et trier : `sort`, `uniq`, `cut`, `find`, `xargs`, `diff` ; `Sort-Object`, `Where-Object`, `Select-Object`
- [x] PR 1 (#417) : `sort`, `uniq`, `cut` sur fichiers et pipes (GNU coreutils 9.4, en_US.UTF-8), `Sort-Object`, `Get-Unique`, `Select-Object -Unique`, `Group-Object` ; Référence 76 → 79 commandes. Dette notée : `Get-Content a, b` (plusieurs fichiers) et `ForEach-Object` non simulés ; sous Windows, une commande inconnue garde le message pédagogique « commande introuvable » au lieu de celui de PowerShell ; **`--help` est faux pour toutes les autres commandes** (`ls --help` liste le dossier, `cat --help` cherche un fichier) : à traiter dans une PR dédiée (`sort`, `uniq` et `cut` affichent déjà une note) ; cas rares de `Group-Object` (`-AsString` sans `-AsHashTable`, `| Measure-Object` compte les lignes du tableau)
- [x] PR 2 (#418) : `find` (tests, `-exec`, `-delete`, ordre NTFS documenté), `xargs`, `rmdir`, `wc` aux largeurs GNU, `grep -v/-c/-l/-L` sur fichiers, barre oblique inverse retirée comme bash ; Référence 79 → 81. Dette notée : **aucun joker n'est développé sous Linux** (`ls *.txt`, `rm documents/*`) → PR suivante ; `ls` avec plusieurs dossiers n'affiche que le premier ; largeur de la colonne taille de `ls -l` ; `wc` sous Windows (PowerShell n'en a pas). Relevé par l'audit de fidélité du 2 octobre : `$?` n'est pas développé (les codes de sortie, désormais justes, restent invisibles) ; `printf`, `echo -e` et `echo -n` ; options de `grep` `-q`, `-o`, `-h`, `-H`, `-m`, `-s`, `-F`, l'alternance `\|`, et `-l`/`-L` sur l'entrée standard (PR `grep` dédiée, utile au lot 4) ; parenthèses non citées (`find . ( -name x )` doit être une erreur de syntaxe) ; `wc < fichier` compte comme un pipe ; `chmod` affiche un message alors que le vrai est silencieux
- [ ] PR 2b : développement des jokers (`*`, `?`, `[...]`) dans le terminal Linux/macOS
- [x] PR 2b (#419) : développement des jokers (`*`, `?`, `[...]`) dans le terminal Linux/macOS, à la manière de bash 5.2 ; `ls` avec plusieurs opérandes comme GNU `ls`, et `ls -d`. Après l'audit de fidélité (573 commandes) : jokers dans les redirections (`ambiguous redirect`), `cd` à plusieurs opérandes, `chmod`/`rm`/`mkdir`/`head`/`tail` sur tous leurs fichiers (en-têtes `==>`), `head -2`, `rm -f`, `ls -A`/`-r`/`-lF`/`--all`/`--` et code de sortie 2, classes `[[:alpha:]]` et `]` en tête de crochets. Dette notée : accolades (`*.{md,txt}`) ; un `$VAR` non cité qui contient `*` n'est pas développé ; `[a\-z]` (barre oblique inverse entre crochets) ; `documents//*` et `*//` ; `ls -R` non récursif ; `ls` range les noms à l'ordre des octets au lieu de la locale (`*.txt` avant `documents`, fichiers cachés en tête) ; GNU met entre guillemets un nom qui contient un caractère spécial (`cat: '*': No such file…`) ; `[[.d.]]` et `[[=d=]]` ; `./README.md` sans droit d'exécution rend 126 ; les commentaires `#` ne sont pas ignorés ; `cp` dit `is not a directory` au lieu de `Not a directory` ; `touch --` et options inconnues de `touch` ; `cd nope` sans le préfixe `bash:` ; `date *`, `pwd *` ne refusent pas leurs opérandes
- [ ] PR 3 : `diff`, `Where-Object`, `Compare-Object`
- [ ] PR 4 : leçon(s) « Trier, compter, découper » dans les trois environnements
- [ ] **Lot 2** — archives et disque : `tar`, `gzip`, `zip`, `Compress-Archive`, `du`, `df`, `which`/`Get-Command`
Expand Down
1 change: 1 addition & 0 deletions src/app/data/commandExamples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ export const COMMAND_EXAMPLES: Record<string, CommandExample[]> = {
{ command: 'ls', explanation: 'Liste les fichiers et dossiers visibles du dossier courant.', environments: UNIX },
{ command: 'ls -la', explanation: '-l affiche le détail (droits, propriétaire, taille, date) et -a ajoute les fichiers cachés, ceux dont le nom commence par un point.', environments: UNIX },
{ command: 'ls documents', explanation: 'Liste le contenu d\'un autre dossier sans t\'y déplacer.', environments: UNIX },
{ command: 'ls documents/*.md', explanation: 'L\'étoile est un joker : avant même que ls démarre, le shell la remplace par les fichiers qui correspondent. Si rien ne correspond, le mot reste tel quel et ls répond qu\'il ne trouve pas « *.md ».', environments: UNIX },
{ command: 'Get-ChildItem', explanation: 'Liste le contenu du dossier courant dans un tableau : type (Mode), date de modification, taille en octets et nom. ls et dir sont des raccourcis de cette commande.', environments: WIN },
{ command: 'Get-ChildItem -Name', explanation: 'Seulement les noms, un par ligne, sans le tableau.', environments: WIN },
{ command: 'Get-ChildItem -Force', explanation: 'Ajoute les éléments cachés, comme le dossier .git. Sous Windows, un nom qui commence par un point ne cache rien : c\'est un attribut qui cache un fichier. ls -la, lui, ne fonctionne pas dans PowerShell.', environments: WIN },
Expand Down
Loading
Loading