Skip to content

Release v0.10.0 - #17

Merged
kackerx merged 37 commits into
mainfrom
release/v0.10.0
Nov 8, 2026
Merged

kackerx merged 37 commits into
mainfrom
release/v0.10.0

Conversation

@kackerx

@kackerx kackerx commented Nov 8, 2026

Copy link
Copy Markdown
Owner

[0.10.0] - 2026-11-08

Added

  • Run one statement straight from the command line: sqlmux [connection] --sql "select status, count(*) from orders group by 1". It opens a window with only the tree, a query holding the statement and its result, and runs it as ↵ would; read-only connections and dangerous statements are checked as in any query. The query is not saved as a file unless you edit it, and quitting does not overwrite the layout sqlmux restores. --sql cannot go with --table, --where or --layout.
  • --schema picks the schema for --sql and --table, written as in the query title's dropdown: [database.]schema on PostgreSQL and SQL Server, the database on MySQL, the db number on Redis (--schema 1). A schema that does not exist is reported in a toast, and the connection's own is used.
  • default_connection = "<name>" in config.toml: the connection that --table, --sql and a start without a saved layout use when you name none (until now, always the first one in connections.toml). A name that is not in connections.toml is reported in a toast, and the first connection is used.
  • Redis key completion is ready at once on the next start: the index of a database's key names is saved under ~/.local/share/sqlmux/redis-index/ (mode 0600), loaded on the first completion, and replaced when a fresh scan in the background finishes. [redis] index_cache = false turns it off.
  • border_focus_style in config.toml: the line style of the focused pane and of overlays (single, rounded, double, bold, hidden), so the focused pane can be bold and the others thin. Unset, it follows border.
  • [pane] outer_nav = "auto": inside tmux, C-h / C-j / C-k / C-l at the edge of sqlmux move on to the next tmux pane, as vim-tmux-navigator does for vim. The tmux side is in Configuration. (#4, idea by qumn)

Changed

  • While a Redis database's first key index is being built, typing a key opens the completion list at once, with "Building the index" at its foot; prefix matches fill in as they arrive. If the index cannot be built (the connection dropped, no permission to SCAN), that line says why, and R in the tree builds it again.
  • Redis completion on a slow link is ready much sooner after connecting: COMMAND DOCS is sent as soon as the connection is up instead of after the tree has loaded, the tree loads one batch at a time so completion can go in between, and the key index goes ahead of the tree. Over a 1-second round trip, a 60000-key index now builds in about 20 seconds.

Fixed

  • On a slow Redis link, key index batches, prefix lookups and EXISTS checks could time out while still waiting their turn and close the connection under the request that was running, so the index never finished. Their timeouts now start when they run (20 s for index batches and prefix lookups, 3 s for EXISTS).

…: default_connection, --sql / --schema (§14), Redis index on disk (§9.8), border_focus_style (§7.3), outer_nav to tmux (§6), db-clean (§15); workspaces moved to the WSL paths (AGENTS.md, roles)
Root renames and writes through read-only directories (skip those tests), a
closed loopback port times out instead of refusing, MySQL's 64-character limit
fell to a six-digit pid in OwnDB's name, and deleting a query file within the
tick of the directory listing before it left it in the tree (drop the cached
listing on delete, the shortcut's own remedy).
sqlmux_e2e_<pid> and sqlmux_worker_<pid>_* on PG and MySQL whose pid is gone,
through docker compose exec; the full just e2e runs it first, e2e/dbclean.sh
checks it on both engines.
--table, --sql and the default layout open through open(), which asks
config.DefaultStart; an unknown name starts on the first and says so.
…hema

sqlmux [connection] [--schema s] --sql "select …": the window is the sidebar and
one query pane over the numbered query the statement went into (not query_1),
run as ↵ runs it, the result area under it; every statement of it, the confirm
and read-only rules of §13 as usual; last.toml is left alone. --schema is a
schema, database.schema (PG, SQL Server) or a Redis db's number, in the
connection when it is there and said when it is not; --table takes it too.
…abase counts for --schema db.schema, connections.toml is read for default_connection only when it is written
…he --sql query is not saved unless edited (task.md, §14)
…kip permission assertions under root, no 'connection refused' wording, GOTOOLCHAIN from go.mod (task.md, §15)
… assertions, tmux 3.8 pipe-pane lag, no 'connection refused' wording, keychain password_cmd on Linux
…ps / npm 12 / nc / dash differences, rec lag, 127.0.0.1:1 timeouts, a private sqlmux_play database in f17.13, root skips
…2e runs 6-way parallel on WSL (task.md, plan.md, AGENTS.md)
… at the next start

$XDG_DATA_HOME/sqlmux/redis-index/<connection>/db<n>: a first line with the
version, the size of the db and whether the index stops short of it, then a
name a line as redis-cli reads a word, 0600, written through the config
package's rename. The first completion of a db reads it and matches in it at
once (the list says the index is being updated) while the index is made in
the background; the new one takes its place and is written. A write command's
changes are written once a few seconds after, and when the program ends.
[redis] index_cache = false reads and writes nothing.
…ir own lines

Frame.Lines(focused) is the one place that picks between border and
border_focus_style; it follows border when not written.
… the outer tmux

With $TMUX set, a pane.focus.left/down/up/right with no pane on that side runs
tmux select-pane -L/-D/-U/-R (not waited for); off, the default, changes nothing.
…er, a delta with a repeated key is not zeroed by update, a FLUSH empties the file when no index is in memory, a connection name is escaped for any file system
…egression 283 scripts, nothing red off the list; waiting for the user's acceptance (task.md, plan.md)
…irst index is built over a slow link (task.md node 3, §9.8)
… request per batch so completion is not queued behind it, the 1000 ms index build to be measured and fixed (task.md, §8.7)
… row: the index is being built, or why it could not be

A completion with no candidates and a row to say is a box of the row alone,
drawn under the word; the names of the prefix go in when they come, the row
stays, the index takes it away. A failed build says why and is not made again
by every key typed: R in the tree does.
… index batches go first and are timed from when they run

On a link of 500 ms the commands and the index waited 20 s behind the tree's one request,
and at 1000 ms the index never came: its 3 s limit ran from when it was asked for, and a
limit that runs out closes the connection under the others. The tree is a SCAN and
its TYPEs a request at a time; COMMAND DOCS goes before the first of them; the tree waits
while an index is made; onMeta bounds a request from when it starts, 20 s for a batch of names.
…reconnect or R clears it), per-request timeouts from execution start (20s batches, 3s EXISTS), index batches ahead of the tree's, how e is measured (task.md, §8.7, §9.8)
…ts first batch), a redial of Meta clears the index error, the failed row names the key that builds it again, f21.7 times the connect-and-type case
…about 8 s later on a 500 ms link when typing at once with an index file, a known limit (task.md, plan.md)
…and config; default_connection, border_focus_style, [redis] index_cache, [pane] outer_nav with the tmux side; password_cmd from a 0600 file without a keychain; keys.md at v0.10.0
@kackerx
kackerx merged commit 093707b into main Nov 8, 2026
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant