Skip to content

refactor: make exit command a regular, configurable command#1870

Merged
gnodet merged 9 commits into
jline:masterfrom
Elec332:exit
Jun 15, 2026
Merged

refactor: make exit command a regular, configurable command#1870
gnodet merged 9 commits into
jline:masterfrom
Elec332:exit

Conversation

@Elec332

@Elec332 Elec332 commented May 11, 2026

Copy link
Copy Markdown
Contributor

Make the exit command an optional command that can be disabled, implemented as all other commands without special treatment.

Summary by CodeRabbit

  • New Features

    • Configurable built-in "exit" command (alias "quit") to terminate shell sessions (enabled by default).
  • Behavior Changes

    • REPL input flow refined: EOF/interruption and dispatch now handled together; empty lines skipped earlier.
    • "exit"/"quit" are processed via normal command dispatch instead of being special-cased.
  • Tests

    • Added/updated tests, shared terminal fixtures, and a reusable echo test command.

Review Change Stack

…mented as all other commands without special treatment.
@coderabbitai

coderabbitai Bot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Replace hardcoded REPL exit checks with a pluggable ExitCommands group (configurable via ShellBuilder), centralize EOF handling in the dispatcher, and refactor tests to use shared terminal fixtures and a TestEchoCommand.

Changes

Pluggable Exit Command Feature

