v0.2.0
145 definitions for 55 more commands, 224 commands and 596 definitions
in all, the system commands of Windows and macOS among them. Where one
command's output is followed by another's, more definitions now refuse
the text instead of reading the other command's lines as their own.
Added
- A tree definition can state what its top-level line looks like with
parse.root. The node alternatives read every depth, and the one
that reads the continuation of a wrapped list reads any text, so a
word printed afterlspci -v, or another command's output piped in
behind it, was read as one more device with no children; withroot
it is refused, naming the line.lspci -v,lsusb -v,lsusb -t,
iw dev,apt-cache depends,systemctl list-dependenciesand
systemd-analyze critical-chainstate theirs. - Definitions for 25 more traditional and modern commands. Archive
listings:gzip -land-lv,xz -land--robot -l,zstd -land-lv,lz4 --list,7z land7z l -slt.
Checks and keys:md5sum -cand the other digest commands'-c,
ssh-keyscan,ssh-add -L(andssh-add -lasssh-keygen -l),
openssl x509 -nooutwith-subject,-issuer,-dates,-serial
and-fingerprint,passwd -S,screen -ls. System:snap services,
snap connectionsandsnap changes,lsipc -q,-mand-s,
nmcli radio,timedatectl show,loginctl show-user,show-session
andshow-seat,apt-cache search,dpkg-query -W,pip freezeand
pip list --outdated. Developer tooling:go testresult lines and
go test -benchreports,gh pr list,issue list,run list,
release list,workflow listandrepo list,rustup check,
cargo search,just --list,uv python list,mise outdated.
Containers and clusters:docker system dfandsystem df -v,
docker context ls,docker compose lsandcompose ps,
docker ps -s,docker version,kubectl get pods,nodes,
services,deploymentsandnamespacesin their default, wide and
all-namespaces forms,kubectl config get-contexts,
kubectl api-resources,kubectl version,rclone lsl,lsdand
version,redis-cli infoandclient list. - A top-level
input.select.untilthat states its whole line reads that
line as the end of the output, the wayafterreads a heading, and a
line after it is unread (exit 3).net sharecloses on its completion
line with it, so another command's output behind the listing is
refused rather than read as shares. unescapetakesoctal: true, which reads a backslash and three
octal digits as the byte they name, andquote, which decodes only a
value put between that character. git and getfacl write names that
way.- A definition for
systemd-cgls: the control groups under the group,
unit or directory it starts from, the processes in each with their
ids, whether a group is delegated, and the group ids and extended
attributes systemd 252 prints to root. In atree, a form of
indentation that ends in a branch character (|-,└─) ends the
indentation, so the blanks after it that pad a right-aligned number
belong to the node. - Definitions for
eza -l(with--header,-a,-B, and in its
long-iso, full-iso,-gand-Hcolumn sets),procs,tokei,
bat --list-languagesandhyperfine --style basic. - Definitions for macOS:
vm_stat,sw_vers,diskutil list,
launchctl list,pmset -g,netstat -iandnetstat -rn,
system_profiler SPSoftwareDataTypeandSPHardwareDataType,
scutil --dns,networksetup -listallhardwareports,
brew outdated --verbose,memory_pressure,top -l,otool -L,
lipo -info,csrutil status,spctl --status,fdesetup status
andshasum -a 256, from output captured on a macOS 26 runner. - Definitions for Windows:
tasklistin its table,/v,/svc,/m,
/fo listand/fo csvforms,netstat -an,-anoand-e,
route print,arp -a,getmac /v,driverqueryanddriverquery /v,sc queryandsc queryex,schtasks /queryas a table and as
a list,net user,net localgroup,net shareandnet start,
whoami /groupsand/priv,chcpandver, from output captured on
Windows Server 2022 and 2025 runners. - Definitions for compiler-style diagnostics:
go vet(andgo build),
staticcheck,golangci-lint,actionlintandshellcheck -f gcc;
and formc ls(the MinIO client) andtask --list. - Definitions for
cargo tree,uv tree,npm ls --all,busctl tree
(one service or several),docker buildx lsandxinput list. md5sum --tag,sha1sum --tag,sha256sum --tag,b2sum --tagand
the rest of the GNU and uutils family are read by the definition of
the BSD digest line, which they print, together with FreeBSD and macOS
md5. A name the tools escape is decoded and markedescaped.- When
jz runhas no parser for a command and nothing in its arguments
names one, the refusal shows how to name one:
jz run --parser PARSER -- COMMAND .... split: alignedreads a heading of several words, such as
CONTAINER IDorSoft Limit, as one column whenheader.columns
gives it the name those words derive together.- Definitions for
lshw -shortandlshw -businfo. - Definitions for FreeBSD
md5and the other BSD digest commands,
sysctl,vmstat -i,df -hTandarp -a, and for OpenZFS
zfs listandzpool list. - Definitions for FreeBSD
kldstat -h,netstat -ib,netstat -r,
sockstat -s,last -yandiostat -x, and forlddoutput that
names each program above its libraries (glibc given several programs,
FreeBSD always). - With
--streamand--explain=json, a record the stream leaves out is
reported when it is left out, on its ownjz: explain:line of
standard error:{"event":"skipped","definition":...,"line":..., "reason":...,"skipped":N}, whereskippedcounts the records left out
so far.--explainwrites the same fact as a line of text. - Releases sign
checksums.txtwith cosign, include an SPDX SBOM for
each archive, and publish a Homebrew cask tonao1215/homebrew-tap.
A tag is published only after the release smoke checks pass on it.
Fixed
chage -l,curl --version,git count-objects -vandethtool -i
are read only as the lines they print,readelf -honly as the fields
of an ELF header, andlscpu --cachesholds each row to a cache name
and type. Lines another command printed after them were read as more
fields and as more caches. Thereadelf -hschema names the fields it
can hold, and is version 2.systemctl list-sockets,list-paths,list-timers,
list-automounts,list-machines,list-unit-files,list-jobsand
list-units,networkctl list,loginctl list-sessions,
list-seatsandlist-users,systemd-inhibit --listandtree
read their count line ("29 sockets listed.", "3 directories, 5
files") as the end of the listing. Another
command's output after it is refused as unread (exit 3), where rows of
it that fit the columns were read as more entries.jz run sysctlandjz run lsofon macOS found no definition: both are
the programs FreeBSD and Linux have, printing the same lines, and their
definitions now apply there.ls -leandls -lOon macOS, which add
access control lists and file flags to a long listing, are refused by
the argument rather than failing on the first list.- Ctrl-C typed at a terminal reached the command
jz runstarted twice:
once from the terminal, which sends it to the whole foreground group,
and once passed on by jz. A command that stops at once on a second
interrupt was stopped by one keypress. jz no longer passes on an
interrupt when the terminal's foreground group is its own and the
command is in it. jz run ls -lfor a user whose environment setsQUOTING_STYLE
returned names with the quotes in them. jz runs ls with the literal
style, and the long listings refuse-Q,--quoting-style,-band
-q, which change the names they print.jz run git log --onelinein a repository or for a user whose
configuration setslog.decoratereturned the branch names as part of
the first subject. jz runs git with decorations and signatures off for
this format, refuses-cand--config-envamong its arguments, and
on a pipe refuses a line whose parenthesis opens withHEAD, a tag or
a remote branch. Anargsentry that ends in=matches the long
option with any value.
exec.envnow comes from the variants the arguments leave, so the
setting does not reachgit config --list.- A duration with a fraction of a unit under a second is the number the
text names:1.3 msis0.0013where it was0.0013000000000000002,
andsystemd-analyze critical-chainreports+87msas0.087. The
parts of a duration are added up exactly and turned into a number
once. jz run systeminfo /fo csvno longer suggests that systeminfo runs
csv. A name whose definitions only describe a shape (csv,table)
is an option's value when it appears among a command's arguments.jz run systemctl list-units --plainfailed with exit 3 while a unit
had a job pending.--plaindrops the marker column, and the
definition for the table with a JOB column expected the header to be
indented for it. That table now has its own definition,
systemctl/units-jobs-plain, andsystemctl/units-jobsreads only
the indented header.ip addressoutput whose firstinetline is past the first twenty
lines, as when nine or more interfaces without an address come first,
was read asip linkwith each address and lifetime as a setting.
iproute2's output is now read asip address(its header has the
group and no mode), and BusyBox's, whose header is the same for both,
is refused.sysctl/freebsdno longer reads the lines of a value printed over
several lines as variables of their own (sysctl hw.intrsreturned a
variable namedirq1), and reads a name part holding a space, as the
ZFS kstat histograms print.- Eleven definitions no longer read a line of another command's output
printed after their own.ip linktook an unindented line as a
setting of the last interface,tc -s qdiscas a statistic,
bridge fdbas an entry,systemd-analyze blame,getconf -a,
lsattr,loginctl list-seats,systemd-id128 showand
git status --porcelainas rows, andunzip -landmodinfo
dropped such a line through an ignore rule that matched only its
start. Each now refuses it. modinforeads a parameter description written over several lines
(modinfo drm), which lost every line after the first, and a driver
that names more than nineteen firmware files (modinfo r8169), which
was not recognised.
Changed
docker system dfnames the four kinds of usage it reports, and
docker versionkeeps every value as the string docker printed,
Experimental'sfalseincluded. Their output schemas are version 2.- A definition's regular expressions are checked when it is loaded and
built into programs the first time they are matched, so a run no
longer builds the programs of the hundreds of definitions it does not
read with. Loading the official registry allocates half of what it
did,df -h | jzon one core takes 42 ms where it took 53 ms, and a
broken expression is still reported when the definition is loaded. git status --porcelainpaths are the names they stand for: a path git
quoted has its quotes removed and its escapes decoded, octal bytes to
UTF-8 ("docs/\346\227\245..."isdocs/日...).getfacldecodes
the backslash and the octal escapes it writes in a file name.- A
requiredfield whose value is a wordnull_ifnames isnull, where
it was an error: the command printed its word for no value, and
requiredrefuses a value that is missing or empty.kubectl get servicesreads a headless service'sNonecluster IP as null, which
was refused; its output schema is version 2. --assume-year nowdates a timestamp printed without a year in the
latest year that does not put it after the moment jz started, rather
than always in the current year. Alastorwholine of December 31
read in January used to come out in the future.jz testandmake registry-testreport a definition that reads a
fixture or a decoy once, naming every name that reached it
(md5/bsd (also named sha256sum, b2sum)), where a definition with
fourteen names used to be reported fourteen times.- Fourteen table definitions state the shape of the cells that tell a
row from prose: a version opens with a digit (pip list,mise ls,
npm outdated), an address is one (/etc/hosts), a unit file ends
in its type (systemctl list-unit-files), a row offreeisMem,
Swap,Total,LoworHigh, a git configuration name has a dot,
a docker identifier is hex, a scope is one of three words, a volume
name holds no space, and an alternative's status isautoor
manualwith an absolute path. A shell prompt or a word echoed after
the command's output used to be read as one more row and is now
refused with the line named. Joined to the tree change above, the
pairs of one command's fixture followed by another's that a
definition read as its own fell from 19,582 to 9,512 of 1.1 million
tried; what is left is theLabel: valueshape and two-word tables,
where no cell has a shape to hold a line to. - The Go toolchain the module asks for is 1.26.6, so a build with an
older 1.26 fetches it: govulncheck names four standard library
fixes between 1.26.4 and 1.26.6 that reach jz's code. - jz has no dependencies outside the Go standard library. The YAML of
definitions, manifests, fixture metadata and--defineis read by
jz's own reader, which covers the part of YAML those files use (block
and flow collections, plain, quoted and block scalars, comments, one
document per file) and refuses anchors, aliases, tags and keys that
are not one scalar, naming the line. A value that does not fit its key
(limit: abc,columns: x) is now refused with its line and path.
Loading the registry takes a third of what it did:df -h | jz48 ms
to 21 ms on the machine below. - jz starts faster. The definitions of a registry are decoded side by
side, and the sorted views a selection asks for are made once when the
registry is loaded rather than on every lookup. On a 32-thread machine
df -h | jztook 137 ms and takes 48 ms;jz version, which loads no
registry, takes 1 ms either way. - Detection over the whole registry joins the signature window once
rather than once per definition, and no longer renders a reason for a
definition whose first expression did not match, which--explain
never showed. A scan of 1000 definitions takes half the time and 14
allocations where it took 4000. - The engine and the JSON writer allocate less: the records of an input
are pieces of one copy of it, a table row is cut into cells without
boxing each of them twice, an object keeps an index of its members only
past eight of them, and strings and numbers are written without an
encoder per value. A table of 100 000 rows is read in 59 ms where it
took 109 ms, and its JSON is written in 19 ms where it took 73 ms (26
ms where it took 125 ms indented). The output is byte for byte what it
was, and the jsonutil tests now pin it against encoding/json. --streamcommits to a definition as soon as the lines that have come
can no longer change the choice, instead of holding back the widest
signature window of every candidate.jz run --stream vmstat 1wrote
its first record after about 17 seconds and now writes it after the
header and the first sample; piped with automatic detection it chose
after 200 lines and now after 2, writing the first record on the third.
A definition whose signature a later line could still meet or rule out
keeps the stream waiting, up to its window, unless a definition that
already fits would win over it.- 83 more definitions state what their text opens with (
\Ain
signature.all), andvmstat/linuxandvmstat/linux-activenow also
anchor their second line, which is what lets a stream rule them out on
its first lines. Text with a line before the one a definition opens with
(a warning above thedfheader that is not adf:message) is now
refused as unidentified, exit 4, where it was chosen and failed to
parse, exit 3. scc/defaultreports the byte count as the string scc printed, as it
does every other count: scc 4.1 prints it with thousands separators,
which was refused. Its output schema is version 2.mise/outdatedreads a tool the configuration names and nothing
installs, which mise prints as[MISSING], withcurrentas null. The
row was refused before. Its output schema is version 2.