Skip to content

fix(terminal): cp/mv into a directory, and Windows paths PowerShell accepts (THI-353) - #392

Merged
thierryvm merged 1 commit into
mainfrom
fix/thi-353-cp-mv-into-directory
Sep 24, 2026
Merged

thierryvm merged 1 commit into
mainfrom
fix/thi-353-cp-mv-into-directory

Conversation

@thierryvm

@thierryvm thierryvm commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

Why

Found while replaying lesson theory (#391): mv documents/notes.txt . — shown in the mv lesson — replaced the learner's home directory with the file. cp file dir and Move-Item file dir overwrote the target directory. On the way: the Windows environment understood no Windows path (documents\notes.txt, C:\Users\user\…), and Remove-Item -Recurse ignored -Recurse. THI-353.

What

cp / mv — GNU coreutils semantics (transfer() in terminalEngine.ts)

  • existing directory as destination → the source goes inside it; several sources need a directory
  • refused: a directory into itself, same file, overwriting a directory with a file (and the reverse), mv onto a non-empty directory, mv .
  • -v, -n, -i (simulator answers "n" and says so), -f, long options; unknown options rejected with GNU's message
  • moving the directory you stand in (or a parent) takes the cwd along
  • cp -r dir existing/ → existing/dir, merging; -n respected at any depth

Windows / PowerShell

  • paths: \, .\, C:\…; C:\Users = simulated /home (ls C:\ shows Users, cd users from C:\ works); bash unchanged
  • Remove-Item -Recurse, Copy-Item -Recurse (any accepted prefix of -Recurse); -Path / -Destination in any order
  • mkdir a\b creates missing parents (New-Item -ItemType Directory)
  • exercises accept \ (exerciseAccepts in validators.ts, used by LessonPage); Tab completes after \

Lessons — mv / rm / cat examples run as shown, PowerShell variants, Windows rm warning & tip. Ratchets: theory gaps 174 → 162, bash shown on Windows 39 → 37 (only removals in lessonTheoryGaps.ts).

Tests

  • cp / mv — destination directory (GNU semantics) (18) and Windows paths in PowerShell (8) in terminalEngine.test.ts — expected values from real coreutils / PowerShell behaviour; the core cases were reproduced failing on the old engine (ls empty after mv … .).
  • lessonFidelity: every Windows exercise that takes a path, replayed with \ → no error + validates (10 cases; git commands excluded: branch names are not paths).

Gates

  • test-runner: tsc ✅ lint ✅ build ✅ — full suite 2681 passed (Supabase integration flakes pass alone)
  • feature-dev:code-reviewer ×2: pass 1 → 3 findings (Tab completion, cp -rn depth, -Path/-Destination order), pass 2 → 1 finding (C:\ root showed home) — all fixed with tests
  • ui-auditor (LessonPage / TerminalEmulator logic-only change): ✅ clean
  • Chrome (local): Windows rm lesson commands, Move-Item documents\notes.txt ., Linux mv lesson, Get-Content documents\notes.txt via Tab validates the cat exercise (fresh isolated context)

🤖 Generated with Claude Code

Résumé par Sourcery

Rendre les transferts de fichiers sûrs et fidèles à GNU coreutils et PowerShell, tout en ajoutant une prise en charge complète des chemins Windows dans le terminal et les leçons.

Nouvelles fonctionnalités :

  • Prise en charge du comportement compatible avec GNU de cp et mv lors du transfert de fichiers et de répertoires vers des destinations existantes, y compris les options et vérifications de sécurité pertinentes.
  • Prise en charge de la syntaxe des chemins Windows et PowerShell, des opérations récursives sur les éléments, de la création de répertoires, de la complétion par tabulation tenant compte des chemins et de la validation des exercices spécifiques à Windows.
  • Ajout d’exemples PowerShell adaptés à l’environnement et correction des exemples de commandes exécutables dans les leçons de gestion des fichiers.

Corrections de bugs :

  • Empêcher cp, mv et les commandes PowerShell de gestion des éléments de remplacer des répertoires existants par des fichiers ou de détruire le contenu des répertoires de toute autre manière.
  • Préserver le répertoire de travail actuel lors du déplacement du répertoire dans lequel il se trouve ou de l’un de ses répertoires parents.
  • Corriger l’affichage et la navigation de la racine des lecteurs Windows et du répertoire personnel simulé.
  • Faire fonctionner correctement la suppression et la copie récursives pour les commandes PowerShell.

Améliorations :

  • Aligner davantage les opérations de transfert du terminal sur la sémantique réelle de GNU coreutils et de PowerShell, notamment la gestion des options, la fusion des répertoires, la prévention de l’écrasement et le signalement des erreurs.

Documentation :

  • Mettre à jour le journal des modifications et le contenu des leçons de gestion des fichiers avec des exemples de commandes exacts, des variantes PowerShell, des avertissements Windows et des recommandations de sécurité.

Tests :

  • Ajouter une couverture de tests du moteur du terminal pour la gestion des destinations de cp/mv de style GNU, les options de transfert, le comportement des répertoires récursifs, les erreurs de sécurité et les chemins PowerShell sous Windows.
  • Ajouter des tests de fidélité des leçons pour vérifier que les exercices Windows acceptent les chemins utilisant des barres obliques inverses.

Tâches annexes :

  • Réduire les lacunes théoriques suivies dans les leçons et les exemples réservés à bash affichés dans les leçons Windows.
Original summary in English

Summary by Sourcery

Make file transfers safe and faithful to GNU coreutils and PowerShell while adding comprehensive Windows path support across the terminal and lessons.

New Features:

  • Support GNU-compatible cp and mv behavior when transferring files and directories into existing destinations, including relevant options and safety checks.
  • Support Windows and PowerShell path syntax, recursive item operations, directory creation, path-aware tab completion, and Windows-specific exercise validation.
  • Provide environment-specific PowerShell examples and corrected runnable command examples throughout the file-management lessons.

Bug Fixes:

  • Prevent cp, mv, and PowerShell item commands from replacing existing directories with files or otherwise destroying directory contents.
  • Preserve the current working directory when moving the directory it resides in or one of its parents.
  • Correct Windows drive-root and simulated home-directory display and navigation behavior.
  • Make recursive removal and copying work correctly for PowerShell commands.

Enhancements:

  • Align terminal transfer operations more closely with real GNU coreutils and PowerShell semantics, including option handling, directory merging, overwrite prevention, and error reporting.

Documentation:

  • Update the changelog and file-management lesson content with accurate command examples, PowerShell variants, Windows warnings, and safety guidance.

Tests:

  • Add terminal engine coverage for GNU-style cp/mv destination handling, transfer options, recursive directory behavior, safety errors, and Windows PowerShell paths.
  • Add lesson-fidelity tests ensuring Windows exercises accept backslash-based paths.

Chores:

  • Reduce tracked lesson theory gaps and bash-only examples shown in Windows lessons.

…ccepts (THI-353)

cp / mv (GNU coreutils semantics)
- A destination that is an existing directory receives the source inside it.
  `mv documents/notes.txt .` used to replace the home directory with the file;
  `cp file dir` / `Move-Item file dir` overwrote the directory.
- Several sources need a directory; no directory into itself; same-file check;
  -v, -n, -i (answers "n" in the simulator, and says so), -f; invalid options
  rejected like GNU; moving the directory you stand in takes you along;
  `cp -rn` keeps existing files at any depth.

Windows
- PowerShell paths: `\` separators, `.\`, `C:\Users\user\...` (= /home/user);
  `C:\` shows `Users`, `cd ..` from the home reaches `C:\Users`. Bash is
  unchanged (a backslash is not a separator there).
- Remove-Item / Copy-Item -Recurse; -Path / -Destination in any order;
  mkdir creates missing parents like New-Item -ItemType Directory.
- Exercises accept `\` on Windows (exerciseAccepts); Tab completes after `\`.

Lessons
- mv, rm and cat examples run as shown, with PowerShell variants and Windows
  versions of the rm warning and tip. Theory gaps 174 -> 162, lessons showing
  bash to Windows learners 39 -> 37.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@vercel

vercel Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
terminal-learning Ready Ready Preview Sep 24, 2026 1:14pm UTC

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @thierryvm, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 2 days and 5 hours by commenting @sourcery-ai review. Upgrade to get a review now.

@sourcery-ai

sourcery-ai Bot commented Sep 24, 2026

Copy link
Copy Markdown

Guide du reviewer

Cette PR centralise la sémantique des transferts cp/mv avec des vérifications de sécurité, ajoute la compatibilité avec les chemins Windows et PowerShell dans le terminal, la complétion et les exercices, met à jour les leçons concernées et vérifie le comportement à l’aide de tests ciblés du moteur et de la fidélité des leçons.

Diagramme de séquence pour le transfert de fichiers multiplateforme

sequenceDiagram
    participant User
    participant TerminalEmulator
    participant CommandEngine
    participant Transfer
    participant FileSystem

    User->>TerminalEmulator: Enter cp or mv command
    TerminalEmulator->>CommandEngine: processCommand(command, environment)
    CommandEngine->>Transfer: cmdCp or cmdMv(args)
    Transfer->>FileSystem: resolvePath(source, destination)
    Transfer->>Transfer: transfer(cmd, state, args)
    alt destination is an existing directory
        Transfer->>FileSystem: Copy source inside destination or move source inside destination
    else invalid or unsafe transfer
        Transfer-->>CommandEngine: Return GNU-style error
    end
    CommandEngine-->>TerminalEmulator: Updated root, cwd, and output
Loading

Modifications fichier par fichier

Modification Détails Fichiers
Implémentation d’un comportement de répertoire de destination similaire à GNU et de vérifications de sécurité pour cp et mv.
  • Achemine toutes les opérations de transfert via un analyseur d’options et une implémentation de transfert partagés.
  • Place les sources dans les répertoires de destination existants et exige des répertoires pour plusieurs sources.
  • Ajoute la copie récursive de répertoires avec fusion et comportement sans écrasement.
  • Empêche les transferts vers eux-mêmes, les écrasements entre types incompatibles, le déplacement de répertoires non vides et mv . ; préserve le répertoire courant lors du déplacement du répertoire courant ou d’un de ses ancêtres.
  • Prend en charge les options courtes et longues, notamment verbose, no-clobber, interactive, force, ainsi que les erreurs GNU en cas d’option inconnue.
src/app/data/terminalEngine.ts
src/app/data/commands/windows.ts
src/test/terminalEngine.test.ts
Ajout de la sémantique des chemins Windows et PowerShell dans l’exécution et la navigation du terminal.
  • Normalise les antislashs, les points relatifs, les lettres de lecteur et les chemins simulés C:\Users, tout en conservant le comportement de Bash inchangé.
  • Affiche la hiérarchie du répertoire personnel simulé avec les noms Windows et met à jour le formatage des chemins Git.
  • Ajoute des paramètres récursifs compatibles avec PowerShell, l’analyse nommée de -Path/-Destination, la suppression et la copie récursives, ainsi que la création des répertoires parents pour mkdir.
  • Étend la complétion par tabulation aux séparateurs Windows et aux chemins de lecteur, et propage les changements de répertoire courant depuis Move-Item.
src/app/data/terminalEngine.ts
src/app/data/commands/windows.ts
src/app/data/commands/git.ts
src/app/components/TerminalEmulator.ts
src/test/terminalEngine.test.ts
Adaptation à l’environnement des commandes des leçons Windows et de la validation des exercices fondée sur les chemins.
  • Accepte les chemins Windows séparés par des antislashs lors de la validation des exercices.
  • Utilise des exemples de leçons spécifiques à l’environnement pour mv, rm et les commandes PowerShell associées.
  • Rejoue les variantes de chemins Windows dans les tests de fidélité des leçons et réduit les lacunes théoriques suivies ainsi que les exceptions liées à Bash sous Windows.
src/app/components/LessonPage.tsx
src/app/data/validators.ts
src/app/data/curriculum.ts
src/test/lessonFidelity.test.ts
src/test/lessonTheoryGaps.ts
Documentation des corrections du comportement du terminal et des leçons.
  • Ajout de mentions dans le changelog concernant la sécurité des transferts, les chemins Windows, les commandes PowerShell, les exemples des leçons et le comportement de validation.
CHANGELOG.md

Conseils et commandes

Interagir avec Sourcery

  • Déclencher une nouvelle review : commentez @sourcery-ai review sur la pull request.
  • Poursuivre les discussions : répondez directement aux commentaires de review de Sourcery.
  • Générer une issue GitHub à partir d’un commentaire de review : demandez à Sourcery de créer une issue à partir d’un commentaire de review en y répondant. Vous pouvez également répondre à un commentaire de review avec @sourcery-ai issue pour créer une issue à partir de celui-ci.
  • Générer un titre de pull request : écrivez @sourcery-ai n’importe où dans le titre de la pull request pour générer un titre à tout moment. Vous pouvez également commenter @sourcery-ai title sur la pull request pour générer ou régénérer le titre à tout moment.
  • Générer un résumé de pull request : écrivez @sourcery-ai summary n’importe où dans le corps de la pull request pour générer un résumé de PR à tout moment, exactement à l’endroit souhaité. Vous pouvez également commenter @sourcery-ai summary sur la pull request pour générer ou régénérer le résumé à tout moment.
  • Générer le guide du reviewer : commentez @sourcery-ai guide sur la pull request pour générer ou régénérer le guide du reviewer à tout moment.
  • Résoudre tous les commentaires de Sourcery : commentez @sourcery-ai resolve sur la pull request pour résoudre tous les commentaires de Sourcery. Utile si vous avez déjà traité tous les commentaires et ne souhaitez plus les voir.
  • Rejeter toutes les reviews de Sourcery : commentez @sourcery-ai dismiss sur la pull request pour rejeter toutes les reviews existantes de Sourcery. Particulièrement utile si vous souhaitez repartir de zéro avec une nouvelle review — n’oubliez pas de commenter @sourcery-ai review pour déclencher une nouvelle review !

Personnaliser votre expérience

Accédez à votre tableau de bord pour :

  • Activer ou désactiver les fonctionnalités de review, telles que le résumé de pull request généré par Sourcery, le guide du reviewer et d’autres fonctionnalités.
  • Modifier la langue de review.
  • Ajouter, supprimer ou modifier les instructions de review personnalisées.
  • Ajuster les autres paramètres de review.

Obtenir de l’aide

Original review guide in English

Reviewer's Guide

This PR centralizes cp/mv transfer semantics with safety checks, adds Windows path and PowerShell compatibility across the terminal, completion, and exercises, updates affected lessons, and verifies the behavior with focused engine and lesson-fidelity tests.

Sequence diagram for cross-platform file transfer

sequenceDiagram
    participant User
    participant TerminalEmulator
    participant CommandEngine
    participant Transfer
    participant FileSystem

    User->>TerminalEmulator: Enter cp or mv command
    TerminalEmulator->>CommandEngine: processCommand(command, environment)
    CommandEngine->>Transfer: cmdCp or cmdMv(args)
    Transfer->>FileSystem: resolvePath(source, destination)
    Transfer->>Transfer: transfer(cmd, state, args)
    alt destination is an existing directory
        Transfer->>FileSystem: Copy source inside destination or move source inside destination
    else invalid or unsafe transfer
        Transfer-->>CommandEngine: Return GNU-style error
    end
    CommandEngine-->>TerminalEmulator: Updated root, cwd, and output
Loading

File-Level Changes

Change Details Files
Implemented GNU-like destination-directory behavior and safety checks for cp and mv.
  • Routes all transfer operations through a shared option parser and transfer implementation.
  • Places sources inside existing destination directories and requires directories for multiple sources.
  • Adds recursive directory copying with merge and no-clobber behavior.
  • Prevents self-transfers, invalid type overwrites, non-empty directory moves, and mv .; preserves cwd when moving the current directory or an ancestor.
  • Supports short/long options including verbose, no-clobber, interactive, force, and GNU-style unknown-option errors.
src/app/data/terminalEngine.ts
src/app/data/commands/windows.ts
src/test/terminalEngine.test.ts
Added Windows and PowerShell path semantics throughout terminal execution and navigation.
  • Normalizes backslash, relative-dot, drive-letter, and simulated C:\Users paths while keeping Bash behavior unchanged.
  • Displays the simulated home hierarchy with Windows names and updates Git path formatting.
  • Adds PowerShell-compatible recursive parameters, named -Path/-Destination parsing, recursive removal/copying, and parent creation for mkdir.
  • Extends Tab completion to Windows separators and drive paths, and propagates cwd changes from Move-Item.
src/app/data/terminalEngine.ts
src/app/data/commands/windows.ts
src/app/data/commands/git.ts
src/app/components/TerminalEmulator.ts
src/test/terminalEngine.test.ts
Made Windows lesson commands and path-based exercise validation environment-aware.
  • Accepts backslash-separated Windows paths when validating exercises.
  • Uses environment-specific lesson examples for mv, rm, and related PowerShell commands.
  • Replays Windows path variants in lesson-fidelity tests and reduces tracked theory gaps and Bash-on-Windows exceptions.
src/app/components/LessonPage.tsx
src/app/data/validators.ts
src/app/data/curriculum.ts
src/test/lessonFidelity.test.ts
src/test/lessonTheoryGaps.ts
Documented the terminal and lesson behavior fixes.
  • Added changelog coverage for transfer safety, Windows paths, PowerShell commands, lesson examples, and validation behavior.
CHANGELOG.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@thierryvm
thierryvm merged commit 416483d into main Sep 24, 2026
4 checks passed

This branch was successfully deployed

1 active deployment
Preview — 5a0105f1 Deployed Sep 24, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant