Releases: schubydoo/claustrum
Releases · schubydoo/claustrum
Release list
v1.9.0
Features
- The daemon can now append every JSON-RPC frame in both directions to a JSONL capture file for diagnostics, opt-in via
-wire-log(with-wire-log-max-stringbounding how much of each string value is kept, 0 for whole payloads) or the matchingwire-log/wire-log-max-stringkeys inclaustrum.conf, off by default, with credentials redacted by key only (best-effort — a secret inside a payload string is not caught); it is a pure side channel, so frames on the wire are byte-identical whether or not it is on. (#268)
v1.8.0
Features
-installno longer bounds the-cli-urldownload at 5 minutes by default, so a slow-but-honest download the reference completes now succeeds rather than failing withcliError "download failed: context deadline exceeded (Client.Timeout or context cancellation while reading body)"; opt-in via-cli-download-timeoutor thecli-download-timeoutkey inclaustrum.conf. (#246)-installno longer bounds the<cli> --versionrunnability probe at 15 seconds by default, so a slow-but-working CLI installs instead of failing withcliError "installed cli at <path> is not runnable"and having its staged binary deleted; opt-in via-cli-probe-timeoutor thecli-probe-timeoutkey inclaustrum.conf. (#245)-installno longer caps the decompressed CLI or the download body at 512 MiB by default, so a large CLI installs instead of failing with acliErrorthe reference daemon never produces; opt-in via-max-cli-bytesor themax-cli-byteskey inclaustrum.conf. (#238)files.extract_tarno longer caps extraction at 512 MiB by default, so a large tree extracts instead of failing with an error the reference daemon never produces; the cap is now opt-in via-max-extract-bytesor themax-extract-byteskey inclaustrum.conf. (#236)files.readno longer refuses a non-regular path by default, so reading a character device such as/dev/nullreturns{"content":"","exists":true}as the reference daemon does instead of a claustrum-only-32602 "files.read: not a regular file"; the guard is now opt-in via-files-read-regular-onlyor thefiles-read-regular-onlykey inclaustrum.conf, which restores the bound on a writerless FIFO and on unbounded device reads. (#250)- The daemon no longer bounds every
gitinvocation at 60 seconds by default, so a slow-but-honest git on a large or cold repository completes instead of being SIGKILLed into a claustrum-only-32603 "signal: killed"(or agit worktree remove timed out after …) where the reference showed no such deadline at the durations probed; now opt-in via-git-timeoutor thegit-timeoutkey inclaustrum.conf. (#248) -installno longer bounds the linuxldd --versionlibc probe at 5 seconds by default, so a slowldd's answer stands instead of being killed into a fallback classification — the reference daemon showed no such deadline against a stalledlddat the durations probed; the deadline is now opt-in via-libc-probe-timeoutor thelibc-probe-timeoutkey inclaustrum.conf. (#251)
Fixes
- The
exitstream frame now arrives at most 5 seconds after a spawned process exits, instead of waiting forever when the command left a background grandchild holding its stdout. (#186) - A reply's
idis now the request's id decoded and re-encoded rather than the raw bytes echoed back, so a non-integer id such as1.0,1e2or{"b":1,"a":2}is canonicalized exactly as the reference returns it. (#188) -installnow creates the CLI directory chain owner-only (0700) like the reference, instead of0755which left the installed CLI world-traversable. (#191)- A non-200 CLI download now reports
download failed with status <code>like the reference, instead of a differently-worded message that also leaked the download URL into the__INSTALL_RESULT__line. (#197) - A zero-byte
-token-fileis now a fatal startup error instead of producing a daemon that listens but can never be authenticated to, and the daemon now logs a failed token-file unlink, a child stream read error, and a discarded stdin queue rather than passing over them in silence. (#200) - Report the reference daemon's error text for
files.liston a non-directory,files.extract_tarfailing to open the archive, andprocess.spawnwith an unusablecwd. (#175) - Expand a leading
~to the home directory on every path parameter, sofiles.*,git.*andprocess.spawnno longer fail or create a literal~directory. (#176) - A
~-prefixed path is now cleaned lexically like the reference —~/link/../xmeans~/xeven whenlinkis a symlink,~//fand~/a/./band a trailing~/wt/collapse, and bare~alone stays verbatim — which is wire-visible on eight frames, most sharply onfiles.stat/files.validatewhere a trailing separator on a regular file previously answerednot a directoryand now succeeds. (#205) files.extract_tarnow carries the reference'screate <entry>:prefix when an archive entry's target lands on an existing directory, so the error field readscreate ../sub: open <dest>: is a directoryinstead of the bare Go error. (#226)files.extract_tarnow refuses a Windows volume or UNC share root asdestDir— previously only the literal/was refused, soC:\passed the guard and reached theos.RemoveAllthat clears the destination before extracting. (#225)files.readnow applies the reference's 256 KiB (262144-byte) default cap whenmaxBytesis absent, zero, or negative, instead of reading the file without any limit; an explicit positivemaxBytesis still honored verbatim. (#189)- Wait for the login-shell PATH extraction before the first
process.spawnbuilds its child environment, so the first command finds binaries in~/.local/binand nvm. (#168) git.list_branchesreads git's stdout only and reports a failedfor-each-refas-32603 exit status <n>, so a broken ref no longer lists git'swarning:line as a branch and a corrupt refs database no longer returns that failure as branch names. (#213)git.statusandgit.list_branchesnow recognize a bare repository and a.gitdirectory as repositories, andgit.worktree_createignores asourceBranchthat is not a local branch instead of failing the request. (#178)git.statusnow trims the whole porcelain output before splitting it, so the first change loses its leading space and every later one keeps it, matching the reference. (#185)- Keep the leading space on
git.statusporcelain lines so a client can tell a staged change from an unstaged change. (#167) git.statusnow reads only git's stdout, so warnings git writes to stderr (an unreadablecore.excludesFile, for example) no longer appear as entries inchangesand no longer make a clean repo report as dirty. (#193)- The daemon now recovers from a panic in any request handler instead of crashing, replying
-32603 "recovered panic: <v>"and staying up for other connections, so a handler bug can no longer orphan managed child processes or leave a stale socket behind. (#243) -installno longer executeslddwhen the musl loader marker already answers the question, and it consumes the local-cli-zstblob once decompression succeeds rather than only on a fully successful install — both matching the reference. (#216)-installnow removes leftover.fetch-*download temporaries, which previously counted against-cli-keepand could delete every real CLI version, and it prunes only after an install that succeeded. (#180)-installstages the CLI at.fetch-<random>and sweeps stray*.zstblobs so leftovers no longer take a-cli-keepslot; an occupiedcliPathis cleared instead of failing with a rename error; a failed cli-dir creation carries themkdir cli dir:prefix;-cli-versionmust name a single entry inside-cli-dir, so a version reaching outside via..or a symlink can no longer delete a directory there, and one the orphan sweep claims (.fetch-*or*.zst) is refused; the new CLI is renamed into place before the old one is cleared, so two installs in one cli-dir cannot leave it empty; if another install reclaims its staging file, it retries once instead of failing. (#196)process.killAndWaitclampstimeoutMsat 30000 ms instead of 600000 ms, so a caller asking for a longer grace against a signal-ignoring child now gets its exit frame at 30 s, matching the reference. (#214)- The login-shell PATH is now applied only to spawned children, not the daemon's own environment, so the daemon no longer resolves its own
gitthrough the user's PATH; a non-executable$SHELLfalls back to a usable shell instead of failing extraction, and a missing PATH sentinel is logged with the shell's output. (#199) - Login-shell PATH extraction now gives up after 4 seconds instead of 10, matching the reference, so a slow login shell no longer del...
v1.7.3
Fixes
-versionnow reports a build time ongo install pkg@versionbuilds — such builds embed novcs.time, receive no-ldflags, anddebug.BuildInfohas no timestamp field, so-versionprintedbuilt unknown; the release pipeline now bakes the version and a UTC timestamp into the source it tags (buildstamp.go, written byknope prepare-release) and reports it when the resolved module version matches that release exactly, while a pseudo-version install (@main,@<sha>) still printsunknownand-ldflags/vcs.timecontinue to take precedence. (#163)
v1.7.2
Fixes
-versionnow reports the module version forgo install pkg@versionbuilds — such builds carry novcs.*build settings (they compile from the module cache, which has no VCS context), so the fallback found nothing and reported theclaustrum-devsentinel even for a binary installed at a real tag; it now falls back todebug.BuildInfo.Main.Version, keeping the precedence-ldflags>vcs.revision> module version > sentinel, so downstream version checks that parse-versioncan confirm ago installbuild's version. (#161)