Skip to content

feat(terminal): wildcards expand as in bash 5.2; ls lists several operands like GNU ls - #419

Merged
thierryvm merged 2 commits into
mainfrom
feat/globbing
Oct 2, 2026
Merged

thierryvm merged 2 commits into
mainfrom
feat/globbing

Conversation

@thierryvm

@thierryvm thierryvm commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Summary

This is Phase 5d, lot 1, PR 2b. The Linux and macOS terminals never expanded wildcards. Commands such as ls documents/* or cat documents/*.md looked for a file literally named *.

Pathname expansion, as bash 5.2 does it (new src/app/data/commands/glob.ts):

  • *, ?, [...], [!x] and [^x].
  • Hidden files only match a pattern that starts with a dot; . and .. never match.
  • */ keeps folders only.
  • Matches are sorted in the locale's order.
  • A word with no match is left as typed: ls *.txt gives cannot access '*.txt'.
  • parseArgs keeps one flag per character, so wildcards in quotes, after a backslash, or inside a variable's value stay literal.
  • PowerShell is untouched: its cmdlets read wildcards themselves.

ls with several operands now follows GNU ls:

  • errors first, then the files, then each folder under a name: header, separated by blank lines;
  • -d lists the folders themselves;
  • before, only the first operand was listed.

