babashka

borkdude 2026-02-13T18:43:07.152509Z

Adding a new nice feature to the console REPL: tailtip completions

❤️ 4
3
borkdude 2026-02-14T09:24:22.509389Z

Planned release: Tuesday morning

borkdude 2026-02-14T09:41:23.943679Z

Pushed the C-x C-m keybinding @seancorfield

❤️ 1
seancorfield 2026-02-14T17:04:39.004599Z

Just tested. Thank you!!

seancorfield 2026-02-14T17:04:55.710389Z

Now my Rebel Readline muscle memory can continue unhindered 🙂

borkdude 2026-02-13T20:28:12.433759Z

You may want to try this out with the dev build folks. I added many REPL niceties but I hope nothing broke.

bash <(curl )  --dev-build --dir /tmp

/tmp/bb
cc @lee @seancorfield @highpressurecarsalesm and anyone else who want to test doc support (C-x C-x), eldoc (signature shows while you type) and trailtip completions

seancorfield 2026-02-13T20:49:03.388399Z

C-x C-d for docs, you mean?

borkdude 2026-02-13T20:49:36.456869Z

yes sorry

borkdude 2026-02-13T20:49:42.462139Z

after the function name

seancorfield 2026-02-13T20:50:41.764989Z

Works great!

🎉 1
seancorfield 2026-02-13T20:59:17.584289Z

Would be nice to have C-x C-m to submit the whole expression for evaluation -- when you are doing mult-line editing, otherwise you have to navigate to the end of the form to press ENTER

seancorfield 2026-02-13T21:00:24.624969Z

(I guess I can use alt-a...)

borkdude 2026-02-13T21:01:06.620939Z

Ctrl-e

borkdude 2026-02-13T21:01:14.703739Z

that works in browsers etc too

borkdude 2026-02-13T21:02:23.618269Z

I actually just changed this behavior. Normally the whole form would be submitted when you would press enter. But then there's no way to insert whitespace in the middle with enter, unless you use Alt-Enter. But Alt-Enter was already used on Windows to maximize the window. Do you prefer that I revert this?

seancorfield 2026-02-13T21:03:17.632579Z

No, I'm used to being able to enter newlines with enter in the middle of editing (like Rebel).

borkdude 2026-02-13T21:03:28.327939Z

Ah wait, I actually just discovered that rebel-readline also doesn't submit

borkdude 2026-02-13T21:03:33.145349Z

nice

seancorfield 2026-02-13T21:03:41.861109Z

But I'm also used to C-x C-m from Rebel. Knowing there's C-e is good enough for now.

borkdude 2026-02-13T21:04:00.195799Z

ok

borkdude 2026-02-13T21:04:12.728379Z

keyword completion is coming up

borkdude 2026-02-13T21:04:51.888169Z

that's probably the final thing

seancorfield 2026-02-13T21:05:18.459949Z

Ah, C-e ENTER -- because C-e moves the cursor to the end (of the multi-line expression). C-x C-m in Rebel just submits the whole thing, no matter where you are.

borkdude 2026-02-13T21:05:30.188489Z

correct

borkdude 2026-02-13T21:05:35.527449Z

I'm fine with adopting that

seancorfield 2026-02-13T21:05:41.753959Z

Hard to tell what's Jline vs Rebel 🙂

borkdude 2026-02-13T21:05:49.931499Z

does it not currently work?

borkdude 2026-02-13T21:05:54.862709Z

then it's not jline

seancorfield 2026-02-13T21:06:13.100299Z

Right. C-e is jline (then press ENTER). C-x C-m is Rebel.

borkdude 2026-02-13T21:14:43.313669Z

Merged keyword completions. Available in 10 minutes as dev build

borkdude 2026-02-13T21:36:23.404459Z

should be there now

seancorfield 2026-02-14T01:15:50.500099Z

Oh, the keyword completion is a nice touch! I didn't know I needed that.

lread 2026-02-14T02:21:58.372919Z

Wowzies! Feels great @borkdude!

borkdude 2026-02-13T18:47:01.323549Z

After merging ^ I think bb has enough new stuff for a release...

