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

---

## 🔎 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)*

- **`find` fonctionne** : il cherche par nom (`-name`, `-iname`, `-path`, `-regex`), par type, par taille et par profondeur, trouve les fichiers vides, combine les tests (`!`, `-o`, parenthèses), lance une commande sur chaque résultat (`-exec … \;` ou `+`) et supprime (`-delete`). Avant, `find` répondait « commande introuvable ».
- **`xargs` transforme les lignes d'un pipe en arguments** (`find . -name "*.md" | xargs wc -l`), avec `-n`, `-L`, `-I {}` et `-t`, et les vrais messages d'erreur.
- **`rmdir`** supprime un dossier vide et refuse un dossier plein, comme sur un vrai système.
- **`wc` aligne ses colonnes comme GNU** et ajoute une ligne `total` quand il compte plusieurs fichiers. `grep` sur des fichiers connaît `-v`, `-c`, `-l` et `-L`, et rend le bon code de sortie.
- Le terminal Linux retire la barre oblique inverse comme bash : `find . -exec cat {} \;` et `\(` fonctionnent.
- Sous Windows, `find` répond comme `find.exe`, l'outil de recherche de texte de Windows, et le terminal indique `Get-ChildItem -Recurse` à la place. `rmdir` et `rd` y sont des alias de `Remove-Item`.
- **La page Référence passe de 79 à 81 commandes** : `xargs` et `rmdir`, et de nouveaux exemples pour `find`.

---

## 🔤 2 octobre 2026 — Trier, compter et découper du texte : `sort`, `uniq`, `cut`

*Phase 5d, lot 1 · sorties vérifiées sur Ubuntu 24.04 (coreutils 9.4) et PowerShell 7.6*
Expand Down
10 changes: 10 additions & 0 deletions STORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -1285,6 +1285,16 @@ PowerShell a réservé sa propre surprise. `Sort-Object` ignore vraiment la cass

Quatre séries de captures, plus de 150 commandes, ont fixé chaque détail : `cut -c` compte des octets (« Tâches » coupé à 5 donne « Tâch »), un `-r` global inverse aussi le départage des lignes égales, mais pas un `-r` écrit dans la clé. Un des tests existants a même trouvé un bug que nous n'avions pas vu : une commande nommée `constructor` remontait jusqu'au prototype d'un objet JavaScript.

### Ce que `find` a révélé (2 octobre 2026)

`find` n'avait jamais existé dans le simulateur. En l'écrivant, on a buté sur une question simple : dans quel ordre l'afficher ? Sur l'Ubuntu de WSL, `find .` a rendu les fichiers dans un ordre qui ne ressemble à rien. Sur un disque Linux, cet ordre dépend d'un calcul interne et change d'une machine à l'autre. Le simulateur suit donc l'ordre de Git Bash sous Windows, alphabétique, et la page Référence conseille d'ajouter `| sort` quand l'ordre compte.

Les vraies sorties de `find` et de `xargs` ont ensuite fait remonter trois défauts plus anciens. `find . -exec cat {} \;`, l'usage le plus courant, ne marchait pas, parce que le terminal ne retirait pas la barre oblique inverse comme le fait bash. `grep -l` affichait les lignes au lieu des noms de fichiers. Et `wc` n'alignait pas ses colonnes comme le vrai : deux de nos propres tests attendaient même la mauvaise largeur, et la leçon `wc` la montrait. Tout a été corrigé à partir des captures, y compris le texte de la leçon.

Une capture a aussi mal tourné. Une commande passée à WSL a été découpée autrement que prévu, et le décor de test s'est écrit dans le vrai dossier personnel de l'Ubuntu, par-dessus deux fichiers de configuration. Rien n'a été supprimé : les fichiers écrits par erreur sont en quarantaine, les originaux d'Ubuntu ont été remis, et le script refuse désormais de s'exécuter ailleurs que dans un dossier temporaire.

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.

---

