Repository navigation
Releases: lemonadesaltbagel/sill
Releases · lemonadesaltbagel/sill
Release list
sill 0.5.0
Process lifetimes (Windows Job Objects)
- Every program sill starts joins a Job Object before it runs. A process tree followed through parent PIDs loses processes whose parent has exited, and so does
taskkill /T, how harnesses stop commands. A job doesn't.kill $!ends everything a background job started, including what a wrapper that already exited left behind (npx,cmd /c start): no more dev server holding its port.- Killed mid-command (a harness's timeout), sill takes everything the command started with it.
- A command that finishes normally leaves what it deliberately started running (
start, an editor, a build daemon), as from a terminal.
- MCP server: commands join their job before starting (no window for a grandchild to escape). Programs a command leaves running become a background job of the session, reported in the result, and end with the session. The first command runs in the client's project root, or the home folder rather than a client's install folder (a folder in the temporary folder stays where it is).
killtakes every signal whose default is to end a process (USR1,ALRM, ...; it ends the process tree, with 128 + the number), refuses the ones that would stop, continue or be ignored rather than end it, andkill -llists or translates them as bash does (kill -l 143isTERM). An invalid signal is status 1, as in bash.- MCP output in the system's code page: a line that isn't UTF-8 (Java since JEP 400 writes GBK into a pipe on Chinese Windows) is read in the ANSI code page when that reads it cleanly.
- Java through the MCP server writes UTF-8: the server sets
JAVA_TOOL_OPTIONS=-Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8for its commands (unless you set your own) and leaves out the note each JVM prints for it. Without it, Java loses what the ANSI code page can't hold (??for Chinese on English Windows). Measured on GitHub's runner and in a zh-CN Windows container (code page 936). Throughbash.exe -c, Java's settings are left alone; Known limits says how to get UTF-8 there.
Checks
- The build runs the evidence: the 59 conformance cases, directly and through MCP (all must pass; three are new, for process lifetimes), brush's compat suite on Windows against Git Bash (no failure beyond a committed baseline), and on Linux against bash.
- Builtins' diagnostics are written a line at a time, not a byte at a time.
Docs
- Java's output encoding is in Known limits.
/tmpsemantics are in Known limits: one folder per drive, created at the drive's root with its permissions.
sill 0.4.0
Installing
- Started through a link (as winget's Links folder does), sill still finds its bundled tools.
MCP server
install-windows.ps1 -Mcp claudeadds the server to Claude Desktop.- The conformance suite also runs through the MCP server (56/56).
Bash behavior
- Namerefs (
declare -n,local -n):- reads, writes, appends, unset and
test -vgo through the reference, including chains (up to 8, as in bash) and references to array elements (arr[1]); - attributes (
declare -i/-x/-r,export) apply to the target; ${!ref}gives the name it refers to;for ref in a b cretargets the reference;unset -nremoves the reference itself;- bash's checks: self-references, invalid target names, circular chains.
The typical use, returning an array from a function (f() { local -n out=$1; out=(...); }), works.
- reads, writes, appends, unset and
- Integer variables (
declare -i) evaluate what's assigned arithmetically:x=20+5,x+=3*2. printf:%btakes a width and precision, and keeps\"as bash does;%(datefmt)Tformats times;- a character argument (
'A) is its code; - an invalid number (
printf %d abc) printsprintf: abc: invalid numberon the command's own stderr (redirections apply) and fails with status 1.
Messages
- Diagnostics in bash's shape, with the line:
build.sh: line 3: cd: /nope: No such file or directory,bash: line 1: printf: abc: invalid number. This covers the shell's own errors and the builtins' messages. - Expansion and arithmetic errors name what failed:
u: parameter null or not set,5 % 0: division by 0,2 +* 3: arithmetic syntax error.
sill 0.3.0
MCP server
bash.exe --mcpruns sill as an MCP server (stdio), for harnesses whose own shell is PowerShell (Codex CLI, Gemini CLI) and clients with none. Tools:bash: runs a command. The working directory and exported variables carry over to the next call. A timeout (default 2 minutes, at most 10) ends the command and everything it started.bash_outputandbash_kill: read and stop background jobs (run_in_background).
install-windows.ps1 -Mcp codex,geminiregisters it in each client's config.
Running things
apply_patch, the file-editing command Codex's models use, is a builtin. It takes the patch from stdin or as an argument, and keeps each file's line endings.
sill 0.2.0
The first release published in this repository. bash --version now names sill (sill 0.2.0 (brush 0.4.0, git:...)).
Bash behavior
traptakes signal names:trap cleanup EXIT INT TERMfailed as a whole on Windows ("INT: invalid signal specification"), so not even the EXIT cleanup ran. Signals now have their Linux names and numbers,trap -pandtrap -lshow them, and an invalid name no longer drops the valid ones.- Process substitution:
cat <(cmd)and other programs that look at a path before opening it failed with "All pipe instances are busy". (cp <(cmd) fileis still a known limit: Windows' copy opens the source twice.) exec cmdruns the program and exits with its status, so wrappers that end withexec "$JAVACMD" "$@"(gradlew,mvnw) work.ulimitexists (it was "command not found", which stoppedset -escripts). It reports Git Bash's values and accepts limits within the hard one; Windows doesn't enforce them.read -tworks on pipes, files and the console.source /dev/stdin,[ -c /dev/null ].$UIDand$EUIDstay a regular user's when elevated, as in Git Bash. A root uid (brush's behavior) stopped scripts that refuse to run as root on the many machines where developers work as administrators.
Paths and messages
~,$HOME,$TMPDIR,~+anddirsuse/separators inside the shell, as$PWDdoes. Programs getHOMEandTMPDIRin Windows form.- System errors in POSIX wording: "No such file or directory", "Permission denied", ..., from the shell and its built-in tools, instead of Windows' sentence in the user's language. sill's own messages are in English unless
LC_ALL,LC_MESSAGESorLANGnames another language.