🎉 5
teodorlu 2026-02-13T21:41:35.136819Z

This is going to be the most exciting release in a while!!!

hlship 2026-02-13T19:40:51.443389Z

I'm continuing to do some odd things, pencilling quite far outside the lines. Here's an odd question: I have a script that loads classes from an AOT jar. Why? For most operations, I want fast startup of Babashka, but for one particular thing (this long running web server), I have the Babashka script launch a Java process to run that code. Oddity: when I run my script, there's a bunch of extra stuff on the classpath.

$ pwd
/tmp/build
$ ll
.rw-r--r--   64 howard.lewisship 13 Feb 11:14 bb.edn
.rw-r--r--  948 howard.lewisship 13 Feb 11:14 CHANGES.md
.rwxr-xr-x  159 howard.lewisship 13 Feb 11:25 dgt
.rw-r--r--  14M howard.lewisship 13 Feb 11:14 dialog-tool-test.jar
.rw-r--r--  11k howard.lewisship 13 Feb 11:14 LICENSE
.rw-r--r-- 9.2k howard.lewisship 13 Feb 11:14 README.md
$ cat dgt
#!/usr/bin/env bb

(require '[dialog-tool.main :as main])

(prn :bb-classpath     (babashka.classpath/get-classpath))


(apply main/-main *command-line-args*)
$ cat bb.edn
{:deps {uber/dialog-tool {:local/root "dialog-tool-test.jar"}}}
$ ./dgt version
:bb-classpath "/private/tmp/build/dialog-tool-test.jar:/Users/howard.lewisship/.m2/repository/babashka/fs/0.5.27/fs-0.5.27.jar:/Users/howard.lewisship/.m2/repository/babashka/process/0.6.23/process-0.6.23.jar:/Users/howard.lewisship/.m2/repository/org/babashka/cli/0.8.67/cli-0.8.67.jar:/Users/howard.lewisship/.m2/repository/org/clj-commons/humanize/1.1/humanize-1.1.jar:/Users/howard.lewisship/.m2/repository/org/clj-commons/pretty/3.6.7/pretty-3.6.7.jar:/Users/howard.lewisship/.m2/repository/org/clojure/tools.cli/1.2.245/tools.cli-1.2.245.jar:/Users/howard.lewisship/.m2/repository/selmer/selmer/1.12.69/selmer-1.12.69.jar:/Users/howard.lewisship/.m2/repository/com/widdindustries/cljc.java-time/0.1.21/cljc.java-time-0.1.21.jar:/Users/howard.lewisship/.m2/repository/com/widdindustries/cljs.java-time/0.1.20/cljs.java-time-0.1.20.jar"
test
The dialog-tool-test.jar should be the only thing on the classpath, so where are the rest coming from? Some of these seem specific-ish to my project (humanize, pretty), but not the others. So I don't get why those particular things are present on the classpath? Did some kind of dependency information get recorded into the uberjar? These are not in my /.clojure/deps.edn for example, And I've verified that these are real dependencies, when I clean some of these from my /.m2/repository, the dgt script downloads them. I'm at a loss as to where these things could be coming from.

borkdude 2026-02-13T19:42:22.507779Z

It depends. in what directory do you run dgt

borkdude 2026-02-13T19:42:28.724269Z

does it have a bb.edn

hlship 2026-02-13T19:42:51.234269Z

Yes, I copied things to /tmp and executed from there. You can see the bb.edn above. It's just the one dependency.

borkdude 2026-02-13T19:45:01.142359Z

does dialog-tool-test.jar have those dependencies? I don't know if jars can have dependencies in deps.edn - doesn't make sense right? what happens if you don't load this local root thing

hlship 2026-02-13T19:54:25.074329Z

$ ./dgt -h
----- Error --------------------------------------------------------------------
Type:     java.io.FileNotFoundException
Message:  Could not locate dialog_tool/main.bb, dialog_tool/main.clj or dialog_tool/main.cljc on classpath.
Location: /private/tmp/build/./dgt:3:1

borkdude 2026-02-13T19:54:59.500139Z

I mean, what does bb-classpath print in that case

hlship 2026-02-13T19:56:46.163739Z

$ ./dgt
:bb-classpath "/Users/howard.lewisship/workspaces/dialog/dialog-tool/src:/Users/howard.lewisship/workspaces/dialog/dialog-tool/generated-resources:/Users/howard.lewisship/workspaces/dialog/dialog-tool/resources:/Users/howard.lewisship/.m2/repository/io/github/hlship/cli-tools/0.16.0-beta-3/cli-tools-0.16.0-beta-3.jar:/Users/howard.lewisship/.m2/repository/org/clj-commons/humanize/1.1/humanize-1.1.jar:/Users/howard.lewisship/.m2/repository/org/clj-commons/pretty/3.6.7/pretty-3.6.7.jar:/Users/howard.lewisship/.m2/repository/com/widdindustries/cljc.java-time/0.1.21/cljc.java-time-0.1.21.jar:/Users/howard.lewisship/.m2/repository/com/widdindustries/cljs.java-time/0.1.20/cljs.java-time-0.1.20.jar"
If I'm in /tmp, where else would Babashka be looking for bb.edn files? Ok, if I remove the bb.edn file entirely, then I get:
:bb-classpath nil

borkdude 2026-02-13T19:57:09.269169Z

bb only looks for a bb.edn in the current directory

hlship 2026-02-13T19:57:25.764789Z

have to run out for a bit ...

borkdude 2026-02-13T19:57:43.892559Z

no wait, this isn't the full answer. bb looks at bb.edns adjacent to scripts that you execute

borkdude 2026-02-13T19:57:55.168679Z

and else in the current directory

borkdude 2026-02-13T19:58:02.845189Z

ok talk later

hlship 2026-02-13T20:11:11.254429Z

It's really strange, like, even if it worked up from current dir looking for bb.edn it doesn't make sense

borkdude 2026-02-13T20:11:36.191739Z

that it certainly won't do

hlship 2026-02-13T20:12:28.828049Z

I don't like mysteries. Almost certainly something on my system , but what. Any debugging I can enable?

borkdude 2026-02-13T20:12:48.644719Z

• can you try from another directory not in tmp? tmp may be weird since its a symlinked dir (on mac). • what happens in a regular clojure JVM project when you depend on that local/root jar?

hlship 2026-02-13T20:13:56.641619Z

Invoking jar via Java, only that jar on class path (as per Java.class.path sys property)

borkdude 2026-02-13T20:14:13.887679Z

that's not what I asked

borkdude 2026-02-13T20:14:24.995989Z

I mean with deps.edn

borkdude 2026-02-13T20:14:29.918349Z

sorry for not being clear

hlship 2026-02-13T20:14:34.149219Z

I'm out to lunch so it'll be a bit.

borkdude 2026-02-13T20:14:39.960019Z

np

hlship 2026-02-13T22:13:33.946679Z

Ok, so if I rename bb.edn to deps.edn ...

$ clojure  -Srepro -Stree
org.clojure/clojure 1.12.4
  . org.clojure/spec.alpha 0.5.238
  . org.clojure/core.specs.alpha 0.4.74
uber/dialog-tool /Users/howard.lewisship/workspaces/dialog/dialog-tool/out/build/dialog-tool-test.jar
  . selmer/selmer 1.12.69
  . org.clojure/tools.cli 1.2.245
  . org.babashka/cli 0.8.67
  . babashka/process 0.6.23
    X babashka/fs 0.4.18 :older-version
  . org.clj-commons/humanize 1.1
    . com.widdindustries/cljc.java-time 0.1.21
      . com.widdindustries/cljs.java-time 0.1.20
  . babashka/fs 0.5.27
  . org.clj-commons/pretty 3.6.7
$
So those are deps from when I built the Uberjar. So maybe those dependencies are recorded as meta-data of the Uberjar? And something is unpackging that metadata and adding it to the dependencies and classpath?

hlship 2026-02-13T22:14:47.352159Z

Well, not MANIFEST.MF:

Manifest-Version: 1.0
Created-By: org.clojure/tools.build
Build-Jdk-Spec: 25
Main-Class: dialog_tool.main
Multi-Release: true

borkdude 2026-02-13T22:23:00.206979Z

so if deps.edn reports those as deps, the same will happen in bb, same dependency logic

hlship 2026-02-13T22:30:10.761029Z

Yes, but where are those dependencies coming from?

{:deps {uber/dialog-tool {:local/root "dialog-tool-test.jar"}}}
A bare JAR file doesn't have dependencies, does it? The dependency tree should just be the one file.

borkdude 2026-02-13T22:31:07.273859Z

is there a pom.xml in the jar? I don't know. this seems to be a deps.edn/tools-deps question now

hlship 2026-02-13T22:35:34.754219Z

$ fd pom.xml
META-INF/maven/babashka/fs/pom.xml
META-INF/maven/babashka/process/pom.xml
META-INF/maven/borkdude/dynaload/pom.xml
META-INF/maven/borkdude/edamame/pom.xml
META-INF/maven/cheshire/cheshire/pom.xml
META-INF/maven/com.fasterxml.jackson.core/jackson-core/pom.xml
META-INF/maven/com.fasterxml.jackson.dataformat/jackson-dataformat-cbor/pom.xml
META-INF/maven/com.fasterxml.jackson.dataformat/jackson-dataformat-smile/pom.xml
META-INF/maven/com.widdindustries/cljc.java-time/pom.xml
META-INF/maven/com.widdindustries/cljs.java-time/pom.xml
META-INF/maven/commons-codec/commons-codec/pom.xml
META-INF/maven/commons-io/commons-io/pom.xml
META-INF/maven/crypto-equality/crypto-equality/pom.xml
META-INF/maven/crypto-random/crypto-random/pom.xml
META-INF/maven/dev.data-star.clojure/http-kit/pom.xml
META-INF/maven/dev.data-star.clojure/sdk/pom.xml
META-INF/maven/fipp/fipp/pom.xml
META-INF/maven/http-kit/http-kit/pom.xml
META-INF/maven/io.github.escherize/huff/pom.xml
META-INF/maven/io.github.hlship/cli-tools/pom.xml
META-INF/maven/io.github.tonsky/clj-simple-router/pom.xml
META-INF/maven/mvxcvi/arrangement/pom.xml
META-INF/maven/org.apache.commons/commons-fileupload2-core/pom.xml
META-INF/maven/org.clj-commons/humanize/pom.xml
META-INF/maven/org.clj-commons/pretty/pom.xml
META-INF/maven/org.clojure/clojure/pom.xml
META-INF/maven/org.clojure/core.async/pom.xml
META-INF/maven/org.clojure/core.cache/pom.xml
META-INF/maven/org.clojure/core.memoize/pom.xml
META-INF/maven/org.clojure/core.rrb-vector/pom.xml
META-INF/maven/org.clojure/core.specs.alpha/pom.xml
META-INF/maven/org.clojure/data.priority-map/pom.xml
META-INF/maven/org.clojure/spec.alpha/pom.xml
META-INF/maven/org.clojure/test.check/pom.xml
META-INF/maven/org.clojure/tools.analyzer/pom.xml
META-INF/maven/org.clojure/tools.analyzer.jvm/pom.xml
META-INF/maven/org.clojure/tools.cli/pom.xml
META-INF/maven/org.clojure/tools.reader/pom.xml
META-INF/maven/org.ring-clojure/ring-core-protocols/pom.xml
META-INF/maven/org.ring-clojure/ring-websocket-protocols/pom.xml
META-INF/maven/ring/ring-codec/pom.xml
META-INF/maven/ring/ring-core/pom.xml
META-INF/maven/selmer/selmer/pom.xml
META-INF/maven/tigris/tigris/pom.xml
Those were all put there by tools.build / compile-clj and/or the uber. Might need to dig through that. But these are a partial overlap (subset and superset) of what's on the classpath at runtime. So there's lots of pom.xml Mystery remains.

borkdude 2026-02-13T22:37:42.964129Z

maybe post in #tools-deps?

hlship 2026-02-13T22:38:32.324759Z

Yep. Thanks for duckie .