Reference page: a new ls documents/*.md example explains that the shell replaces the star.

Expected values come from captures on Ubuntu 24.04 (bash 5.2.21, coreutils 9.4): 40 for globbing and 22 for ls.

Checks

  • Local gates: tsc, lint, 3057 tests and build all pass. The only failure is the flaky Supabase network integration test.
  • Ratchets unchanged: 90 theory gaps, 32 lessons showing bash on Windows.
  • feature-dev:code-reviewer: no confident finding. Its low-cost suggestion is applied: consecutive stars collapse into one.
  • terminal-fidelity-auditor: 573 commands against bash 5.2 / coreutils 9.4. The glob core and multi-operand ls matched. The audit found that wildcards exposed commands that only handled their first operand. These are fixed in the second commit, with expected values captured on Ubuntu:
    • redirection targets are expanded (> documents/*.md; several matches give ambiguous redirect);
    • cd with several operands gives too many arguments;
    • chmod, rm and mkdir handle every operand;
    • head and tail print several files under ==> headers, and accept -N, +N and 0;
    • ls reads -A, -r, -lF, long options and --, and exits with 2 on error;
    • [[:class:]] works inside brackets.
  • feature-dev:code-reviewer on the fixes: no regression in Windows routing, unicode RegExp escapes, redirections or lesson validators. Its minor findings are fixed: tail -n 0/+N, head -n -N, the graph/print/cntrl classes, - after a class, and > "".
  • Raw mismatches in the auditor's harness went from 204 to 163. The rest is measurement noise (/tmp paths, ls -l metadata) or debt listed in docs/plan.md.

Known debt (docs/plan.md): brace expansion, an unquoted $VAR holding *, [a\-z], // in globs, ls -R, locale order in ls, # comments, chmod's confirmation line.

🤖 Generated with Claude Code

…rands like GNU ls

The Linux and macOS terminals never expanded `*`, `?` or `[...]`: `rm *.txt`
looked for a file named "*". parseArgs now keeps one flag per character
(typed bare, or protected by quotes or a backslash) and expands words with
an active wildcard against the files (src/app/data/commands/glob.ts):
hidden files only for a pattern starting with a dot, never . or .., `*/`
for folders, [!x] and [^x], sorted in the locale's order, a word with no
match left as typed. PowerShell is untouched: its cmdlets read wildcards.

ls with several operands now prints errors, then the files, then each
folder under a "name:" header, as GNU ls does; -d lists folders themselves.

Expected values: 40 globbing and 22 ls captures on Ubuntu 24.04 (bash
5.2.21, coreutils 9.4), 2 October 2026. code-reviewer: no confident
finding; consecutive stars collapsed to limit backtracking.

Phase 5d, lot 1, PR 2b.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 2, 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 Oct 2, 2026 7:50pm 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 23 hours and 40 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@sourcery-ai

sourcery-ai Bot commented Oct 2, 2026

Copy link
Copy Markdown

Guide du reviewer

Introduit l’expansion des chemins d’accès de type shell Unix avant l’exécution des commandes, tout en préservant les sémantiques de guillemets et d’échappement et en laissant PowerShell inchangé, et met à jour ls afin de formater plusieurs opérandes de fichiers et de répertoires comme GNU ls. La PR ajoute une couverture de régression ciblée pour l’expansion des jokers et ls, ainsi que de la documentation de référence, un changelog et une feuille de route.

Diagramme de séquence pour l’expansion des chemins Unix avant l’exécution des commandes

sequenceDiagram
    participant User
    participant Shell as UnixShell
    participant Glob as expandGlob
    participant FS as VirtualFileSystem
    participant Command as UnixCommand

    User->>Shell: Saisir une commande avec un joker actif
    Shell->>Shell: parseArgs(input)
    Shell->>Glob: expandGlob(word, meta, cwd, list)
    Glob->>FS: Répertorier les entrées de répertoire correspondantes
    FS-->>Glob: Fichiers et dossiers correspondants
    Glob-->>Shell: Chemins triés selon la locale ou mot inchangé
    Shell->>Command: Exécuter les arguments étendus
Loading

Diagramme de séquence pour ls de style GNU avec plusieurs opérandes

sequenceDiagram
    participant Shell as UnixShell
    participant LS as cmdLs
    participant FS as VirtualFileSystem

    Shell->>LS: Exécuter ls avec les opérandes étendues
    LS->>FS: Résoudre chaque opérande
    FS-->>LS: Fichiers, dossiers et chemins inexistants
    LS->>LS: Collecter les erreurs, les fichiers et les répertoires
    LS->>LS: Trier les groupes d’opérandes
    LS-->>Shell: Erreurs en premier, fichiers, en-têtes de répertoires, séparateurs vides
Loading

Diagramme de flux pour la correspondance des jokers et la préservation des littéraux

flowchart TD
    A[Ligne de commande Unix] --> B{Joker actif ?}
    B -->|Non| C[Conserver le mot tel quel]
    B -->|Oui| D[expandGlob]
    D --> E{Le motif correspond ?}
    E -->|Non| C
    E -->|Oui| F[Filtrer les fichiers cachés et les dossiers avec barre oblique finale]
    F --> G[Trier les correspondances selon la locale]
    G --> H[Transmettre les chemins étendus à la commande]
    I[Joker entre guillemets ou échappé] --> C
Loading

Modifications fichier par fichier

Modification Détails Fichiers
Ajoute l’expansion des chemins compatible avec bash au processus d’analyse du shell Unix.
  • Suit les métadonnées de guilletage et d’échappement pour chaque caractère lors de l’analyse des mots.
  • Étend *, ?, les expressions entre crochets, les classes négatives, les segments de chemin imbriqués, les barres obliques finales réservées aux répertoires et les chemins fondés sur le tilde.
  • Exclut les entrées cachées, sauf si le motif commence par ., ne correspond jamais à . ou .., trie les correspondances selon la locale et préserve littéralement les motifs sans correspondance.
  • Conserve la gestion des jokers de PowerShell inchangée et documente l’expansion des accolades ainsi que les valeurs de variables contenant des jokers comme éléments restant à traiter.
src/app/data/commands/glob.ts
src/app/data/terminalEngine.ts
src/test/terminalEngine.test.ts
Étend Unix ls afin de traiter plusieurs opérandes avec un regroupement et un formatage similaires à GNU.
  • Sépare les erreurs d’opérandes, les fichiers et les répertoires, trie les fichiers et les répertoires et affiche les en-têtes de répertoires avec une séparation par ligne vide.
  • Prend en charge -d pour afficher les opérandes de répertoire eux-mêmes et préserve le formatage de la sortie dans un terminal ou redirigée, notamment le comportement de -1, -l et -F.
  • Ajoute une couverture de régression pour les opérandes générées par des jokers, les combinaisons de fichiers et de répertoires, les erreurs, les entrées cachées et les modes d’affichage des répertoires.
src/app/data/terminalEngine.ts
src/test/terminalEngine.test.ts
Met à jour la documentation destinée aux utilisateurs et la planification du projet afin de refléter le nouveau comportement du terminal.
  • Ajoute un exemple de référence expliquant le remplacement des jokers côté shell.
  • Consigne le comportement des jokers et de ls avec plusieurs opérandes dans le changelog, le document de présentation et les documents de feuille de route.
  • Mentionne les captures de référence de bash 5.2/coreutils ainsi que les limitations connues liées à l’expansion des accolades et des variables.
src/app/data/commandExamples.ts
CHANGELOG.md
STORY.md
docs/ROADMAP.md
docs/plan.md

Conseils et commandes

Interagir avec Sourcery

  • Déclencher une nouvelle revue : commentez @sourcery-ai review sur la pull request.
  • Poursuivre les discussions : répondez directement aux commentaires de revue de Sourcery.
  • Générer une issue GitHub à partir d’un commentaire de revue : demandez à Sourcery de créer une issue à partir d’un commentaire de revue en y répondant. Vous pouvez également répondre à un commentaire de revue 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é 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.
  • Ignorer toutes les revues de Sourcery : commentez @sourcery-ai dismiss sur la pull request pour ignorer toutes les revues existantes de Sourcery. Particulièrement utile si vous souhaitez repartir de zéro avec une nouvelle revue : n’oubliez pas de commenter @sourcery-ai review pour déclencher une nouvelle revue !

Personnaliser votre expérience

Accédez à votre tableau de bord pour :

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

Obtenir de l’aide

Original review guide in English

Reviewer's Guide

Introduces Unix-shell pathname expansion before command execution, preserving quoting and escaping semantics while leaving PowerShell unchanged, and updates ls to format multiple file and directory operands like GNU ls. The PR adds focused globbing and ls regression coverage plus reference, changelog, and roadmap documentation.

Sequence diagram for Unix pathname expansion before command execution

sequenceDiagram
    participant User
    participant Shell as UnixShell
    participant Glob as expandGlob
    participant FS as VirtualFileSystem
    participant Command as UnixCommand

    User->>Shell: Enter command with active wildcard
    Shell->>Shell: parseArgs(input)
    Shell->>Glob: expandGlob(word, meta, cwd, list)
    Glob->>FS: List matching directory entries
    FS-->>Glob: Matching files and folders
    Glob-->>Shell: Locale-sorted paths or unchanged word
    Shell->>Command: Execute expanded arguments
Loading

Sequence diagram for GNU-style ls with multiple operands

sequenceDiagram
    participant Shell as UnixShell
    participant LS as cmdLs
    participant FS as VirtualFileSystem

    Shell->>LS: Execute ls with expanded operands
    LS->>FS: Resolve each operand
    FS-->>LS: Files, folders, and missing paths
    LS->>LS: Collect errors, files, and directories
    LS->>LS: Sort operand groups
    LS-->>Shell: Errors first, files, directory headers, blank separators
Loading

Flow diagram for wildcard matching and literal preservation

flowchart TD
    A[Unix command line] --> B{Wildcard active?}
    B -->|No| C[Keep word literal]
    B -->|Yes| D[expandGlob]
    D --> E{Pattern matches?}
    E -->|No| C
    E -->|Yes| F[Filter hidden files and trailing-slash folders]
    F --> G[Sort matches by locale]
    G --> H[Pass expanded paths to command]
    I[Quoted or escaped wildcard] --> C
Loading

File-Level Changes

Change Details Files
Adds bash-compatible pathname expansion to the Unix shell parsing path.
  • Tracks per-character quoting/escaping metadata while parsing words.
  • Expands *, ?, bracket expressions, negated classes, nested path segments, directory-only trailing slashes, and tilde-based paths.
  • Excludes hidden entries unless the pattern begins with ., never matches . or .., locale-sorts matches, and preserves unmatched patterns literally.
  • Keeps PowerShell wildcard handling unchanged and documents brace expansion and wildcard-containing variable values as remaining debt.
src/app/data/commands/glob.ts
src/app/data/terminalEngine.ts
src/test/terminalEngine.test.ts
Extends Unix ls to process multiple operands with GNU-like grouping and formatting.
  • Separates operand errors, files, and directories; sorts files and directories and prints directory headers with blank-line separation.
  • Supports -d for listing directory operands themselves and preserves terminal versus piped output formatting, including -1, -l, and -F behavior.
  • Adds regression coverage for wildcard-generated operands, mixed files/directories, errors, hidden entries, and directory listing modes.
src/app/data/terminalEngine.ts
src/test/terminalEngine.test.ts
Updates user-facing documentation and project planning to reflect the new terminal behavior.
  • Adds a reference example explaining shell-side wildcard replacement.
  • Records wildcard and multi-operand ls behavior in the changelog, story, and roadmap documents.
  • Notes bash 5.2/coreutils reference captures and the known brace-expansion and variable-expansion limitations.
src/app/data/commandExamples.ts
CHANGELOG.md
STORY.md
docs/ROADMAP.md
docs/plan.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

…y operand

A fidelity audit of PR #419 (573 commands against bash 5.2 and GNU
coreutils 9.4 on Ubuntu) found that the new wildcards exposed commands
that only handled their first operand.

- Redirection targets are expanded like arguments on Linux/macOS:
  one match is used, none keeps the word, several give
  "ambiguous redirect" (also for `> $UNSET`); `> ""` is an error.
- cd refuses more than one operand ("too many arguments").
- chmod, rm and mkdir process every operand and keep going after an
  error; rm gains -f/--force and drops the "(use -r)" suffix; mkdir
  errors use GNU's curly quotes (the PowerShell mapping accepts both).
- head and tail: several files under "==> f <==" headers, the -N form,
  0, +N and -N counts, GNU error messages.
- ls: real option parsing (bundled letters, --all, --almost-all,
  --directory, --reverse, --classify, `--`), -A, -r, -F with -l, exit
  status 2 on an unreadable operand.
- Wildcards: [:class:] inside brackets, a leading `]` is a member,
  `-` after a class is literal, an unknown class matches nothing.

Expected values come from captures on Ubuntu 24.04. Remaining gaps are
listed in docs/plan.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@thierryvm
thierryvm merged commit f24bbb1 into main Oct 2, 2026
4 checks passed
@thierryvm
thierryvm deleted the feat/globbing branch October 2, 2026 19:52

This branch was successfully deployed

1 active deployment
Preview — f5eb3b54 Deployed Oct 2, 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