quarto emits ANSI cursor-control sequences when stderr is not a terminal
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 74/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Pouca atividade
- Stack de tecnologia
- typescript
- Domínio
- cli
Direção de pesquisa
Comece em src/core/console.ts, depois leia isInteractiveTerminal() em src/core/platform.ts e o tratamento relacionado em src/core/log.ts. Reproduza o problema com quarto check versions 2>\u00261 | cat -v e condicione a saída de controle do cursor e de progresso a um terminal stderr interativo. Está concluído quando a saída redirecionada ou canalizada não contiver sequências ANSI brutas de controle do cursor, enquanto o comportamento no terminal continuar interativo.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
When quarto's stderr is piped, redirected to a file, or consumed by an editor build tool (e.g. Emacs M-x compile, VS Code tasks), progress and spinner helpers still emit ANSI cursor-control sequences. These appear as raw escape bytes in the output buffer:
^[[0G^[[2K^[[J^[[0G^[[2K^[[J^[[0G
Reported in https://github.com/orgs/quarto-dev/discussions/14403
Root cause
src/core/console.ts emits cursor-control bytes without checking whether the output stream is a terminal. Specifically, clearLine() calls ansi.eraseLine.cursorLeft() unconditionally, and spinner() and progressBar() gate their output on runningInCI() but not on whether stderr is actually a TTY. withSpinner()'s cancel path always calls clearLine(), regardless of where output goes.
NO_COLOR does not cover this — it governs colors only. --log-format plain governs the log file format, not console output.
The codebase already has the right helper: isInteractiveTerminal() in src/core/platform.ts, which returns Deno.stderr.isTerminal(). It is already used in command/create/cmd.ts and command/publish/cmd.ts to gate interactive prompts, but not in src/core/console.ts.
src/core/log.ts's LogFileHandler.format() already handles this for file output — messages starting with \r are dropped because they are progress lines. The same "progress is terminal-only" notion is not applied to the stderr console handler or to clearLine().
Reproduction
Any quarto command that uses withSpinner or progressBar shows this when stderr is piped. The cleanest CLI-only form:
quarto check versions 2>&1 | cat -v
quarto install tinytex 2>&1 | cat -v
leading to something like
$ quarto check versions 2>&1 | cat -v
Quarto 1.10.3
^M[>] Checking versions of quarto binary dependencies...
Pandoc version 3.8.3: OK
Dart Sass version 1.87.0: OK
Deno version 2.4.5: OK
Typst version 0.14.2: OK
^M[>] Checking versions of quarto dependencies......OK
Or via Emacs M-x compile running quarto render example.qmd --to html, where the compilation buffer is not a TTY.
Suggested direction
Gate clearLine(), spinner(), and progressBar() on isInteractiveTerminal() (extending the !runningInCI() check that is already there to also require a TTY). This matches the idiom already used for interactive prompts in create/publish, and aligns console behavior with the file-handler behavior in log.ts.
- Linguagem predominante
- JavaScript
- Estrelas
- 6.1k
- Forks
- 471
- Merge médio
- 16h 41min
- PRs com merge (30d)
- 102
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de quarto-dev/quarto-cli
-
accessibility bug website-navigation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 83/100
quarto-dev/quarto-cli#15190 ·
Mantenedores costumam responder em até 1 dia
-
accessibility bug website-navigation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
quarto-dev/quarto-cli#15188 ·
Mantenedores costumam responder em até 1 dia
-
accessibility bug html websites
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
quarto-dev/quarto-cli#15187 ·
Mantenedores costumam responder em até 1 dia
-
enhancement themes websites
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
quarto-dev/quarto-cli#15179 ·
Mantenedores costumam responder em até 1 dia
-
about-page bug layout websites
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 82/100
quarto-dev/quarto-cli#15178 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de quarto-dev/quarto-cli
Issues semelhantes
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 72/100
Mantenedores costumam responder em até 1 dia
-
type/bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
flarum/framework#5301 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
AOSSIE-Org/BabyNest#284 ·
Mantenedores costumam responder em até 1 dia
-
status:untriaged
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 86/100
midnightntwrk/servicedesk#275 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 85/100
seek4science/seek#2762 ·
Mantenedores costumam responder em até 5 dias