Layer / File(s) Summary
Shell Loop Refactor
shell/src/main/java/org/jline/shell/Shell.java
Reorganized read/dispatch iteration: null handling, trim/empty-line skipping, and dispatch occur in the same try block; removed hardcoded "exit"/"quit" checks.
Exit Command Implementation
shell/src/main/java/org/jline/shell/impl/ExitCommands.java
New ExitCommands group registers exit and alias quit; execute() throws EndOfFileException.
Builder Configuration
shell/src/main/java/org/jline/shell/ShellBuilder.java
Adds enableExitCommands field (default true) and public exitCommands(boolean enable) method; build() conditionally registers ExitCommands when enabled.
Dispatcher EOF Handling
shell/src/main/java/org/jline/shell/impl/DefaultCommandDispatcher.java
Introduces runCommandStage(...) to centralize stage execution, imports EndOfFileException, sets session exit codes, and applies conditional suppression/rethrow logic; executeSingleStage/executePipeGroup now delegate to it.
Test Terminal Base
shell/src/test/java/org/jline/shell/AbstractTerminalTest.java
Adds AbstractTerminalTest that wires piped I/O streams, builds a dumb(true) Terminal in setUp(), and closes resources in tearDown().
Test Base Refactor
shell/src/test/java/org/jline/shell/impl/AbstractCommandDispatcherTest.java, shell/src/test/java/org/jline/shell/impl/AbstractCommandsTest.java
Tests now extend AbstractTerminalTest; removed constructor-based dispatcher factories; added createDispatcher() hook; tearDown() delegates terminal cleanup.
TestEchoCommand & Fixture
shell/src/test/java/org/jline/shell/impl/TestEchoCommand.java
Adds TestEchoCommand fixture (constructor, description, execute) used by multiple tests.
ShellBuilder Tests
shell/src/test/java/org/jline/shell/ShellBuilderTest.java
Refactors to use shared terminal base and adds tests for prompt, reader options, history, command groups, onReaderReady, and exit enable/disable behavior.
Default Dispatcher Tests
shell/src/test/java/org/jline/shell/impl/DefaultCommandDispatcherTest.java
Adds ExitCommand fixture throwing EndOfFileException; adds integration tests covering exit in pipeline/AND/OR/sequence contexts; updates setups to use TestEchoCommand.
Misc Test Adjustments
shell/src/test/java/org/jline/shell/impl/*
Help/IORedirection/SignalHandling/CommandHighlighter/SimpleCommandGroup/VariableCommands tests updated to use shared fixtures and remove inline command classes.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • jline/jline3#1868: Related test infrastructure changes to AbstractCommandDispatcherTest and AbstractCommandsTest.

Suggested labels

enhancement

Suggested reviewers

  • gnodet

Poem

🐰 I hopped through code and trimmed each line,
Exit is a command now, tidy and fine.
Tests share pipes and echoes all around,
Dispatcher greets EOF and sets the code sound,
A cheerful rabbit dances on the shell's new ground.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'refactor: make exit command a regular, configurable command' directly and accurately summarizes the main change: converting the exit command from special built-in handling to a standard, optional, configurable command.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@shell/src/main/java/org/jline/shell/impl/ExitCommands.java`:
- Line 29: Rename the inner class currently named SetOptCommand to ExitCommand
to match its behavior; update any references/instantiations (e.g., the
constructor call that creates new SetOptCommand(...)) to use new
ExitCommand(...) and adjust the class declaration from "private static class
SetOptCommand" to "private static class ExitCommand" so the class name and all
usages reflect the exit/quit semantics.

In `@shell/src/test/java/org/jline/shell/impl/AbstractCommandDispatcherTest.java`:
- Around line 51-72: The tearDown() method closes terminalInput without checking
for null, which can throw NPE if setUp() failed; update tearDown() to guard
terminalInput with a null check before calling terminalInput.close(), similar to
how terminal and dispatcher are handled, and ensure this check occurs inside the
final try block that currently encloses terminalInput.close() and
terminalStream.close() so terminalStream remains closed only if non-null.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9b6e584e-47d4-43f8-bdbf-336b99b07e36

📥 Commits

Reviewing files that changed from the base of the PR and between a60217d and c3be2c1.

📒 Files selected for processing (7)
  • shell/src/main/java/org/jline/shell/Shell.java
  • shell/src/main/java/org/jline/shell/ShellBuilder.java
  • shell/src/main/java/org/jline/shell/impl/ExitCommands.java
  • shell/src/test/java/org/jline/shell/impl/AbstractCommandDispatcherTest.java
  • shell/src/test/java/org/jline/shell/impl/AbstractCommandsTest.java
  • shell/src/test/java/org/jline/shell/impl/ExitCommandsTest.java
  • shell/src/test/java/org/jline/shell/impl/VariableCommandsTest.java
💤 Files with no reviewable changes (1)
  • shell/src/test/java/org/jline/shell/impl/AbstractCommandsTest.java

Comment thread shell/src/main/java/org/jline/shell/impl/ExitCommands.java Outdated
@augmentcode

augmentcode Bot commented May 11, 2026

Copy link
Copy Markdown
🤖 Augment PR Summary

Summary: This PR makes the shell’s exit/quit behavior optional by turning it into a normal command group, so embedding applications can disable it.

Changes:

  • Removed special-cased exit/quit handling from Shell.run() and routes exit through the dispatcher.
  • Added ExitCommands as a built-in command group that exits by throwing EndOfFileException.
  • Added ShellBuilder.exitCommands(boolean) (default enabled) to register/omit the new group.
  • Refactored shell test scaffolding to use piped terminal streams and an overridable createDispatcher() hook.
  • Added ExitCommandsTest and updated VariableCommandsTest to work with the new test scaffolding.

Technical Notes: Exit now behaves like other commands (can be disabled, and can be overridden by earlier-registered command groups).

🤖 Was this summary useful? React with 👍 or 👎

@augmentcode augmentcode 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.

Review completed. 2 suggestions posted.

Fix All in Augment

Comment augment review to trigger a new review at any time.

continue;
}

dispatcher.execute(line);

@augmentcode augmentcode Bot May 11, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

shell/src/main/java/org/jline/shell/Shell.java:131: Since dispatcher.execute(line) is now inside the same try, the generic catch (Exception e) will also catch exceptions from promptSupplier.get(), rightPromptSupplier.get(), or reader.readLine(...) and keep looping. That can hide configuration/terminal failures and potentially lead to an error-spam loop instead of failing fast.

Severity: medium

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

@Elec332 Elec332 May 12, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@gnodet The logic from this pull alligns with the old console module way of handling this loop. If you want this changed per this bot's comment I can do so.

Comment thread shell/src/main/java/org/jline/shell/impl/ExitCommands.java Outdated
…mand test cases and moved ShellBuilder exit tests to the correct class.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
shell/src/test/java/org/jline/shell/impl/AbstractCommandDispatcherTest.java (1)

45-47: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Guard dispatcher cleanup when setup fails.

dispatcher.close() at Line 46 can throw NullPointerException when @BeforeEach fails before initialization, masking the original failure.

Proposed fix
     `@Override`
     `@AfterEach`
     protected void tearDown() throws IOException {
         try {
-            dispatcher.close();
+            if (dispatcher != null) {
+                dispatcher.close();
+            }
         } finally {
             super.tearDown();
         }
     }

Based on learnings, AfterEach runs even if BeforeEach throws, so cleanup must null-check partially initialized fields.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@shell/src/test/java/org/jline/shell/impl/AbstractCommandDispatcherTest.java`
around lines 45 - 47, The test teardown calls dispatcher.close() unconditionally
which can throw a NullPointerException if `@BeforeEach` failed; modify the
AfterEach cleanup to guard the call by checking that dispatcher is not null
before invoking dispatcher.close() (i.e., wrap the call with a null-check in the
AfterEach method of AbstractCommandDispatcherTest) so partially-initialized
state from a failed `@BeforeEach` won't mask the original failure.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@shell/src/test/java/org/jline/shell/AbstractTerminalTest.java`:
- Around line 34-41: Replace the current TerminalBuilder-based dumb terminal
construction in setUp() with a LineDisciplineTerminal-backed test fixture: stop
creating terminalInput/terminalStream and building via TerminalBuilder, instead
instantiate a LineDisciplineTerminal (use the constructor with parameters like
"test", "xterm", terminalOutput, StandardCharsets.UTF_8) and assign it to the
terminal field so the shared test fixture uses LineDisciplineTerminal for I/O in
setUp().

---

Duplicate comments:
In `@shell/src/test/java/org/jline/shell/impl/AbstractCommandDispatcherTest.java`:
- Around line 45-47: The test teardown calls dispatcher.close() unconditionally
which can throw a NullPointerException if `@BeforeEach` failed; modify the
AfterEach cleanup to guard the call by checking that dispatcher is not null
before invoking dispatcher.close() (i.e., wrap the call with a null-check in the
AfterEach method of AbstractCommandDispatcherTest) so partially-initialized
state from a failed `@BeforeEach` won't mask the original failure.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9a9e1028-bf43-48af-aa8c-d0db4abf4010

📥 Commits

Reviewing files that changed from the base of the PR and between c3be2c1 and 5f3d4b8.

📒 Files selected for processing (13)
  • shell/src/main/java/org/jline/shell/impl/DefaultCommandDispatcher.java
  • shell/src/main/java/org/jline/shell/impl/ExitCommands.java
  • shell/src/test/java/org/jline/shell/AbstractTerminalTest.java
  • shell/src/test/java/org/jline/shell/ShellBuilderTest.java
  • shell/src/test/java/org/jline/shell/impl/AbstractCommandDispatcherTest.java
  • shell/src/test/java/org/jline/shell/impl/CommandHighlighterTest.java
  • shell/src/test/java/org/jline/shell/impl/DefaultCommandDispatcherTest.java
  • shell/src/test/java/org/jline/shell/impl/ExitCommandsTest.java
  • shell/src/test/java/org/jline/shell/impl/HelpCommandsTest.java
  • shell/src/test/java/org/jline/shell/impl/IORedirectionTest.java
  • shell/src/test/java/org/jline/shell/impl/SignalHandlingTest.java
  • shell/src/test/java/org/jline/shell/impl/SimpleCommandGroupTest.java
  • shell/src/test/java/org/jline/shell/impl/TestEchoCommand.java
💤 Files with no reviewable changes (1)
  • shell/src/test/java/org/jline/shell/impl/CommandHighlighterTest.java
✅ Files skipped from review due to trivial changes (1)
  • shell/src/test/java/org/jline/shell/impl/SimpleCommandGroupTest.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • shell/src/main/java/org/jline/shell/impl/ExitCommands.java

Comment thread shell/src/test/java/org/jline/shell/AbstractTerminalTest.java
@gnodet gnodet changed the title change: Make the exit command an optional command that can be disabled refactor: make exit command a regular, configurable command May 12, 2026

@gnodet gnodet left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Shell.java:88 — The run() Javadoc still references the removed built-in exit/quit commands. Suggested fix:

 * This method blocks until the user exits (e.g. via EOF or an exit command),
 * or until {@link #stop()} is called.

Claude Code on behalf of Guillaume Nodet

Comment thread shell/src/main/java/org/jline/shell/impl/DefaultCommandDispatcher.java Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@shell/src/main/java/org/jline/shell/impl/DefaultCommandDispatcher.java`:
- Around line 378-380: executePipeGroup currently treats EndOfFileException as a
generic Exception and sets session.setLastExitCode(1), causing inconsistent
exit-code behavior versus executeSingleStage; update executePipeGroup to catch
EndOfFileException separately (like the catch in executeSingleStage), call
session.setLastExitCode(0) and rethrow the EndOfFileException, so exit-code
handling is consistent across both execution contexts (refer to
executePipeGroup, executeSingleStage, EndOfFileException, and
session.setLastExitCode).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7f29a5e1-5c9a-4e80-808c-00f087375534

📥 Commits

Reviewing files that changed from the base of the PR and between 47eaedb and bfbec48.

📒 Files selected for processing (2)
  • shell/src/main/java/org/jline/shell/Shell.java
  • shell/src/main/java/org/jline/shell/impl/DefaultCommandDispatcher.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • shell/src/main/java/org/jline/shell/Shell.java

Comment thread shell/src/main/java/org/jline/shell/impl/DefaultCommandDispatcher.java Outdated
@Elec332

Elec332 commented May 12, 2026

Copy link
Copy Markdown
Contributor Author

There are 2 things still of note for this pull:

  • The command execution logic is currently in the same try block as the lineReader. This matches old console behaviour, but could lead to the CommandDispatcher catching stray non-command exceptions.
  • To exit the shell with a command and EndOfFileException is thrown. This matches old console behaviour and allows the command dispatcher to run in the same try block as the linereader, and because they throw the same exception upon exit the logic alligns perfectly. Another option woul be to create a dedicated exception, e.g. ExitShellException (extending RuntimeException) to indicate that a REPL loop should be exited to make the intended behaviour clearer.

@gnodet I would like your personal opinion on these 2 matters before a merge

@gnodet

gnodet commented May 14, 2026

Copy link
Copy Markdown
Member

There are 2 things still of note for this pull:

  • The command execution logic is currently in the same try block as the lineReader. This matches old console behaviour, but could lead to the CommandDispatcher catching stray non-command exceptions.
  • To exit the shell with a command and EndOfFileException is thrown. This matches old console behaviour and allows the command dispatcher to run in the same try block as the linereader, and because they throw the same exception upon exit the logic alligns perfectly. Another option woul be to create a dedicated exception, e.g. ExitShellException (extending RuntimeException) to indicate that a REPL loop should be exited to make the intended behaviour clearer.

@gnodet I would like your personal opinion on these 2 matters before a merge

Aligning with the old console behaviour is a requirement. I'd prefer a cleaner approach, so I you can push a follow-up commit fixing both points, that would be really good imho.

…hellException.

Also fixed CommandDispatcher#trace not flushing the terminal.
@sonarqubecloud

Copy link
Copy Markdown

@gnodet

gnodet commented May 18, 2026

Copy link
Copy Markdown
Member

There are 2 things still of note for this pull:

  • The command execution logic is currently in the same try block as the lineReader. This matches old console behaviour, but could lead to the CommandDispatcher catching stray non-command exceptions.
  • To exit the shell with a command and EndOfFileException is thrown. This matches old console behaviour and allows the command dispatcher to run in the same try block as the linereader, and because they throw the same exception upon exit the logic alligns perfectly. Another option woul be to create a dedicated exception, e.g. ExitShellException (extending RuntimeException) to indicate that a REPL loop should be exited to make the intended behaviour clearer.

@gnodet I would like your personal opinion on these 2 matters before a merge

Aligning with the old console behaviour is a requirement. I'd prefer a cleaner approach, so I you can push a follow-up commit fixing both points, that would be really good imho.

Aligning with the old console behaviour is NOT a requirement.

@Elec332

Elec332 commented May 18, 2026

Copy link
Copy Markdown
Contributor Author

This is what I expected, as both points somewhat contradicted each other.

I separated the try-blocks for cleaner command exception handling.
I also added a new exception to mark that a shell REPL should be exited. This exception can have an optional message that will be displayed after the loop exits (which can also be set in the builder).

@gnodet gnodet added this to the 4.2.0 milestone May 22, 2026

@gnodet gnodet left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Good architectural improvement. Making the exit command a regular, configurable command group follows the framework's existing patterns and gives embedders control over shell lifecycle.

Key observations:

  • ExitShellException: Clean approach for control flow, as discussed with the maintainer. Extends RuntimeException so it propagates naturally through the dispatcher. The optional message support is a nice touch.

  • Pipe chain semantics: The runCommandStage() refactoring correctly suppresses ExitShellException when it's the last command in a pipe chain (op == null && multi), matching bash behavior where pipe elements run in subshells. For &&, ||, and ; operators, the exception propagates and the shell exits — also correct.

  • Test coverage: Thorough test matrix covering exit | echo, exit && echo, exit || echo, exit ; echo, and the reverse directions. The noExitShellCommand test properly validates the disable path. The shared TestEchoCommand and AbstractTerminalTest reduce duplication across test classes.

  • Builder API: exitCommands(boolean) and exitMessage(String) are intuitive. The auto-enable behavior of exitMessage() is documented in the javadoc.

All CI checks pass.

Fully automatic review from Claude Code on behalf of Guillaume Nodet

@gnodet gnodet modified the milestones: 4.2.0, 4.1.3 May 26, 2026

@gnodet gnodet left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Good architectural improvement — making the exit command a regular, configurable command group is the right direction. The refactoring is clean, the test coverage is thorough (pipe chains, &&/||/; semantics, enable/disable), and the runCommandStage() consolidation eliminates real duplication between single-stage and pipe-group execution.

A couple of minor observations for future consideration:

  1. ExitShellException stack trace overhead: Since ExitShellException is purely a control-flow signal (never logged, never inspected), it's paying for stack trace generation on every exit. Overriding fillInStackTrace() to return this is a common pattern for control-flow exceptions and would avoid that cost.

  2. Exit code arguments: The ExitCommand currently ignores args, so exit 42 silently discards the status code. Not blocking for this PR, but worth considering for future extensibility.

The pipe-chain semantics are correct: exit | echo recovered suppresses the exit (bash subshell behavior), while exit && echo, exit || echo, and exit ; echo all propagate. The test matrix covers both directions nicely.

Overall this is well done. No blocking issues.

Review by Claude Code on behalf of Guillaume Nodet


public ExitShellException(String message) {
super(message);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Consider overriding fillInStackTrace() to avoid the cost of generating a stack trace. Since this exception is used purely for control flow (never logged or inspected), the stack trace is wasted work:

Suggested change
}
public ExitShellException(String message) {
super(message);
}
@Override
public synchronized Throwable fillInStackTrace() {
return this;
}

This is a common pattern for control-flow exceptions. Not blocking, but a nice optimization.

Review by Claude Code on behalf of Guillaume Nodet

}

@Override
public Object execute(CommandSession session, String[] args) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nit: the command ignores args, so exit 42 silently discards the exit code. Not blocking for this PR, but worth noting for future work — bash users may expect exit <code> to set the process exit status. The ExitShellException could carry an optional int exitCode field alongside the message.

Review by Claude Code on behalf of Guillaume Nodet

@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
C Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@gnodet
gnodet merged commit 26df0f3 into jline:master Jun 15, 2026
18 of 27 checks passed
@gnodet gnodet modified the milestones: 4.2.0, 4.1.4 Jun 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants