# Changelog

## master (unreleased)

## 1.22.0 (2026-06-16)

### New features

- [#3645](https://github.com/clojure-emacs/cider/issues/3645): Show a spinner in the mode line while tests are running.
- [#3865](https://github.com/clojure-emacs/cider/pull/3865): Add default session feature to bypass sesman's project-based dispatch (`cider-set-default-session`, `cider-clear-default-session`).
- [#3930](https://github.com/clojure-emacs/cider/pull/3930): Inspector: add help message with keybindings.
- [#3884](https://github.com/clojure-emacs/cider/pull/3884): Introduce `cider-jack-in-tools` and `cider-register-jack-in-tool` so third-party packages can register new project tools for `cider-jack-in` and `cider-jack-in-universal`.
- [#3888](https://github.com/clojure-emacs/cider/pull/3888): Cache the result of `cider--running-nrepl-paths` (used by `cider-locate-running-nrepl-ports`) for `cider-running-nrepl-paths-cache-ttl` seconds (default 5). Repeated `cider-connect` completions no longer re-spawn a fresh round of `ps`/`lsof` subprocesses each time. `cider-clear-running-nrepl-paths-cache` discards the cache on demand.
- [#3890](https://github.com/clojure-emacs/cider/pull/3890): New `nrepl-make-eval-handler` with a keyword-arg API:
  - Keyword slots: `:on-value`, `:on-stdout`, `:on-stderr`, `:on-done`, `:on-eval-error`, `:on-content-type`, `:on-truncated`.
  - Sub-handlers no longer take a buffer argument; they close over whatever they need.
  - `nrepl-make-response-handler`, the legacy 7-positional-arg form, is preserved as an obsolete shim that adapts the old `(buffer x)` lambdas to the new `(x)` lambdas, so existing extensions keep working.
- [#3929](https://github.com/clojure-emacs/cider/pull/3929): Keyword-argument forms for several low-level request APIs, so callers no longer pad arguments with `nil` to reach a later one.  In every case the legacy positional function is kept as a thin shim that delegates to the new one, so existing callers (including third-party packages) keep working unchanged:
  - Eval requests: `nrepl-send-eval-request` (shim: `nrepl-request:eval`) and `cider-nrepl-send-eval-request` (shim: `cider-nrepl-request:eval`), with `:ns`, `:line`, `:column`, `:additional-params`, plus `:tooling` at the nREPL level and `:connection` at the CIDER level.
  - Sync requests: `nrepl-sync-request` (shim: `nrepl-send-sync-request`) and `cider-nrepl-sync-request` (shim: `cider-nrepl-send-sync-request`), with `:abort-on-input`, `:tooling`/`:connection`, and `:callback`.
  - Op helpers: `cider-info-request` (shim: `cider-sync-request:info`), `cider-eldoc-request` (shim: `cider-sync-request:eldoc`), `cider-apropos-request` (shim: `cider-sync-request:apropos`), and `cider-load-file-request` (shim: `cider-request:load-file`).
- [#3921](https://github.com/clojure-emacs/cider/pull/3921): New `cider-repl-history-doctor` command: walks `cider-repl-input-history` looking for entries whose parens don't balance under Clojure syntax, shows each in a side buffer, and asks whether to delete it.  When done, rewrites `cider-repl-history-file` if one is configured.  Useful for cleaning up history after a typo got committed that breaks `cider-repl-history` rendering (see [#3915](https://github.com/clojure-emacs/cider/issues/3915)).
- [#3926](https://github.com/clojure-emacs/cider/pull/3926): Recognize [let-go](https://github.com/nooga/let-go) (a Clojure dialect implemented in Go) as a known nREPL runtime.  `cider-runtime` returns `let-go` for these connections and the connection info line shows the runtime version, e.g. `CLJ project@localhost:2137 (let-go 1.0)`.
- [#3892](https://github.com/clojure-emacs/cider/pull/3892): Decouple the nREPL transport layer from CIDER's UI layer (closes [#1099](https://github.com/clojure-emacs/cider/issues/1099)):
  - `nrepl-make-eval-handler` is now CIDER-agnostic. It no longer references `nrepl-namespace-handler-function`, `nrepl-err-handler-function`, `nrepl-need-input-handler-function`, or any hardcoded UI strings.
...
...
