All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
Note
JETLS uses date-based versioning (YYYY-MM-DD) rather than semantic versioning,
as it is not registered in General due to environment isolation requirements.
Each dated section below corresponds to a release that can be installed via
Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="YYYY-MM-DD")
- Commit:
HEAD - Diff:
aae52f5...HEAD
.JETLSConfig.tomlis now only recognized at the workspace root. Previously, config files in subdirectories were also loaded, which was inconsistent with the documentation.
- Added heap snapshot profiling support. Create a
.JETLSProfilefile in the workspace root to trigger a heap snapshot. The snapshot is saved asJETLS_YYYYMMDD_HHMMSS.heapsnapshotand can be analyzed using Chrome DevTools. See DEVELOPMENT.md's Profiling section for details.
- Commit:
aae52f5 - Diff:
f9b2c2f...aae52f5
- Added support for LSP
initializationOptionswith the experimentaln_analysis_workersoption for configuring concurrent analysis worker tasks. See Initialization options for details.
- Parallelized signature analysis phase using
Threads.@spawn, leveraging the thread-safe inference pipeline introduced in Julia v1.12. This parallelization happens automatically when Julia is started with multiple threads, independent of the newly addedn_analysis_workersinitialization option. With 4 threads (--threads=4,2specifically), first-time analysis of CSV.jl improved from 30s to 18s (~1.7x faster), and JETLS.jl itself from 154s to 36s (~4.3x faster).
- Fixed handling of messages received before the initialize request per LSP 3.17 specification.
- Fixed progress indicator not being cleaned up when analysis throws an error.
- Commit:
f9b2c2f - Diff:
eda08b5...f9b2c2f
- JETLS now automatically runs
Pkg.resolve()andPkg.instantiate()for packages that have not been instantiated yet (e.g., freshly cloned repositories). This allows full analysis to work immediately upon opening such packages. When no manifest file exists, JETLS first creates a versioned manifest (e.g.,Manifest-v1.12.toml). This behavior is controlled by thefull_analysis.auto_instantiateconfiguration option (default:true). Set it tofalseto disable. - When
full_analysis.auto_instantiateis disabled, JETLS now checks if the environment is instantiated and warns the user if not.
- Fixed error when receiving notifications after shutdown request. The server now silently ignores notifications instead of causing errors from invalid property access (which is not possible for notifications).
- Fixed race condition in package environment detection when multiple files are
opened simultaneously. Added global lock to
activate_doto serialize environment switching operations. This fixes spurious "Failed to identify package environment" warnings. - Fixed document highlight and rename not working for function parameters
annotated with
@nospecializeor@specialize.
- Fixed Revise integration in development mode. The previous approach of
dynamically loading Revise via
Base.requiredidn't work properly because Revise assumes it's loaded from a REPL session. Revise is now a direct dependency that's conditionally loaded at compile time based on theJETLS_DEV_MODEflag. - Significantly refactored the full-analysis pipeline implementation. Modified
the full-analysis pipeline behavior to output more detailed logs when
JETLS_DEV_MODEis enabled.
- Commit:
eda08b5 - Diff:
6ec51e1...eda08b5
- Pinned installation now uses release tags (
rev="YYYY-MM-DD") instead of branch names (rev="releases/YYYY-MM-DD"). Thereleases/YYYY-MM-DDbranches will be deleted after merging since[sources]entries reference commit SHAs directly. Existing release branches (releases/2025-11-24throughreleases/2025-11-27) will be kept until the end of December 2025 for backward compatibility.
- Fixed false
lowering/macro-expansion-errordiagnostics appearing before initial full-analysis completes. These diagnostics are now skipped until module context is available, then refreshed viaworkspace/diagnostic/refresh. Fixes #279 and #290. (#333)
- Removed the deprecated
runserver.jlscript. Users should use thejetlsexecutable app instead. See the 2025-11-24 release notes for migration details.
- Commit:
6ec51e1 - Diff:
6bc34f1...6ec51e1
- Added
--version(-v) option to thejetlsCLI to display version information. The--helpoutput now also includes the version. Version is stored in theJETLS_VERSIONfile and automatically updated during releases. - Automatic GitHub Release creation when release PRs are merged. You can view releases at https://github.com/aviatesk/JETLS.jl/releases. The contents are and will be extracted from this CHANGELOG.md.
- Updated CodeTracking.jl, LoweredCodeUtils and JET.jl dependencies to the latest development versions.
- Automation for release process:
scripts/prepare-release.shautomates release branch creation, dependency vendoring, and PR creation. - Automatic CHANGELOG.md updates via CI when release PRs are merged.
- Commit:
6bc34f1 - Diff:
2be0cff...6bc34f1
- Updated JuliaSyntax.jl and JuliaLowering.jl dependencies to the latest development versions.
- Updated documentation deployment to use
releaseas the default version. The documentation now has two versions in the selector:release(stable) anddev(development). The root URL redirects to/release/by default. The release documentation index page shows the release date extracted from commit messages.
- Commit:
2be0cff - Diff:
fac4eaf...2be0cff
- Added CI workflow for testing the vendored release environment. This validates that changes to master don't break the release branch. (#321)
- Added CI workflow for the
releasebranch with tests and documentation deployment. Documentation for thereleasebranch is now available at https://aviatesk.github.io/JETLS.jl/release/. (#321)
- Fixed vendoring script to remove unused weakdeps and extensions from vendored packages. These could interact with user's package environment unexpectedly. Extensions that are actually used by JETLS are preserved with updated UUIDs. Fixes #312. (#320)
- Commit:
fac4eaf
- Implemented environment isolation via dependency vendoring to prevent conflicts
between JETLS dependencies and packages being analyzed.
All JETLS dependencies are now vendored with rewritten UUIDs in the
releasebranch, allowing JETLS to maintain its own isolated copies of dependencies. This resolves issues where version conflicts between JETLS and analyzed packages would prevent analysis. Users should install JETLS from thereleasebranch usingPkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="release"). (#314)- For developers: See https://github.com/aviatesk/JETLS.jl/blob/master/DEVELOPMENT.md#release-process for details on the release process.
- Migrated the JETLS entry point from the
runserver.jlscript to thejetlsexecutable app defined by JETLS.jl itself. This significantly changes how JETLS is installed and launched, while the new methods are generally simpler: (#314)- Installation: Install the
jetlsexecutable app using:This installs the executable tojulia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="release")'~/.julia/bin/(asjetlson Unix-like systems,jetls.exeon Windows). Make sure~/.julia/binis in yourPATH. - Updating: Update JETLS to the latest version by re-running the installation command:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="release")' - Launching: Language clients should launch JETLS using the
jetlsexecutable with appropriate options. See https://aviatesk.github.io/JETLS.jl/dev/launching/ for detailed launch options. - The VSCode language client
jetls-clientand Zed extensionaviatesk/zed-juliahas been updated accordingly.
- Installation: Install the
- Changed diagnostic configuration schema from
[diagnostic.codes]to[[diagnostic.patterns]]for more flexible pattern matching. (#299) - Renamed configuration section from
[diagnostics]to[diagnostic]for consistency. (#299)
- Added configurable diagnostic serveirty support with hierarchical diagnostic
codes in
"category/kind"format. Users can now control which diagnostics are displayed and their severity levels through fine-grained configuration. (#298) - Added pattern-based diagnostic configuration supporting message-based
matching in addition to code-based matching.
Supports both
literalandregexpatterns with a four-tier priority system. (#299) - Added file path-based filtering for diagnostic patterns.
Users can specify glob patterns (e.g.,
"test/**/*.jl") to apply diagnostic configurations to specific files or directories. (#313) - Added LSP
codeDescriptionimplementation with clickable documentation links for diagnostics. (#298) - Added this change log. (#316)
- Fixed UTF-8 position encoding to use byte offsets instead of character counts. This resolves misalignment issues in UTF-8-based editors like Helix while maintaining compatibility with UTF-16 editors like VS Code. (#306)