Commit log

5dacf9e docs(hooks): document new embedded shell model

Click to expand commit body
Specifically, we describe the embedded-shell contract, Windows behavior,
permissive shebang fallback, guaranteed CRUSH/AGENT env markers, and
timeout hard-return semantics.

Christian Rocha created

3b3f992 feat(hooks): propagate CRUSH/AGENT env vars to builtin shell

Click to expand commit body
Share CRUSH=1/AGENT=crush/AI_AGENT=crush between the bash tool's Shell
and the hook runner so the two surfaces can't drift.

Christian Rocha created

22d6f44 feat(hooks): run via shell.Run instead of sh -c

Christian Rocha created

af002dc fix(shell): ctx-aware jq builtin

Click to expand commit body
This in necessary so hook timeouts can now interrupt long-running
filters and large stdin reads for the builtin jq tool.

Christian Rocha created

2e8e536 feat(shell): shebang/binary/in-process dispatch handler

Christian Rocha created

f6ef43e refactor(shell): extract stateless run entrypoint

Click to expand commit body
This is necessary for sharing the builtin shell with hooks.

Christian Rocha created

b9fdf72 chore(hooks,skills): update crush-hooks skill per recent changes

Christian Rocha created

3cda50f fix(ui): fix dialog box shift when session rename is active

Christian Rocha created

755f6fa chore(ui): theme prep

Christian Rocha created

f686999 chore: auto-update files

Charm created

dc003bf feat: PreToolUse hook (#2598)

Christian Rocha created

a7546ad chore(tests): regression test for (lack of) disabled skills in the ui

Christian Rocha created

7a6149d fix(ui): don't show disabled skills

Bruno Krugel created

fa13c7f v0.62.1

Andrey Nering created

8ab740f test: re-record vcr cassettes

Andrey Nering created

37daf0f chore(deps): update fantasy and catwalk

Andrey Nering created

e5d95aa fix(hyper): fix re-authorization flow not triggering on certain conditions (#2703)

Click to expand commit body
We attempt to refresh tokens in two scenarios:

* Pro-actively, when we expiration date passed before a request
* Reactively, when we try a request but a 401 was returned

The error / event handling that shows a dialog asking the user to
re-authenticate is dependent on code that runs for the second scenario.
This means that the dialog might not show on the first scenario, if
refreshing the token fails.

If refreshing a token fails, continue with the previous token. Let it
fail and the 401 will trigger a re-authorization dialog.

I caught this because I was switching between local vs. prod Hyper a lot.

Andrey Nering created

e5b5a40 Merge pull request #2692 from charmbracelet/hypercrush

Click to expand commit body
chore(styles): overhaul style definitions

Christian Rocha created

81daa26 fix(styles): use semantic names in styles + drop deadcode

Christian Rocha created

4f3a308 chore(ui): formal hypercrush type treatment

Christian Rocha created

511916a fix(ui): logo and grad arguments from earlier refactor

Christian Rocha created

7cbb1db chore(ui): use Lip Gloss for color blends

Christian Rocha created

15f20e6 chore(ui): add new letterforms: h, y, p, e, with alts

Christian Rocha created

549f717 fix(agent): implement OnRetry logging with structured retry fields (#2700)

iceymoss created

f669bd3 fix(lsp): replace sticky unavailable cache with retry backoff (#2498)

Click to expand commit body
Scope unavailable tracking to each Manager instance and retry missing server commands after a short backoff so temporary environment changes do not permanently block LSP startup.

iceymoss created

da31815 chore(deps): update catwalk

Andrey Nering created

28ab548 docs(readme): tiny updates

Andrey Nering created

31025a1 chore: auto-update files

Charm created

cce8edf fix: remove minimax api key validate (#2688)

Click to expand commit body
MiniMax API keys don't always follow the "sk-" prefix pattern,
so the validation was causing unnecessary errors for valid keys.

Co-authored-by: Andrey Nering <andreynering@users.noreply.github.com>

flynn-eye and Andrey Nering created

b8eccf9 chore(legal): @flynn-eye has signed the CLA

Charm created

59927d5 chore(legal): @ne275 has signed the CLA

Charm created

79e5a6f v0.62.0

Andrey Nering created

7437d2b fix: silence unless warning about non-existent skill paths

Andrey Nering created

bbab2bc chore: auto-update files

Charm created

7cc020b chore: update catwalk to new domain (#2680)

Andrey Nering created

f6a8854 chore(legal): @iuga has signed the CLA

Charm created

ebf0c1c chore(deps): update fantasy and catwalk

Andrey Nering created

b0b5c14 chore: remove CODEOWNERS

Andrey Nering created

da33883 fix: reduce token usage, use short tool descriptions by default (#2679)

Click to expand commit body
* Follow-up of #2592

We've been testing this for 2 weeks, and it's working great.
This is a very useful enhancement to reduce token usage, cost, and make
smaller models behave better.

This is particularly significant for local models. These models are tiny,
and with a long enough system prompt they have little context window left
for work.

It's still possible to have the old behavior by setting:

    export CRUSH_SHORT_TOOL_DESCRIPTIONS=0

Andrey Nering created

4d7c55e test: re-record vcr cassettes

Andrey Nering created

9d555a7 fix: reduce `fetch` and `view` tools truncation size to 100KB

Click to expand commit body
Some models like Kimi K2.5 and GLM 5 simply don't handle well that many
content. When a big page or JSON API is fetch, it can break Crush
sessions.

We're drastically reducing the truncation size here, to 1/10 of what we
had before. It may look too much at first look, but 100KB it's actually
very reasonable. For example, the entire Task guide, which is
significantly large, is only 61KB:

https://taskfile.dev/docs/guide.md

Andrey Nering created

9a20f78 chore(legal): @axeprpr has signed the CLA

Charm created

d3f6d98 fix(lsp): mitigate stale diagnostics

Click to expand commit body
* fix(lsp): mitigate stale diagnostics

* fix(lsp): log warning when workspace change notification fails

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>

* test(lsp): add unit tests for diagnostics settling behavior

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>

* refactor(lsp): remove blocking diagnostic wait from post-edit notifications

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>

* chore: add async diagnostic waits

* Update internal/agent/tools/diagnostics.go

Co-authored-by: Andrey Nering <andreynering@users.noreply.github.com>

* fix(lsp): stop timer leaks in WaitForDiagnostics

Replace time.After with time.NewTimer + defer Stop() to prevent
unreclaimable timer allocations on early returns.

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>

---------

Co-authored-by: Andrey Nering <andreynering@users.noreply.github.com>

Christian Rocha and Andrey Nering created

f7beb12 feat: generally render output that looks like a diff as a diff (#2607)

Click to expand commit body
For example, the GitHub MCP server can fetch diffs. This makes those
diffs render as such, rather than just showing their raw output.

Christian Rocha created

7edf395 v0.61.1

Andrey Nering created

3474733 ci: use stable goreleaser action

Andrey Nering created

82d373d chore(legal): @gavmor has signed the CLA

Charm created

ea50d10 v0.61.0

Andrey Nering created

0a86d5f refactor(skills): strip implementation hints from crush-owned descriptions

Click to expand commit body
Descriptions should describe when a skill applies, not how it does its
job. Leaving language like "using go doc", "the jq command-line
processor", etc. in the trigger encourages the model to guess its way
through without reading SKILL.md.

Christian Rocha created

e64db33 feat(prompt): require loading appropriate skills before acting

Click to expand commit body
Models frequently skipped viewing a skill's SKILL.md and inferred its
behavior from the description alone; making the load mandatory in
<critical_rules> prevents LLMs from taking that shortcut.

Christian Rocha created