Busy Monday
We had a busy Monday mergin' all sorts of additions and small fixes. Thanks for using Crush, thanks for your contributions, and read on for all the details.
Hooks now use the built-in shell interpreter
By default, Hooks will now use the built-in shell interpreter instead of the one from the system. This particularly improves support for Windows, where bash isn't always available. It's also great for general portability as you can ensure that Bash behaves the same across systems, including environments where Bash isn't available. Of course, if the script has a shebang, we'll still respect that and run on the specified tool.
Curious about Hooks in Crush? Check out the docs.
Bring back shell expansion in config values
Speaking of shell, we fixed a regression with shell expansion in config values. So now you can do things like:
"api_key": "$(vault kv get my/secret/token)"The bonus here is that we're also using the embedded shell interpreter, so all the Bash-like things you expect to work here will.
Note
If you're wondering how are we do all this awesome Bash stuff, it's with mvdan/sh from @mvdan. It's an absolutely solid project.
Fixed: big file reads and updates
Crush has a size limit on certain operations to avoid the whole context window getting filled up rendering a session useless. There were some bugs around this which we fixed, tool-to-tool. So now, if your project is a single huge index.php, file Crush should be able to work it out just fine.
Special thanks to @taoeffect for working on this.
Assisted-by, now in the style of the Linux Kernel
The AI community is still figuring it out patterns and conventions, and we're adjusting as things go. We adjusted the Assisted-by trailer on Git commit messages to follow the current convention of the Linux kernel which seems to be where people are settling at the moment.
For those following along, it was:
Assisted-by: {modelName} via Crush <[email protected]>
And now it’s:
Assisted-by: Crush:{modelID}
Smaller things
- Fixed expanding/collapsing thinking blocks with the keyboard.
- More reliable detection of image files attachment. Misrenamed your
.pngas.jpg? No problem, Crush will now look for the content instead of the extension. - We adopted the
writetool to allow the model to create empty files (thanks @vorticalbox). - LSPs should now work better on Windows (thanks @sven2718).
Hope you crush your week!
The Charm™ team
Changelog
New!
- dbd40d8: feat(config): resolve MCP args and thread resolver through env/headers/args (@meowgorithm)
- f716457: feat(config): resolve MCP url through shell expansion (@meowgorithm)
- 3b3f992: feat(hooks): propagate CRUSH/AGENT env vars to builtin shell (@meowgorithm)
- 22d6f44: feat(hooks): run via shell.Run instead of sh -c (@meowgorithm)
- 711d3a3: feat(shell): add ExpandValue for config value shell expansion (@meowgorithm)
- 2e8e536: feat(shell): shebang/binary/in-process dispatch handler (@meowgorithm)
- 010ca2f: feat: add touch tool for empty files (@vorticalbox)
Fixed
- 9d34668: fix(agent): release activeRequests before publishing TypeAgentFinished (@sven2718)
- 61a9fce: fix(config): individual errors on json parse (@taciturnaxolotl)
- 78088cd: fix(lsp): update powernap with fix for lsps windows (#2862) (@andreynering)
- da262be: fix(schema): fix schema descriptions being cut off (@taciturnaxolotl)
- c9fd6be: fix(shell): convert path to posix path in tests (@taciturnaxolotl)
- af002dc: fix(shell): ctx-aware jq builtin (@meowgorithm)
- 32410e2: fix(shell): fix build error post-refactor (@meowgorithm)
- 2235a49: fix: limit view size checks to returned content (#2785) (@taoeffect)
- 24da509: fix: properly follow the
Assisted-byheader spec (#2871) (@andreynering)
Docs
- d745ff5: docs(README): add note about shell expansion in MCP config (@meowgorithm)
- 1d42341: docs(hooks): clarify relative paths (@taciturnaxolotl)
- 5dacf9e: docs(hooks): document new embedded shell model (@meowgorithm)
- 06f4350: docs(skill): document shell expansion in crush-config skill (@meowgorithm)
- bcce662: docs: document lenient shell expansion and security model (@meowgorithm)
- 45f7484: docs: update resolver godoc to match lenient default (@meowgorithm)
Other stuff
- 3b0d5de: chore: auto-update files (@charmcli)
- b7607a0: chore: auto-update files (@charmcli)
- 302f4ec: chore: modernize errors.As to errors.AsType (@meowgorithm)
- f23e998: config: fail provider header expansion loudly and drop empty values (@meowgorithm)
- f913477: config: remove unused environment variable resolver (@meowgorithm)
- 0da13d7: fix(tools/touch): gate outside-workingDir paths via permission prompt (@vorticalbox)
- ac79e5b: fix(tools/view): detect image mime type; don't rely on extension (#2757) (@meowgorithm)
- d7d25cf: fix(ui/chat): make keyboard expand work for assistant thinking blocks (#2791) (@meowgorithm)
- 1f83559: lsp: expand shell variables in args and env (@meowgorithm)
- 9af81e3: merge: resolve conflicts with main (@taciturnaxolotl)
- c135266: refactor(config): make Resolved{Env,Headers} pure and error-returning (@meowgorithm)
- 5dc30cf: refactor(config): resolve shell vars via shell.ExpandValue (@meowgorithm)
- f6ef43e: refactor(shell): extract stateless run entrypoint (@meowgorithm)
- 7da38da: refactor(tools): remove touch tool; allow empty write content (@vorticalbox)
- abacef9: shell: switch config value expansion to lenient by default (@meowgorithm)
Verifying the artifacts
First, download the checksums.txt file and the checksums.txt.sigstore.json file files, for example, with wget:
wget 'https://github.com/charmbracelet/crush/releases/download/v0.67.0/checksums.txt'
wget 'https://github.com/charmbracelet/crush/releases/download/v0.67.0/checksums.txt.sigstore.json'Then, verify it using cosign:
cosign verify-blob \
--certificate-identity 'https://github.com/charmbracelet/meta/.github/workflows/goreleaser.yml@refs/heads/main' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
--bundle 'checksums.txt.sigstore.json' \
./checksums.txtIf the output is Verified OK, you can safely use it to verify the checksums of other artifacts you downloaded from the release using sha256sum:
sha256sum --ignore-missing -c checksums.txtDone! You artifacts are now verified!
Thoughts? Questions? We love hearing from you. Feel free to reach out on X, Discord, Slack, The Fediverse, Bluesky.
