132 Commits
Author SHA1 Message Date
Kieran KlukasandKieran Klukas ce08b22045 feat(dirs): add some styling to the dirs command 2026-05-14 22:17:49 -04:00
bbrodrigesandKieran Klukas 5331fe25e1 add -p flag to dirs command 2026-05-14 22:17:49 -04:00
Tai GrootandChristian Rocha 9e126c27da fix: detect stale server during development with BuildID
The version check compared Version strings, but during development both
client and server report "devel" — so stale servers were never restarted.

BuildID is now derived from the executable's modification time, which
changes on every recompilation (including go run). The server exposes it
via /v1/version and the client checks both Version and BuildID match.

Assisted-by: Crush:AWS Claude Opus 4.6
2026-05-14 15:32:41 -04:00
Christian RochaandGitHub 61fa910250 Merge pull request #2876 from charmbracelet/client-server-race
fix: client-server startup race
2026-05-14 09:56:46 -04:00
Christian RochaandCharm Crush eb03b3bb93 fix(test,race): probe server health during the run, not after
Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-14 09:42:02 -04:00
Christian Rocha 5569be61a7 fix(lint): require exec.CommanadContext over exec.Command 2026-05-14 09:42:02 -04:00
Kieran KlukasandGitHub 303b153b97 feat(oauth): add logout command (#2838) 2026-05-12 13:59:08 -04:00
Christian RochaandCharm Crush dd1be0e0c1 refactor(server): derive per-host cache dir from parsed host URL
Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-11 20:24:07 -04:00
Christian RochaandCharm Crush 2dba83a416 test(server): regression for the client/server spawn race
Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-11 20:24:07 -04:00
Christian RochaandCharm Crush d41c118511 fix(server): serialize concurrent server spawns with a per-host lock
When two clients started up at the same time they would both try to
spawn a server and one would lose the bind race, leaving a confusing
log behind. Take an exclusive file lock around the spawn-and-wait
sequence, re-check health after acquiring the lock, and skip the spawn
entirely if a peer client has already brought the server up. The lock
is released as soon as the new server is ready.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-11 20:24:07 -04:00
Christian RochaandCharm Crush d17d61ce2d fix(server): spawn after stale shutdown + handle socket errors
Two related gaps in the client startup path. After a version mismatch we
were shutting the old server down and then never starting a new one,
leaving the next caller to time out against a missing socket. And any
unexpected error from inspecting the socket path (something other than
"not found") was silently ignored, so we'd fall straight into the same
timeout. Both paths now converge on "needs (re)start" and we try to
clean up any stale file in the way before spawning.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-11 20:23:38 -04:00
Christian RochaandCharm Crush 8021114b23 fix(server): keep the spawned server alive after the parent exits
The parent process was creating the detached server via a context-bound
command, so when the parent exited or its context was cancelled the
runtime would also kill the brand new server we had just spawned. Drop
the context binding and rely on the existing platform-specific detach
to give the server a life of its own.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-11 15:59:22 -04:00
Christian RochaandCharm Crush 9b366c36c3 fix(server): probe readiness over HTTP instead of statting the socket
Cold starts of CRUSH_CLIENT_SERVER=1 frequently failed with a stat error
because the spawned server creates the socket file as the last step of
initialization, well after the parent had given up. Replace the stat
polling with a real HTTP probe against /v1/health, treat any 2xx as
ready, and make the total budget overridable via CRUSH_SERVER_READY_TIMEOUT.
Drop the now-redundant CreateWorkspace retry loop.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-11 15:57:04 -04:00
Andrey NeringandGitHub a14feb3ef1 feat: launch hyper beta (#2768)
No need to set `HYPERCRUSH=1` anymore.
2026-04-30 21:53:01 +00:00
Bruno KrugelandGitHub 066fb5a116 fix: remove unused build (#2734) 2026-04-28 01:04:26 +00:00
Christian Rocha 9d4653e8c9 chore(styles): use hypercrush theme when hyper is selected 2026-04-27 17:00:43 -04:00
Christian Rocha 755f6fae6f chore(ui): theme prep 2026-04-26 11:19:19 -04:00
Christian Rocha 81daa26681 fix(styles): use semantic names in styles + drop deadcode 2026-04-24 09:15:35 -04:00
Andrey NeringandGitHub 2f32c9bc5e feat: enable progress bar on iterm2 (#2641) 2026-04-17 18:52:14 +00:00
Andrey NeringandGitHub e8f5e2025d feat: show progress bar on rio terminal (#2624) 2026-04-16 17:29:28 -03:00
Christian RochaandGitHub d9f857fb29 fix(events): prevent early events from being dropped before init (#2611) 2026-04-13 11:04:49 -04:00
Bruno KrugelandGitHub fa1565813c fix(schema): fix crush.json schema generation (#2574) 2026-04-08 10:05:47 -03:00
Ayman BagabasandGitHub 28f2087e22 Merge pull request #2455 from charmbracelet/server-client-2
Feat/Refactor: Server Client architecture and API
2026-04-02 15:51:19 -04:00
Bruno KrugelandGitHub e3df84efb4 refactor: modernize (#2548) 2026-04-02 10:24:28 -03:00
Ayman Bagabas f3fe760043 Merge branch 'main' into server-client-2 2026-04-01 13:53:57 -04:00
Christian RochaandGitHub b68823b0ae feat(cli/session): show skill metadata (#2541) 2026-03-31 16:24:11 -04:00
Andrey NeringandGitHub 42c8bcc60c fix: do not commit .crush/.gitignore (#2531)
Having a `.crush/.gitignore` showing on `git diff` just because you
started Crush on a directory is annoying.
Having the file there is enough. We don't want to commit it.
2026-03-31 10:30:43 -03:00
Andrey Nering 1a0b6389f0 chore: update generated .crush/.gitignore to not ignore skills 2026-03-25 10:17:36 -03:00
Ayman Bagabas 40c426a950 chore: add a workaround for slog calls in config.Load leaking to stderr 2026-03-22 12:52:44 +03:00
Ayman Bagabas 9a63da505a feat: add AppWorkspace implementation of Workspace interface gated behind CRUSH_CLIENT_SERVER env var 2026-03-22 12:40:45 +03:00
Ayman Bagabas a35a2bdc2c Merge branch 'main' into server-client-2 2026-03-22 11:17:12 +03:00
Ayman Bagabas bc383d9835 fix(server): log to stderr if it's a terminal 2026-03-22 10:53:21 +03:00
Andrey NeringandGitHub ddd99cd2f6 feat: add aliases: crush r -> crush run, crush s -> crush session (#2424) 2026-03-19 11:07:16 -03:00
Andrey NeringandGitHub 630ff8c5df feat: add support for --session and --continue for the tui (#2422)
These flags were previously only available for `crush run`.
2026-03-19 11:06:13 -03:00
Ayman Bagabas 72251dd906 refactor: update client methods to return proto types 2026-03-17 15:29:12 +03:00
Ayman Bagabas 65974bb4ea fix: setup logging in server and client commands 2026-03-17 13:30:47 +03:00
Ayman Bagabas ee13558119 Merge remote-tracking branch 'origin/main' into server-client-2 2026-03-17 01:01:49 +03:00
fad58e2c26 feat: be able to continue non-interactive sessions (#2401)
Co-authored-by: Andrey Nering <andreynering@users.noreply.github.com>
2026-03-16 20:40:29 +00:00
Christian RochaandGitHub a1fc44bb0d chore(events): add events for the CLI session series of commands (#2408) 2026-03-16 15:12:39 -04:00
Ayman Bagabas e8d2835ddb Merge branch 'main' into server-client-2 2026-03-16 18:19:07 +03:00
Ayman Bagabas e44211db25 refactor: migrate run and login commands to use client API instead of direct app access 2026-03-13 12:42:32 +03:00
Ayman Bagabas 344eb3223b fix: ensure proper resource cleanup and add retry logic for workspace creation 2026-03-12 22:09:32 +03:00
Christian RochaandGitHub cfcbd69eb2 feat: CLI-based session access and management (#2373) 2026-03-12 16:09:42 +00:00
Ayman Bagabas e70c8ba8f6 refactor: use client and server for workspace access and management 2026-03-12 18:24:29 +03:00
Ayman Bagabas 64f6cdf560 refactor: rename Permissions.SkipRequests to Overrides().SkipPermissionRequests 2026-03-12 14:31:26 +03:00
Ayman Bagabas 99108f0e80 Merge branch 'main' into server-client-2 2026-03-12 03:28:06 +03:00
Ayman BagabasandGitHub 5ff8d68760 refactor(config): introduce ConfigStore and Scope for better config m… (#2395)
* refactor(config): introduce ConfigStore and Scope for better config management

This makes config.Config immutable and introduces a ConfigStore that
manages the config and provides helper methods for accessing config
values with proper scoping (global, workspace). This allows us to avoid
passing around mutable config objects and ensures that all parts of the
code are accessing the most up-to-date config values. It also lays the
groundwork for future features like per-workspace config overrides.

* fixt: lint
2026-03-12 03:12:02 +03:00
Ayman Bagabas 1b37d55bb6 feat: send server client version info 2026-03-10 22:04:32 +03:00
Ayman Bagabas 0f2e2f0526 feat(server): initial implementation of Crush RPC server/client 2026-03-10 18:00:16 +03:00
Christian RochaandGitHub e0d3141af1 fix(events): remove redundant posthog exit event (#2371) 2026-03-09 10:00:40 -04:00