Skip to content

Releases: lemonadesaltbagel/sill

sill 0.5.0

Choose a tag to compare

@github-actions github-actions released this 27 Oct 07:06

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).
  • kill takes 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, and kill -l lists or translates them as bash does (kill -l 143 is TERM). 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-8 for 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). Through bash.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.
  • /tmp semantics are in Known limits: one folder per drive, created at the drive's root with its permissions.

sill 0.4.0

Choose a tag to compare

@github-actions github-actions released this 24 Oct 10:48

Installing

  • Started through a link (as winget's Links folder does), sill still finds its bundled tools.

MCP server

  • install-windows.ps1 -Mcp claude adds 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 -v go 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 c retargets the reference;
    • unset -n removes 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.
  • Integer variables (declare -i) evaluate what's assigned arithmetically: x=20+5, x+=3*2.
  • printf:
    • %b takes a width and precision, and keeps \" as bash does;
    • %(datefmt)T formats times;
    • a character argument ('A) is its code;
    • an invalid number (printf %d abc) prints printf: abc: invalid number on 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

Choose a tag to compare

@github-actions github-actions released this 24 Oct 02:24

MCP server

  • bash.exe --mcp runs 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_output and bash_kill: read and stop background jobs (run_in_background).
  • install-windows.ps1 -Mcp codex,gemini registers 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

Choose a tag to compare

@github-actions github-actions released this 23 Oct 21:34

The first release published in this repository. bash --version now names sill (sill 0.2.0 (brush 0.4.0, git:...)).

Bash behavior

  • trap takes signal names: trap cleanup EXIT INT TERM failed 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 -p and trap -l show 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) file is still a known limit: Windows' copy opens the source twice.)
  • exec cmd runs the program and exits with its status, so wrappers that end with exec "$JAVACMD" "$@" (gradlew, mvnw) work.
  • ulimit exists (it was "command not found", which stopped set -e scripts). It reports Git Bash's values and accepts limits within the hard one; Windows doesn't enforce them.
  • read -t works on pipes, files and the console.
  • source /dev/stdin, [ -c /dev/null ].
  • $UID and $EUID stay 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, ~+ and dirs use / separators inside the shell, as $PWD does. Programs get HOME and TMPDIR in 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_MESSAGES or LANG names another language.