Busy Monday
We had a busy Monday mergin' all kind of nice additions and small fixes.
Thanks for using Crush and contributing!
Hooks now use the built-in shell interpreter
We've been following with some improvements to the support for hooks.
Hooks will now use the built-in shell interpreter instead of the one from the system. This improves support for Windows, where bash is not always available.
If the script has a shebang, we'll still respect that and run on the specified tool.
Want to read more about hook support in Crush? We have some docs here.
Tip
The shell interpreter for Go that Crush uses is mvdan/sh from @mvdan. Really cool if you want to check it out.
Bring back shell expansion in config values
We fixed a regression and shell expansion should now always work again in certain values in your crush.json config.
This means you can do things like $(vault kv get my/secret/token) for API key fields, etc.
We also made it better than before, and it uses the very same shell interpreter mentioned above.
Fix for reading and updating big files
Crush has a size limit to certain operations to avoid filling the whole model context window and making the session useless.
For reading and updating files the limit is 200KB, but it wasn't working as intended. It was preventing the model to read any files bigger than that, while it should still allow to read parts of the file.
This was also affecting editing these files because the model needs to read before writting.
All fixed, and if your project is a single huge index.php file Crush should work again for you.
Kudos to @taoeffect for working on this.
Changed Assisted-by format to align with convention
The AI community is still figuring it out certain patterns and conventions, and we're adjust as things go.
We adjusted the Assisted-by trailer on Git commit messages to follow the convention that has been more widely adopted.
Format changed from:
Assisted-by: {modelName} via Crush <crush@charm.land>
to
Assisted-by: Crush:{modelID}
The actual standard we're now following is the one from the Linux kernel.
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).
Have a great Crushin' 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.