Releases: jline/jline3
JLine 4.1.0
JLine 4.1 is the first minor release of the 4.x series, bringing new features, significant performance improvements, internal refactoring, and many bug fixes across terminal handling, encoding, and platform support.
Highlights include streaming pipes with concurrent pipeline execution, a new Sized interface for uniform terminal size access, optimized display rendering with direct byte buffers, modernized signal handling via Panama FFM sigaction(), and a comprehensive overhaul of termios constant mappings across all supported platforms.
🚀 New features and improvements
- refactor: introduce Sized interface and Size.of() factory methods (#1731) @Elec332
- feat: Added UnknownCommandException for Shell module (#1780) @Elec332
- feat: bulk read for NonBlockingPumpInputStream (#1778) @gnodet
- feat: add filterable(boolean) option to list and checkbox prompts (#1784) @ingokegel
- refactor: Deduplicate AttributedCharSequence#emitStyleChange. (#1788) @Elec332
- perf: optimize Display.update for minimal allocation and output bytes (#1785) @gnodet
- feat: streaming pipes with concurrent pipeline execution (#1777) @gnodet
- feat: optimize output rendering with direct byte buffer (#1749) @gnodet
- feat: modernize signal handling via Panama FFM sigaction() (#1750) @gnodet
- feat: Add /dev/tty fallback for terminals with piped streams (#1728) @gnodet
🐛 Bug Fixes
- Fix status bar duplication after vertical resize (#1860) @Abdelilah-AIT-HAMOU
- fix: remove proactive isNativeAccessEnabled() checks from terminal providers (#1859) @gnodet
- fix: prevent DA response bytes from leaking to parent shell (#1856) (#1857) @gnodet
- fix: correct inverted bounds check in readBuffered methods (#1853) @gnodet
- fix: wire up unmapped termios constants in JNI and FFM providers (#1838) @gnodet
- fix: correct Solaris termios constants from octal to proper hex (#1837) @gnodet
- fix: correct FreeBSD PENDIN and NOFLSH termios constants (#1834) @gnodet
- fix: correct Linux PENDIN termios constant (#1835) @gnodet
- fix: add missing CDTR_IFLOW readback in OsX toAttributes (#1836) @gnodet
- fix: replace Thread.sleep() with synchronization in TmuxEncodingTest (#1827) @gnodet
- fix: add VT100 response feedback to SwingTerminal and WebTerminal (#1824) @gnodet
- fix: use console encoding instead of default charset in Tmux (#1826) @gnodet
- fix: tail -n counts lines correctly when input lacks trailing newline (fixes #1787) (#1823) @gnodet
- fix: use terminal encoding instead of default charset in VirtualTerminal (fixes #1821) (#1822) @gnodet
- fix: close terminal in PromptBuilderTest to prevent resource leak (fixes #1810) (#1820) @gnodet
- fix: resolve redirect targets against session working directory (#1781) @gnodet
- fix: erase probe emoji after grapheme cluster width detection (fixes #1801) (#1770) @ingokegel
- fix: close PTY streams before shutdown to prevent hang on macOS (fixes #1808) (#1817) @gnodet
- fix: register all FFM foreign function signatures for GraalVM native-image (#1802) @gnodet
- fix: close terminals properly in tests (fixes #1806) (#1814) @gnodet
- fix: deprecate SwingTerminal.dispose() in favor of close() (fixes #1805) (#1811) @gnodet
- fix: avoid NPE when closing terminal with null masterOutput (#1813) @gnodet
- fix: Fix AttributedStyle color chaining (#1792) @Elec332
- fix: remove spurious (short) casts in Size setters (#1791) @gnodet
- fix: move Terminal parameter to first position in columnSubSequence and columnSplitLength (#1790) @gnodet
- fix: compiler error in ScreenTerminal.dump() (#1773) @Elec332
📦 Dependency updates
- chore: Bump actions/upload-pages-artifact from 4 to 5 (#1783) @dependabot[bot]
- chore: Bump org.graalvm.sdk:graal-sdk from 25.0.2 to 25.0.3 (#1799) @dependabot[bot]
- chore: Bump eu.maveniverse.maven.nisse:extension from 0.8.3 to 0.8.4 (#1798) @dependabot[bot]
- chore: Bump org.graalvm.buildtools:native-maven-plugin from 1.0.0 to 1.1.0 (#1816) @dependabot[bot]
- chore: Bump eu.maveniverse.maven.nisse:extension from 0.8.2 to 0.8.3 (#1772) @dependabot[bot]
📝 Documentation updates
- docs: add branch structure and release process to CLAUDE.md (#1844) @gnodet
- docs: update website for JLine 4.0 release (#1774) @gnodet
👻 Maintenance
- fix: deduplicate ReaderTestSupport between reader and builtins (fixes #1807) (#1815) @gnodet
- chore: add dependabot for 4.0.x maintenance branch (#1849) @gnodet
- fix: pass explicit version to nisse in release workflow (#1845) @gnodet
- refactor: modernize codebase with Java 9-11 idioms (#1839) @gnodet
- refactor: flatten terminal provider abstraction and extract TermiosMapping (#1828) @gnodet
- refactor: extract shared ScreenTerminalOutputStream (fixes #1797) (#1825) @gnodet
- refactor: Deduplicate AttributedCharSequence#emitStyleChange. (#1788) @Elec332
- refactor: trim unused public API from optimization commits (#1789) @gnodet
- refactor: standardize terminal dimension naming to columns/rows (#1755) @gnodet
🚦 Tests
JLine 4.0.15
JLine 4.0.15 is a patch release fixing status bar rendering after terminal resize.
Bug Fixes
- Fix status bar duplication after vertical resize (#1860) @Abdelilah-AIT-HAMOU
When the terminal height shrinks, some terminal emulators keep the old bottom status line just above the new status area, causing duplicated status bar rows. This release clears the stale status rows during resize.
Full Changelog: 4.0.14...4.0.15
JLine 3.30.13
JLine 3.30.13 is a patch release fixing status bar rendering after terminal resize.
Bug Fixes
- Fix status bar duplication after vertical resize (#1860) @Abdelilah-AIT-HAMOU
When the terminal height shrinks, some terminal emulators keep the old bottom status line just above the new status area, causing duplicated status bar rows. This release clears the stale status rows during resize.
Full Changelog: jline-3.30.12...jline-3.30.13
JLine 4.0.14
📦 Dependency updates
- chore: Bump junit.version from 5.14.3 to 5.14.4 (#1848) @dependabot[bot]
- chore: Bump actions/checkout from 4 to 6 (#1847) @dependabot[bot]
JLine 3.30.12
[maven-release-plugin] copy for tag jline-3.30.12
JLine 4.0.13
JLine 4.0.13 is a patch release with bug fixes for terminal handling, GraalVM native-image support, and encoding issues.
Bug Fixes
- Fix AttributedStyle color chaining (#1792)
- Erase probe emoji after grapheme cluster width detection (#1801)
- Register all FFM foreign function signatures for GraalVM native-image (#1802)
- Register Kernel32 FFM downcall signatures for GraalVM native-image (#1803)
- Deprecate SwingTerminal.dispose() in favor of close() (#1811)
- Avoid NPE when closing terminal with null masterOutput (#1813)
- Close PTY streams before shutdown to prevent hang on macOS (#1817)
- Resolve redirect targets against session working directory (#1781)
- Use terminal encoding instead of default charset in VirtualTerminal (#1822)
JLine 3.30.11
JLine 3.30.11 is a patch release adding GraalVM native-image support for the FFM terminal provider that was missing from 3.30.10.
Bug Fixes
- Add GraalVM native-image support for FFM terminal provider (#1804)
See 3.30.10 release notes for the full list of bugfixes included in this release series.
JLine 3.30.10
JLine 3.30.10 is a patch release with numerous bug fixes, including terminal stability improvements, encoding fixes, and dependency updates.
Bug Fixes
- Catch LinkageError during provider loading (#1752)
- Prevent ArrayIndexOutOfBoundsException in KillRing.yankPop()
- Fix off-by-one bounds check in KeyMap.unbind()
- Handle EOF in color parsing to prevent infinite loop
- Close HttpURLConnection in ConsoleEngineImpl.urlExists()
- Guard AnsiConsole.providers() call to avoid NoSuchMethodError (#1766)
- Guard waitDirty against spurious wakeups (#1765)
- Restore waitDirty timeout in forced dump to prevent busy-loop spinning (#1768)
- Remove spurious (short) casts in Size setters (#1791)
- Fix AttributedStyle color chaining (#1792)
- Avoid NPE when closing terminal with null masterOutput (#1813)
- Close PTY streams before shutdown to prevent hang on macOS (#1817)
Dependency Updates
- Bump groovy.version from 4.0.30 to 4.0.31
- Bump spotless-maven-plugin to 3.4.0
- Bump palantir-java-format to 2.90.0
- Bump jansi from 2.4.2 to 2.4.3
- Bump graal-sdk from 25.0.2 to 25.0.3
- Bump actions/deploy-pages from 4 to 5
- Bump actions/configure-pages from 5 to 6
- Bump actions/upload-pages-artifact from 4 to 5
JLine 4.0.12
JLine 4.0.12 is a quick follow-up fixing two regressions. A missing timeout in the forced-dump path caused busy-loop CPU spinning, and an unguarded AnsiConsole.providers() call threw NoSuchMethodError when running against older Jansi versions.
🐛 Bug Fixes
JLine 4.0.11
JLine 4.0.11 improves SwingTerminal rendering fidelity and grapheme cluster performance. SwingTerminal now correctly renders dim, italic, and conceal attributes and matches the ScreenTerminal HTML color logic. A BreakIterator caching fix eliminates repeated object allocation in grapheme cluster width loops, and a spurious-wakeup guard hardens the ScreenTerminal dirty-wait path.
🚀 New features and improvements
🐛 Bug Fixes
- fix: guard waitDirty against spurious wakeups (#1765) @gnodet
- fix: apply dim and italic attributes in SwingTerminal, fix conceal+dim interaction (#1758) @Elec332
- fix: Match SwingTerminal color logic to new HTML color logic (#1757) @Elec332
- fix: cache BreakIterator in grapheme cluster loops (#1762) (#1763) @gnodet
📦 Dependency updates
- chore: Bump eu.maveniverse.maven.nisse:extension from 0.8.1 to 0.8.2 (#1760) @dependabot