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 — 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*

- **`sort`, `uniq` et `cut` fonctionnent sur des fichiers**, plus seulement derrière un pipe. Avant, `sort fichier.txt` répondait « commande introuvable ».
- `sort` range les lignes comme un vrai Linux en français ou en anglais : majuscules et minuscules ensemble, la ponctuation ne compte qu'à égalité. Il connaît `-r`, `-n`, `-h`, `-u`, `-f`, `-d`, `-b`, `-k`, `-t`, `-o`, `-c` et `-s`. Le tri par colonne (`sort -t, -k2n`) suit les mêmes règles que GNU, jusqu'au départage des lignes égales.
- `uniq` fusionne les lignes voisines, compte (`-c`), garde les doublons (`-d`, `-D`) ou les lignes uniques (`-u`). `cut` garde des colonnes (`-d`, `-f`, `--complement`, `--output-delimiter`) ou des octets (`-c`, `-b`) : comme sur Linux, une lettre accentuée compte pour deux.
- Les messages d'erreur sont ceux de GNU (`sort: cannot read: …`, `cut: you must specify a list…`). Une option réelle mais pas encore simulée affiche une note, jamais un résultat faux.
- **Sous Windows** : `Sort-Object` (et son alias `sort`) trie du texte en ignorant la casse, avec `-Descending`, `-Unique`, `-CaseSensitive`, `-Top` et `-Bottom`. `Get-Unique`, `Select-Object -Unique` et `Group-Object` (l'équivalent de `uniq -c`) arrivent.
- **La page Référence passe de 76 à 79 commandes** : `sort`, `uniq` et `cut`, avec leurs équivalents PowerShell, des exemples à essayer et les erreurs fréquentes.
- Sur la page d'accueil, la feuille de route annonce la suite du parcours : des bases jusqu'au niveau intermédiaire.

---

## 🤖 2 octobre 2026 — Ce que lisent les moteurs IA reste à jour

*Fichiers `llms.txt` et `llms-full.txt` · métadonnées de la page d'accueil · Phase 5d, lot 0b*
Expand Down
10 changes: 10 additions & 0 deletions STORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -1275,6 +1275,16 @@ Le garde-fou écrit ce matin compare ces fichiers au curriculum lui-même. Il a

On a aussi vérifié que le test sait échouer : en remettant volontairement un mauvais compteur dans chaque fichier, il passe au rouge à chaque fois. Les lots suivants ajouteront des modules et des leçons. Ces fichiers ne pourront plus rester en arrière.

### Trier comme un vrai Linux (2 octobre 2026)

On pensait que trier des lignes serait la partie facile. Le premier essai a montré le contraire : selon la langue du système, `sort` ne range pas les lignes de la même façon. Sur un Ubuntu en français ou en anglais, `.cache` se range comme « cache », et `Pomme` arrive entre `ecole` et `Zèbre`. Sur un serveur réglé en `C`, les majuscules passent toutes avant les minuscules.

Pour savoir lequel imiter, il fallait un vrai Linux. L'Ubuntu installé sous WSL sur la machine de @thierry ne connaissait que la langue `C`. On y a ajouté l'anglais, le français de France et celui de Belgique, puis on a trié la même liste de 69 lignes piégées dans chacune. Le tri du navigateur ne donnait pas le même résultat. Il a fallu ignorer la ponctuation, puis les symboles comme `+`, avant de retrouver l'ordre exact de glibc, ligne pour ligne.

PowerShell a réservé sa propre surprise. `Sort-Object` ignore vraiment la casse : deux lignes qui ne diffèrent que par une majuscule gardent leur ordre de départ. Au-delà de seize lignes, l'algorithme de .NET peut les échanger. Les fichiers des leçons sont plus courts, et le code le dit.

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.

---

## Épilogue ouvert
Expand Down
4 changes: 3 additions & 1 deletion 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 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 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 @@ -168,6 +168,8 @@ Full rationale and scope: [`docs/strategy/2026-10-01-bases-vers-intermediaire.md
- [x] **Lot 0** — this plan, roadmap and delivery checklist (#415)
- [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
- [ ] **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
6 changes: 5 additions & 1 deletion 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 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 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 @@ -254,6 +254,10 @@ Détail, périmètre et justification : [`docs/strategy/2026-10-01-bases-vers-in
- [x] **Lot 0** — plan, roadmap, procédure de livraison (#415)
- [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`
- [ ] 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`
- [ ] **Lot 3** — `sed` et `awk` (sous-ensemble débutant)
- [ ] **Lot 4** — module « Enquêter dans les journaux » (missions sur des journaux fictifs)
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 76 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 79 commandes documentées avec syntaxe, exemples, erreurs courantes et variantes Linux/macOS/Windows."
}
},
{
Expand Down
64 changes: 64 additions & 0 deletions src/app/data/commandCatalogue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,57 @@ const baseCatalogue: BaseCategory[] = [
summary: 'Compter lignes, mots et caractères',
commonErrors: [],
},
{
id: 'sort',
name: 'sort',
category: 'search',
level: 1,
recommendedFor: ['linux', 'macos'],
variants: [
{ environment: 'windows', command: 'Get-Content fichier.txt | Sort-Object', shell: 'PowerShell' },
],
compatibility: ['linux', 'macos', 'windows'],
syntax: 'sort [options] [fichier...]',
summary: 'Trier des lignes',
commonErrors: [
'Trier des nombres sans -n : sort compare les caractères un à un, donc 10 passe avant 9.',
"Écrire sort fichier.txt dans PowerShell : sort y est Sort-Object, qui attend des lignes par un pipe. Écrire Get-Content fichier.txt | Sort-Object.",
],
},
{
id: 'uniq',
name: 'uniq',
category: 'search',
level: 1,
recommendedFor: ['linux', 'macos'],
variants: [
{ environment: 'windows', command: 'Get-Content fichier.txt | Sort-Object | Get-Unique', shell: 'PowerShell' },
{ environment: 'windows', command: 'Get-Content fichier.txt | Group-Object', shell: 'PowerShell' },
],
compatibility: ['linux', 'macos', 'windows'],
syntax: 'uniq [options] [fichier]',
summary: 'Fusionner ou compter les lignes répétées',
commonErrors: [
"Utiliser uniq sur un fichier non trié : uniq ne fusionne que des lignes voisines. Trier d'abord : sort fichier.txt | uniq.",
],
},
{
id: 'cut',
name: 'cut',
category: 'search',
level: 1,
recommendedFor: ['linux', 'macos'],
variants: [
{ environment: 'windows', command: "Get-Content fichier.csv | ForEach-Object { $_.Split(',')[0] }", shell: 'PowerShell' },
],
compatibility: ['linux', 'macos', 'windows'],
syntax: 'cut -d séparateur -f champs [fichier...]',
summary: 'Garder certaines colonnes de chaque ligne',
commonErrors: [
"Oublier -d : sans lui, cut coupe sur la tabulation, pas sur l'espace ni sur la virgule.",
'Compter les lettres avec -c : GNU cut compte des octets, et une lettre accentuée en occupe deux.',
],
},
],
},

Expand Down Expand Up @@ -1347,6 +1398,19 @@ const OFFICIAL_DOCS: Record<string, OfficialDoc[]> = {
],
find: [{ label: 'man7.org (Linux)', url: `${M1}find.1.html` }],
wc: [{ label: 'man7.org (Linux)', url: `${M1}wc.1.html` }],
sort: [
{ label: 'man7.org (Linux)', url: `${M1}sort.1.html` },
{ label: 'Microsoft Learn — Sort-Object (Windows)', url: `${PS}microsoft.powershell.utility/sort-object` },
],
uniq: [
{ label: 'man7.org (Linux)', url: `${M1}uniq.1.html` },
{ label: 'Microsoft Learn — Get-Unique (Windows)', url: `${PS}microsoft.powershell.utility/get-unique` },
{ label: 'Microsoft Learn — Group-Object (Windows)', url: `${PS}microsoft.powershell.utility/group-object` },
],
cut: [
{ label: 'man7.org (Linux)', url: `${M1}cut.1.html` },
{ label: 'Microsoft Learn — ForEach-Object (Windows)', url: `${PS}microsoft.powershell.core/foreach-object` },
],
// systeme
echo: [
{ label: 'man7.org (Linux)', url: `${M1}echo.1.html` },
Expand Down
Loading
Loading