## É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 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 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 @@ -169,7 +169,8 @@ Full rationale and scope: [`docs/strategy/2026-10-01-bases-vers-intermediaire.md
- [x] **Lot 0b** — counter guards: `llms.txt`, `llms-full.txt` and `index.html` metadata checked by a test (`src/test/publicCounters.test.ts`, #416); 10 stale lesson titles fixed in `llms-full.txt`
- [ ] **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
- [ ] PR 2: `find`, `xargs` · PR 3: `diff`, `Where-Object`, `Compare-Object` · PR 4: lesson(s) on sorting, counting and cutting
- [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
- [ ] **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
5 changes: 3 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 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 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 @@ -255,7 +255,8 @@ Détail, périmètre et justification : [`docs/strategy/2026-10-01-bases-vers-in
- [x] **Lot 0b** — garde-fous des compteurs (`llms.txt`, `llms-full.txt`, métadonnées d'`index.html`) : `src/test/publicCounters.test.ts` (#416), 10 titres périmés corrigés dans `llms-full.txt`
- [ ] **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)
- [ ] PR 2 : `find`, `xargs`
- [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
- [ ] 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
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@
"name": "Combien de commandes et de leçons sont disponibles ?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Terminal Learning propose 66 leçons réparties en 11 modules progressifs : navigation, fichiers, lecture, permissions, processus, redirection, variables, réseau/SSH, Git, GitHub et l'IA comme outil dev. Plus de 79 commandes documentées avec syntaxe, exemples, erreurs courantes et variantes Linux/macOS/Windows."
"text": "Terminal Learning propose 66 leçons réparties en 11 modules progressifs : navigation, fichiers, lecture, permissions, processus, redirection, variables, réseau/SSH, Git, GitHub et l'IA comme outil dev. Plus de 81 commandes documentées avec syntaxe, exemples, erreurs courantes et variantes Linux/macOS/Windows."
}
},
{
Expand Down
49 changes: 47 additions & 2 deletions src/app/data/commandCatalogue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,22 @@ const baseCatalogue: BaseCategory[] = [
"Taper rm -rf dans PowerShell : rm y est Remove-Item, qui ne connaît pas -rf. Écrire Remove-Item dossier -Recurse",
],
},
{
id: 'rmdir',
name: 'rmdir',
category: 'fichiers',
level: 1,
recommendedFor: ['linux', 'macos', 'windows'],
variants: [
{ environment: 'windows', command: 'rmdir dossier', shell: 'PowerShell' },
],
compatibility: ['linux', 'macos', 'windows'],
syntax: 'rmdir dossier',
summary: 'Supprimer un dossier vide',
commonErrors: [
"S'étonner de « Directory not empty » : rmdir ne supprime que les dossiers vides. Vider le dossier d'abord, ou utiliser rm -r en relisant la commande.",
],
},
],
},

Expand Down Expand Up @@ -313,9 +329,30 @@ const baseCatalogue: BaseCategory[] = [
{ environment: 'windows', command: 'where nomcommande', shell: 'CMD' },
],
compatibility: ['linux', 'macos', 'windows'],
syntax: 'find . -name motif',
syntax: 'find [dossier...] [tests] [actions]',
summary: 'Trouver des fichiers ou commandes',
commonErrors: [],
commonErrors: [
"Oublier les guillemets autour du motif : sans eux, le shell remplace *.txt par les fichiers du dossier courant avant que find le voie. Écrire find . -name \"*.txt\".",
'Sur macOS, find exige un dossier de départ : find . -name "*.txt", et non find -name "*.txt".',
"Taper find dans PowerShell : c'est find.exe, l'outil de recherche de texte de Windows. Pour chercher des fichiers : Get-ChildItem -Recurse -Filter *.txt.",
"Compter sur l'ordre des résultats : find les donne dans l'ordre du disque, qui change d'une machine à l'autre. Ajouter | sort pour un ordre stable.",
],
},
{
id: 'xargs',
name: 'xargs',
category: 'search',
level: 1,
recommendedFor: ['linux', 'macos'],
variants: [
{ environment: 'windows', command: 'Get-ChildItem -Recurse -Filter *.md | ForEach-Object { Get-Content $_ }', shell: 'PowerShell' },
],
compatibility: ['linux', 'macos', 'windows'],
syntax: 'commande | xargs [options] commande [arguments]',
summary: "Lancer une commande avec les lignes reçues d'un pipe",
commonErrors: [
'Passer des noms de fichiers qui contiennent des espaces : xargs coupe sur les espaces. Utiliser find … -exec commande {} + à la place.',
],
},
{
id: 'wc',
Expand Down Expand Up @@ -1397,6 +1434,14 @@ const OFFICIAL_DOCS: Record<string, OfficialDoc[]> = {
{ label: 'Microsoft Learn — Select-String (Windows)', url: `${PS}microsoft.powershell.utility/select-string` },
],
find: [{ label: 'man7.org (Linux)', url: `${M1}find.1.html` }],
xargs: [
{ label: 'man7.org (Linux)', url: `${M1}xargs.1.html` },
{ label: 'Microsoft Learn — ForEach-Object (Windows)', url: `${PS}microsoft.powershell.core/foreach-object` },
],
rmdir: [
{ label: 'man7.org (Linux)', url: `${M1}rmdir.1.html` },
{ label: 'Microsoft Learn — Remove-Item (Windows)', url: `${PS}microsoft.powershell.management/remove-item` },
],
wc: [{ label: 'man7.org (Linux)', url: `${M1}wc.1.html` }],
sort: [
{ label: 'man7.org (Linux)', url: `${M1}sort.1.html` },
Expand Down
Loading
Loading