nREPL Compatibility Matrix

Here's how the servers below fare against the checks of proof, which are mostly about what the clients people use (CIDER, Calva, Conjure, vim-fireplace, REPLy and so on) need from a server.

pass
The server does what the clients need.
fail
Some client won't work properly with the server, or users lose data.
warn
The server does something differently from nREPL or the spec, but no client we know of minds.
skip
The check doesn't apply to the server (e.g. it needs Java interop).
error
proof couldn't run the check.

Hover over a check to see why it matters, and over a verdict for the details.

ChecknREPL1.8.0Babashka1.13.229nbb1.6.214ClojureCLR1.12.6Basilisp0.5.1jank0.1-alphalet-go1.13.0dialtone0.1.0repartee0.1.0
describe
describe.replydescribe gets a replypasspasspasspasspasspasspasspasspass
describe.ops-dictops is a dict keyed by op namepasspasspasspasspasspasspasspasspass
describe.required-opsdescribe lists describe, eval, clone and closepasspasspasspasspassfailpasspasspass
describe.versionsversions identifies the runtimepasspasspasspasspasspasswarnpasspass
op
op.unknownAn unknown op gets unknown-oppasspasspasspasspasspasspasspasspass
op.unknown-echoThe unknown-op reply echoes the oppasspasswarnwarnwarnwarnwarnpasspass
session
session.cloneclone returns a new sessionpasspasspasspasspasspasspasspasspass
session.persistentDefinitions persist within a sessionpasspasspasspasspasspasspasspasspass
session.across-connectionsA session can be used from another connectionpasspasspasswarnwarnwarnpasspasspass
session.isolatedSessions don't share statepasspassfailfailfailfailfailpasspass
session.ephemeralRequests without a session workpasspasspasspasspasspasspasspasspass
session.closeclose replies with session-closedpasspasspasspassfailfailpasspasspass
session.unknownA request for an unknown session gets unknown-sessionpasspassfailfailfailfailfailpasspass
session.closedA closed session is gonepasspassfailfailfailfailfailpasspass
eval
eval.valueeval returns the valuepasspasspasspasspasspasspasspasspass
eval.stdoutPrinted output arrives as out before donepasspasspasspasspasspasspasspasspass
eval.stdout-orderOutput arrives before the valuepasspasspasspasspasspasspasspasspass
eval.stderrError output arrives as errpasspassfailpassfailpassfailfailfail
eval.error-statusAn eval that throws gets eval-errorpasspassfailpasspasspassfailpasspass
eval.error-reportA failed eval explains itself in err and expasspasspasspasspasspasswarnpasspass
eval.survives-errorA session keeps working after an errorpasspasspasspasspasspasspasspasspass
eval.multiple-formsEach form in the code gets its own valuepasspasspasspassfailfailfailpassskip
eval.no-codeAn eval without code gets no-codepasspasswarnwarnwarnwarnwarnpasspass
eval.nseval replies say which namespace they ran inpasspasspasspasspasspasspassskipskip
eval.unknown-nsAn eval in a namespace that doesn't exist gets namespace-not-foundpasspassfailpassfailfailfailskipskip
stdin
stdin.need-inputCode reading stdin makes the server ask for inputpasspassskipskipskipskipskippasspass
stdin.roundtripInput sent with stdin reaches the code reading itpasspassskipskipskipskipskippasspass
stdin.eofAn empty stdin means end of inputpasspassskipskipskipskipskippasspass
interrupt
interrupt.runninginterrupt stops a running evalpasspassskipskipskipskipskippasspass
interrupt.no-idAn interrupt without interrupt-id stops what's runningpasspassskipskipskipskipskippasspass
interrupt.statusAn interrupted eval says it was interruptedpasspassskipskipskipskipskippasspass
interrupt.survivesA session keeps working after an interruptpasspassskipskipskipskipskippasspass
interrupt.queuedAn eval waiting for an interrupted one still runsfailfailskipskipskipskipskippasspass
interrupt.other-connectionAn interrupted eval ends on its own connectionfailfailskipskipskipskipskippasspass
interrupt.idleInterrupting an idle session gets session-idlepasspassskipskipskipskipskippasspass
interrupt.id-mismatchAn interrupt for another eval gets interrupt-id-mismatchpasspassskipskipskipskipskippasspass
load-file
load-file.valueload-file returns the value of the last formpasspasspasspasspasspasspasspasspass
load-file.errorA load-file that throws says so in err, ex and eval-errorpasspassfailpasspasspassfailpasspass
completion
completion.completionscompletions offers what the code could bepassskipskipskipskippassskippasspass
completion.completecomplete offers what the code could be, given a prefixskippasspasspasspassskippassskipskip
completion.complete-symbolcomplete offers what the code could be, given a symbolskippasspasspasspassskippassskipskip
lookup
lookup.lookuplookup says what a symbol ispassskipskipskipskippassskippasspass
lookup.lookup-unknownlookup finds nothing for a symbol that doesn't existpassskipskipskipskippassskippasspass
lookup.infoinfo says what a symbol isskippassfailfailfailskippassskipskip
lookup.info-unknowninfo says no-info for a symbol that doesn't existskippassfailfailfailskippassskipskip
lookup.eldoceldoc gives the arglists of a functionskippasspasspasspassskipskipskipskip
bb-repl
bb-repl.connectbb repl --connect can connectpasspasspasspasspasspasspasspasspass
calva
calva.connectCalva can connectpasspasspasspasspasspasspasspasspass
calva.evalCalva can evaluate code from a source filepasspasspasspasspasspasspassskipskip
calva.load-fileCalva can load a filepasspasspasspasspasspasspasspasspass
cider
cider.connectCIDER can connectpasspasspasspasspasspasspasspasspass
cider.evalCIDER can evaluate code from a source bufferpasspasspasspasspasspasspassskipskip
cider.replCIDER's REPL can evaluate codepasspasspasspasspasspasspasspasspass
cider.load-fileCIDER can load a bufferpasspasspasspasspasspasspasspasspass
clojure-cli
clojure-cli.evalclojure-cli.repl can evaluate codepasspasspasspasspasspasspassskipskip
conjure
conjure.connectConjure can connectpasspasspasspasspasspasspasspasspass
conjure.evalConjure can evaluate code from a source bufferpasspasspasspasspasspasspassskipskip
conjure.load-fileConjure can evaluate a filepasspasspasspasspasspasspasspasspass
fireplace
fireplace.connectvim-fireplace can connectpasspassskipskipskipskipskipskipskip
fireplace.evalvim-fireplace can evaluate codepasspassskipskipskipskipskipskipskip
neorepl
neorepl.connectneorepl can start its REPLpasspasspasspasspasspasspasspasspass
neorepl.evalneorepl can evaluate codepasspasspasspasspasspasspasspasspass
reply
reply.connectREPLy can startpasspasspasspasspasspasspasspasspass
robust
robust.wrong-typesA session keeps working after a request with fields of the wrong typefailfailpasspasspassfailpasspasspass
robust.sessions-at-onceAn eval in one session doesn't hold up the otherspasspassskipskipskipskipskippasspass
robust.disconnectA session keeps working after its client went away in the middle of an evalfailpassskipskipskipskipskippasspass
robust.bad-framesFrames that aren't requests don't take the server downpasspassfailpasspasspasspasspasspass
wire
wire.bencodeEvery frame is valid bencodepasspasspasspasspasspasspasspasspass
wire.dictEvery message is a dictpasspasspasspasspasspasspasspasspass
wire.canonicalFrames use canonical bencodepasspasspasspasswarnwarnpasspasspass
wire.utf8Strings are valid UTF-8passpasspasspasspasspasspasspasspass
wire.status-typestatus is a list of stringspasspasspasspasspasspasspasspasspass
wire.field-typesStandard fields are stringspasspassfailfailpasspasspasspasspass
wire.one-payloadA message carries at most one of value, out and errpasspasspasspasspasspasspasspasspass
wire.idReplies carry the id of their requestwarnwarnpasspasspasspasspasspasspass
wire.session-echoReplies to a request with a session carry that sessionpasspasspasspasspasspasspasspasspass
wire.one-doneEach request gets exactly one donepasspasspasspasspasspasspasspasspass
wire.after-doneOnly output follows donewarnwarnpasspasspasspasspasspasspass
wire.error-terminalNo output, value or need-input follows an error statuspasspasspasspasspasspasspasspasspass
wire.need-input-aloneneed-input is sent on its ownpasspasspasspasspasspasspasspasspass
Passed69/7572/7749/6253/6249/6248/6049/6166/6765/66