Commit log

f926a23 Remove workspace before deleting worktree directory on archive

Click to expand commit body
The file watcher was racing with directory deletion, causing
'root path could not be canonicalized' and 'reference HEAD not found'
errors. Now we remove the worktree's workspace from the MultiWorkspace
(stopping the file watcher) before deleting the directory.

Also fix directory deletion order: delete the directory first (it may
have uncommitted files that prevent git worktree remove --force from
succeeding), then clean up git's worktree registration.

On the restore side, clean up any stale worktree registration before
creating, to handle registrations left over from previous archives.

Richard Feldman created

b6dfdf8 Retry CI

Richard Feldman created

6d86797 Replace modal error dialogs with status toasts

Click to expand commit body
Error prompts were showing intrusive modal dialogs for background
operations. Now errors show as non-blocking status toasts with the
worktree directory name, while detailed diagnostic info (full paths,
error chains, step that failed) is logged via log::error!().

The one remaining prompt is the 'Delete Anyway / Cancel' decision
dialog when WIP commit creation fails — that's a user choice, not
an error notification.

Richard Feldman created

8fe5e85 Simplify worktree deletion: use git worktree remove instead of rename-to-temp

Click to expand commit body
The old approach renamed the worktree directory to a temp path before
deleting it, which raced with the filesystem watcher — the project's
worktree scanner would try to canonicalize the temp path while it was
being deleted, producing 'root path could not be canonicalized' errors.

Now we call git worktree remove --force first, which handles both the
git bookkeeping and directory deletion atomically. Manual fs removal
is only used as a fallback if git can't do it.

Richard Feldman created

3f9029a Use GitStore Repository entities for restore instead of raw fs.open_repo

Click to expand commit body
The restore flow was using fs.open_repo() to get raw GitRepository
trait objects, bypassing the normal git binary resolution that GitStore
handles. This caused 'no git binary available' errors in production.

Now the restore flow:
1. Opens a workspace for the main repo via open_project
2. Gets the Project from that workspace
3. Finds the main repo's Repository entity
4. Uses entity methods (create_worktree_detached, reset, change_branch)
   which go through GitStore's job queue with proper binary resolution

This matches how the archive side already works and removes the which
crate dependency from sidebar.

Richard Feldman created

88b6dea Fix branch_name and restored doc comments to match actual code

Richard Feldman created

090cbee Fix Windows CI: use ends_with for FakeFs paths, add cfg gate on import

Click to expand commit body
FakeFs on Windows prefixes paths with C:\, so exact path comparisons
in test assertions fail. Use ends_with instead.

Also add missing #[cfg(feature = "test-support")] gate on the
FakeGitRepositoryState import in fs.rs which broke check_docs.

Richard Feldman created

e24eaf4 Merge branch 'AI-112/git-worktree-operations' into AI-112/delete-worktree-on-archive-v2

Richard Feldman created

b3697a6 Fix branch_name Option check in fake create_worktree after merge

Richard Feldman created

e8e9f45 Merge remote-tracking branch 'origin/main' into AI-112/delete-worktree-on-archive-v2

Richard Feldman created

a553595 Merge remote-tracking branch 'origin/main' into AI-112/git-worktree-operations

Richard Feldman created

5998c15 Rewrite restore flow: non-blocking with pending worktree state

Click to expand commit body
The old restore flow blocked everything until the git worktree was
fully restored. The new flow:

1. Immediately associates the thread with the main repo workspace and
   shows it with a 'Restoring worktree...' spinner in the sidebar.
2. Background: does all git operations (create worktree, resets, branch
   switch) via raw fs.open_repo() — no entity system needed.
3. On success: opens a workspace for the restored worktree, reassociates
   the thread, and switches to it if the user is viewing the thread.
4. On failure: clears the pending state, shows an error toast explaining
   the thread is associated with the main repo instead.

This eliminates the workspace-searching code from the restore path
entirely. The archive side is unchanged.

Also adds pending_worktree_restore to ThreadMetadata (transient, not
persisted to DB) and a loading spinner in the sidebar's ThreadItem
when the state is set.

Richard Feldman created

d430cc5 sidebar: Add some design tweaks (#53026)

Click to expand commit body
- Make notification icons show up even for threads of the currently
active workspace
- When with a notification/any other status, replace thread item's agent
icon a status icon for higher visbility
- Remove hover state from currently active project/workspace's header
- Make project/workspace label brighter if I'm inside of it
- Adjust colors all around a bit (sidebar background and border, and
icons within the project header)

Release Notes:

- N/A

Danilo Leal created

9537861 Refine split diff icons (#53022)

Click to expand commit body
Follow-up to https://github.com/zed-industries/zed/pull/52781, adding
some different icons to better express the state in which the split diff
_is selected_ but _isn't active_, which happens when the editor is
smaller than a given amount of defined columns.


https://github.com/user-attachments/assets/2e7aaf6c-077f-4be5-9439-ce6c2050e63d

Release Notes:

- N/A

Danilo Leal created

363f153 Revert "Use workspace::open_paths in restore flow instead of searching workspaces"

Click to expand commit body
This reverts commit 58739078d5839b720d4bf43937cf302b5377ae0c.

Richard Feldman created

29609d3 language_model: Decouple from Zed-specific implementation details (#52913)

Click to expand commit body
This PR decouples `language_model`'s dependence on Zed-specific
implementation details. In particular
* `credentials_provider` is split into a generic `credentials_provider`
crate that provides a trait, and `zed_credentials_provider` that
implements the said trait for Zed-specific providers and has functions
that can populate a global state with them
* `zed_env_vars` is split into a generic `env_var` crate that provides
generic tooling for managing env vars, and `zed_env_vars` that contains
Zed-specific statics
* `client` is now dependent on `language_model` and not vice versa

Release Notes:

- N/A

Jakub Konka created

34c77a0 collab_panel: Add small design adjustments (#52994)

Click to expand commit body
Some tiny tweaks so that things look just a bit tidier in the collab
panel.

| Before | After |
|--------|--------|
| <img width="594" height="276" alt="Screenshot 2026-04-02 at 11  39@2x"
src="https://github.com/user-attachments/assets/f542d131-dbc5-41eb-bc13-0ebce3cf19a6"
/> | <img width="592" height="260" alt="Screenshot 2026-04-02 at 11 
34@2x"
src="https://github.com/user-attachments/assets/1198bc49-f780-433e-bb5d-6304f13703d6"
/> |

Release Notes:

- N/A

Danilo Leal created

cb99ab4 Add PageUp/PageDown scrolling in agent view (#52657)

Click to expand commit body
Fixes #52656

Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Closes #52656 

Release Notes:

- Added keybindings for scrolling in agent view

---------

Co-authored-by: Oleksiy Syvokon <oleksiy.syvokon@gmail.com>

Aleksei Gusev and Oleksiy Syvokon created

34f51c1 agent_ui: Remeasure changed entries in the thread view list (#53017)

Click to expand commit body
This PR fixes an issue where, sometimes, you couldn't scroll all the way
to the bottom of the thread's content. The scrollbar would show up at
the bottom of the scrollable container but the content was visibly cut
off. Turns out that's a consequence of the top-down thread generation
introduced in https://github.com/zed-industries/zed/pull/52440, where
changing the list alignment to `Top` made it visible that sometimes, the
maximum scroll area would get underestimated because the items in the
thread view's list would have a stale height measurement. So, the way
this PR fixes the issue is by calling `splice_focusable` in the
`EntryUpdated` event, too, so that the height of the items in the
overdraw area get marked as unmeasured, triggering a list re-render and
re-measuring.

We started by writing a test at the list level that would reproduce the
regression but then later figured out that this is not an inherent list
problem; it was rather a problem with its use within the thread view
layer. Then, we explored writing a test that documented the regression,
but it turned out to be very hard to simulate this sort of set up in
which certain elements would have its height changed during streaming,
which would be how you'd get to a mismatched height situation.

Therefore, given `AcpThreadEvent::NewEntry` already called
`splice_focusable` and don't have a test for it, we figure it'd be safe
to move forward without one, too. We then introduced a helper that's now
shared between `AcpThreadEvent::NewEntry` and
`AcpThreadEvent::EntryUpdated`.

Release Notes:

- Agent: Fixed an issue where sometimes you couldn't scroll all the way
to the bottom of the thread even though there's visibly more content
below the fold.

Co-authored-by: Eric Holk <eric@zed.dev>

Danilo Leal and Eric Holk created

05c749c settings_ui: Make all number fields editable (#52986)

Click to expand commit body
Taking advantage that we do have this capability now within the number
field component. I initially thought that some wouldn't make sense to be
editable but upon further reflection, why not? The buttons continue to
work, but if you want to type a more precise value, it should be
possible, too!

Release Notes:

- N/A

Danilo Leal created

dc3f5b9 cli: Add --dev-container flag to open project in dev container (#51175)

Click to expand commit body
## Before you mark this PR as ready for review, make sure that you have:

- [x] Added a solid test coverage and/or screenshots from doing manual
testing
- [x] Done a self-review taking into account security and performance
aspects
- [x] Aligned any UI changes with the [UI
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)

## Summary

Adds a `--dev-container` CLI flag that automatically triggers "Reopen in
Dev Container" when a `.devcontainer/` configuration is found in the
project directory.

```sh
zed --dev-container /path/to/project
```

## Motivation

This enables fully scripted dev container workflows — for example,
creating a git worktree and immediately opening it in a dev container
without any manual UI interaction:

```sh
git worktree add ../feature-branch
zed --dev-container ../feature-branch
```

The dev container modal fires automatically once the workspace finishes
initializing, so the environment is ready by the time you look at the
window. This is useful for automation scripts that prepare environments
and kick off agent runs for tasks like bug report triage.

Here's an [example
script](https://github.com/antont/todo-rs-ts/blob/main/scripts/devcontainer-new.sh)
that creates a worktree and opens it as a dev container in one step.

Related: #48682 requests a `devcontainer://` protocol for connecting to
already-running dev containers — a complementary but different use case.
This PR covers the "open project and trigger dev container setup" path.

## How it works

- The `--dev-container` flag flows through the CLI IPC protocol to the
workspace as an `open_in_dev_container` option.
- On the first worktree scan completion, if devcontainer configs are
detected, the dev container modal opens automatically.
- If no `.devcontainer/` config is found, the flag is cleared and a
warning is logged.

## Notable changes

- **`Workspace::worktree_scans_complete`** promoted from `#[cfg(test)]`
to production. It was only test-gated because it had no production
callers — it's a pure read-only future with no side effects.
- **`suggest_on_worktree_updated`** now takes `&mut Workspace` to read
and clear the CLI flag.
- Extracted **`open_dev_container_modal`** helper shared between the CLI
code path and the suggest notification.

## Test plan

- [x] `cargo test -p zed open_listener` — includes
`test_dev_container_flag_opens_modal` and
`test_dev_container_flag_cleared_without_config`
- [x] `cargo test -p recent_projects` — existing suggest tests still
pass
- [x] Manual: `cargo run -- --dev-container
/path/to/project-with-devcontainer` opens the modal

Release Notes:

- Added `--dev-container` CLI flag to automatically open a project in a
dev container when `.devcontainer/` configuration is present.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

Toni Alatalo and Claude Opus 4.6 created

fbdeb93 devcontainer: Implement remote support for git checkpoint operations (#48896)

Click to expand commit body
Closes #47907

Implements the four git checkpoint operations (`create`, `restore`,
`compare`, `diff`) that had been stubbed out for remote repositories,
and related test infrastructure.

Testing steps:

1. Open a project with a `.devcontainer` configuration and connect to
the Dev Container
2. Open an Agent thread and ask the agent to make a code change
3. After the agent completes, verify the "Restore from checkpoint"
button appears (previously missing in Dev Container sessions)
4. Click "Restore from checkpoint" and confirm the file reverts to its
prior state

Release Notes:

- Added support for git checkpoint operations in remote/Dev Container
sessions, restoring the "Restore from checkpoint" button in Agent
threads.

---------

Co-authored-by: KyleBarton <kjb@initialcapacity.io>

Oliver Azevedo Barnes and KyleBarton created

5873907 Use workspace::open_paths in restore flow instead of searching workspaces

Click to expand commit body
Instead of passing a slice of workspaces and manually searching for
the main repo entity, use workspace::open_paths to find or open the
workspace containing the main repo. This handles both 'already open'
and 'needs to be opened' cases, and eliminates the disk-based fallback
that was duplicating workspace opening logic.

Richard Feldman created

bd6dada languages: Change syntax highlighting for JSX elements (#49881)

Click to expand commit body
Syntax highlighting and its customization are very important to many
developers, including me. I've looked through a number of issues and
discussions on this topic and haven't found any active PRs. Currently,
there's no way to customize highlighting for custom JSX tags, as they
use `@type`. Since TSX has a particularly complex syntax and can often
contain types/aliases/generics/tags in a dense sequence, they all blends
into a single color and makes it difficult to "parse" by eyes.

To avoid proposing something arbitrary, I looked into how this is done
elsewhere.

- VS Code `support.class.component.tsx`
[TypeScriptReact.tmLanguage.json](https://github.com/microsoft/vscode/blob/724656efa2c26ab6e7eb2023426dcf2658dc3203/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json#L5802)

But it relies on both legacy [tmLanguage naming
conventions](https://macromates.com/manual/en/language_grammars#:~:text=rarely%20be%20used\).-,support,-%E2%80%94%20things%20provided%20by)
and the outdated assumption that React components are always classes.

- ReScript `@tag`
[rescript-zed](https://github.com/rescript-lang/rescript-zed/blob/b3930c1754ab2762938244546ea2c7fb97d01cb3/languages/rescript/highlights.scm#L277)

It's not entirely correct to just use a `@tag` - it's better to
distinguish JSX Intrinsic Elements from custom ones.

- Vue `@tag @tag.component.type.constructor`
[zed-extensions/vue](https://github.com/zed-extensions/vue/blob/2697588c5cde11375d47f53f9449af8e32600d81/languages/vue/highlights.scm#L9C21-L9C52)

- Svelte `@tag @tag.component.type.constructor`
[zed-extensions/svelte](https://github.com/zed-extensions/svelte/blob/ae381a1217d14c26cbedfaf84b0a2f5ae508f40c/languages/svelte/highlights.scm#L46C21-L46C52)

The similarity between Vue and Svelte implementations (perhaps one
borrowed from the other) didn't seem coincidental and the approach felt
appropriate.

**I decided to adopt the same one to maintain consistency for theme
creators.**

So, how it looks:

**Release (0.224.9) version**
<img width="440" height="220" alt="zed-one-release"
src="https://github.com/user-attachments/assets/6f8726c5-a17e-4387-941c-69e5c1569049"
/>

**Local version with changes** - no breaking changes for builtin themes
- uses `type` color as before and can be changed in themes separately if
needed
<img width="440" height="220" alt="zed-one-local"
src="https://github.com/user-attachments/assets/a11cc5ed-20fc-45d2-8ebd-a908503999c3"
/>

**Local version with changes and theme overrides**
<img width="440" height="220" alt="zed-one-with-overrides"
src="https://github.com/user-attachments/assets/1997bd5b-7fa4-4346-8338-b5d61e9e832b"
/>

With these changes in the config:

```jsonc
"theme_overrides": {
  "One Light": {
    "syntax": {
      // "tag.component" also matches
      "type.component": {
        "color": "#d3604fff",
      },
    },
  },
},
```

I'm pretty sure this will help many developers enjoy Zed even more.

Release Notes:

- Improved syntax highlighting for custom jsx elements in TSX and
JavaScript languages. Theme authors and users can now highlight these in
their theme/theme overrides using `tag.component.jsx`

finico created

efc53c2 docs: Center and re-flow perf images (#53004)

Click to expand commit body
Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Closes #ISSUE

Release Notes:

- N/A or Added/Fixed/Improved ...

Co-authored-by: Joseph T. Lyons <JosephTLyons@gmail.com>

Miguel Raz Guzmán Macedo and Joseph T. Lyons created

bdd44cb Thread fs through restore/create_fresh_worktree instead of fetching global

Click to expand commit body
Also use git::DOT_GIT constant instead of string literal.

Richard Feldman created

db06e51 Open repo from disk in create_fresh_worktree instead of searching workspaces

Click to expand commit body
The fresh worktree fallback is used when the main repo isn't open in
any workspace. Instead of bailing, open the repo directly from disk
via fs.open_repo() and call create_worktree on the raw GitRepository.

Richard Feldman created

bcae6d5 Fix main_repo_path doc comment to match actual behavior

Richard Feldman created

4694ccf Revise some doc comments

Richard Feldman created

7892b93 git_graph: Remove feature flag (#52972)

Click to expand commit body
After #52953 gets merged the git graph will be ready for it's preview
release, so we can finally remove the feature flag! AKA this PR releases
the git graph

Self-Review Checklist:

- [ ] I've reviewed my own diff for quality, security, and reliability
- [ ] Unsafe blocks (if any) have justifying comments
- [ ] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [ ] Performance impact has been considered and is acceptable

Closes #ISSUE

Release Notes:

- Add Git Graph. Can be accessed through the button on the bottom of the
git panel or the `git graph: Open` action

Anthony Eid created

6f3252f Add doc comments to ArchivedGitWorktree fields

Richard Feldman created

a3d27d6 Link all threads on a worktree to the archived record, not just the last

Click to expand commit body
When the last thread on a worktree triggers archival, all threads
associated with that worktree (including previously archived ones)
are linked to the archived worktree record. This way any of them
can trigger a restore when unarchived, not just the last one.

Richard Feldman created

06f939d Expose flexible panel settings in settings UI (#52946)

Click to expand commit body
Release Notes:

- Added controls to the settings UI for whether the terminal and agent
panels use flexible width.

Max Brunsfeld created

31e326f Delete git worktrees on thread archive, restore on unarchive

Click to expand commit body
When the last agent thread associated with a linked git worktree is
archived, creates two WIP commits to preserve staging state, anchors
them with a git ref, and deletes the worktree directory.

When a thread is unarchived, recreates the worktree from the WIP
commits, restores staging state via two resets, and cleans up.

Uses a join table (thread_archived_worktrees) to associate threads
with archived worktree records, allowing multiple archives of the
same path without data loss.

Richard Feldman created

c02ea54 docs: Update typefaces and some other styles (#52992)

Click to expand commit body
Update the heading typeface to use IBM Plex Serif, the code typeface to
use Lilex (IBM Plex Mono), and pull them from the zed.dev CDN. Also
added some stray design adjustments here and there.

Release Notes:

- N/A

Danilo Leal created

73cd7ec git_graph: Make the graph canvas resizable (#52953)

Click to expand commit body
### Summary

This PR integrates the git graph canvas with the `Table` component’s
`RedistributableColumnsState`, making the graph column resizable while
preserving the table’s existing resize behavior. In particular, column
resizing continues to use the same cascading redistribution behavior as
the table. This is also the last PR needed to remove the feature flag on
the git graph!

### Table API changes

I pulled the redistributable column logic out of `Table` into reusable
UI helpers so layouts outside of `Table` can participate in the same
column resizing behavior. This adds a shared
`RedistributableColumnsState` API, along with helpers for binding
drag/drop behavior, rendering resize handles, and constructing header
resize metadata. I also added `ColumnWidthConfig::explicit` and
`TableRenderContext::for_column_widths` so callers can render table like
headers and content with externally managed column widths.

The reason for this change is that the git graph now renders a custom
split layout: a graph canvas on the left and table content on the right.
By reusing the same column state and resize machinery, the graph column
can resize together with the table columns while preserving the existing
table behavior, including cascading column redistribution and double
click reset to default sizing.

I also adjusted the resize handle interaction styling so the divider
stays in its hovered/highlighted state while a drag is active, which
makes the drag target feel more stable and visually consistent during
resizing.

### Preview

https://github.com/user-attachments/assets/347eed71-0cc1-4db4-9dee-a86ee5ab6f91



Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A or Added/Fixed/Improved ...

Anthony Eid created

555b603 Allow amend commits in FakeGitRepository even when index matches HEAD

Click to expand commit body
Real git allows amend commits to rewrite the commit message even when
the tree is unchanged. The fake implementation was rejecting these
with 'nothing to commit', breaking git_panel::tests::test_amend.

Richard Feldman created

54cd577 Pass allow_empty: false at existing CommitOptions callsites

Richard Feldman created

a5cc6af Expose new git operations through git_store::Repository

Click to expand commit body
- Add create_worktree_detached (detached HEAD worktree creation)
- Add head_sha, update_ref, delete_ref, stage_all_including_untracked
- Wire allow_empty through to the commit proto and local paths

Richard Feldman created

ef6ba9d Implement new git operations in FakeGitRepository

Click to expand commit body
- Implement reset() with commit_history tracking (was unimplemented!)
- Implement commit() to track history and validate allow_empty
- Add FakeCommitSnapshot for commit history management
- Implement update_ref, delete_ref, stage_all_including_untracked
- Support Option<String> branch name in create_worktree (detached mode)

Richard Feldman created

cfb09c2 Add allow_empty to CommitOptions, detached worktree support, and new git operations

Click to expand commit body
- Add allow_empty field to CommitOptions and proto CommitOptions
- Change create_worktree trait method to accept Option<String> branch
  name (None means detached HEAD via --detach)
- Add update_ref, delete_ref, and stage_all_including_untracked to the
  GitRepository trait with implementations for RealGitRepository

Richard Feldman created

d3435b1 Update links to troubleshooting images (#52851)

Click to expand commit body
Now that I've started migrating blog content into the `zeddotdev-images`
bucket, I've added a bit of structure.

`/blog`
`/docs`

This PR just updates the links so we can stay organized going forward.
Shouldn't be seeing much thrash like this after this PR.

Release Notes:

- N/A

Joseph T. Lyons created

66ea4b8 ep: Move pure diffing functions to zeta_prompt:udiff (#52959)

Click to expand commit body
This PR mostly moves some code around. It also adds a high-level
`format_expected_output` function that routes patch formatting to
specific prompt formats. This was `zeta_prompt` can format
`expected_output` for training.

Keeping everything prompt-related in a "pure" module (with no heavy
dependencies) makes it easier to write bindings.


Release Notes:

- N/A

Oleksiy Syvokon created

f8d6467 Fixup and test edit prediction mocks (#52991)

Click to expand commit body
Follow-up of https://github.com/zed-industries/zed/pull/40185

Release Notes:

- N/A

Kirill Bulatov created

c4d7004 languages: Fix C/C++ preprocessor directive highlight regression (#49031)

Click to expand commit body
## Summary

- PR #48109 changed the capture name for C/C++ preprocessor directives
from `@keyword.directive` to `@preproc`. While semantically correct, the
builtin themes had `preproc` defined with colors nearly
indistinguishable from plain text (e.g. One Dark `#dce0e5ff`, Ayu Dark
`#bfbdb6ff`), making `#include`, `#define`, etc. appear unhighlighted.
- This PR updates the `preproc` color in all builtin themes (and the
fallback theme) to match their respective `keyword` color, restoring
visible highlighting for preprocessor directives.

Fixes #49024

## Side effects

- Go uses `@preproc` for `//go:` and `// +build` compiler directives.
These will also change from the previous muted gray to the keyword
color. This is arguably an improvement — compiler directives are special
constructs that benefit from visible highlighting, consistent with how
other editors (CLion, VS Code) handle them.

## Test plan

- [x] `cargo test -p language highlight_map` passes
- [x] Open a C/C++ file and verify `#include`, `#define`, `#ifdef`, etc.
are highlighted with the keyword color
- [x] Verify across multiple builtin themes (One Dark, Ayu Dark, Gruvbox
Dark, etc.)
- [x] Open a Go file and verify `//go:` directives are highlighted
reasonably

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Release Notes:

- Fixed C/C++ preprocessor directives (`#include`, `#define`, etc.)
appearing unhighlighted in builtin themes.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: MrSubidubi <finn@zed.dev>

Wuji Chen , Claude , and MrSubidubi created

e0b9c3a Add support for `diff.plus` and `diff.minus` highlight captures (#45459)

Click to expand commit body
- Update diff in highlights.scm to use semantic @diff.plus and
@diff.minus tokens
- Add diff.plus, diff.minus tokens to fallback theme
- Add diff syntax tokens to all official themes (One, Gruvbox, Ayu)

This fixes the issue where diff files showed inverted colors (additions
in purple/blue, deletions in green) by using proper semantic tokens
instead of @string and @keyword.

Related discussion in https://github.com/zed-industries/zed/issues/34057
(thought there might be second issue in that issue)

Release Notes:

- Added support for diff.plus, diff.minus and diff.deleta theme
selectors in the diff syntax grammar. Previously diff.plus was mapped to
@string and diff.minus was mapped to @keyword.

*Before:*

<img width="689" height="566" alt="Screenshot 2025-12-20 at 10 58 34 AM"
src="https://github.com/user-attachments/assets/b7ae4428-2011-4ec2-a803-7e30599e1715"
/>

*After:*

<img width="659" height="548" alt="Screenshot 2025-12-20 at 10 58 30 AM"
src="https://github.com/user-attachments/assets/02df31b5-1f1a-40af-adf0-1ac34457cdd4"
/>

*Before:*

<img width="650" height="545" alt="Screenshot 2025-12-20 at 10 58 16 AM"
src="https://github.com/user-attachments/assets/78b348bd-1b91-478b-a850-8e526adcfb3c"
/>

*After:*

<img width="627" height="563" alt="Screenshot 2025-12-20 at 10 58 21 AM"
src="https://github.com/user-attachments/assets/1176d626-563f-455a-9902-137f646eb8f2"
/>

*Before:*

<img width="628" height="550" alt="Screenshot 2025-12-20 at 10 58 06 AM"
src="https://github.com/user-attachments/assets/d819f478-bb2d-4afd-8013-c4e1a2f64dfe"
/>

*After:*

<img width="643" height="642" alt="Screenshot 2025-12-20 at 10 56 00 AM"
src="https://github.com/user-attachments/assets/e0f03549-77ed-4a47-b1da-239b519b90f4"
/>

---------

Co-authored-by: Finn Evers <finn.evers@outlook.de>
Co-authored-by: MrSubidubi <finn@zed.dev>

Bret Comnes , Finn Evers , and MrSubidubi created

a7248e8 Don't save buffers by default when running tasks (#52976)

Click to expand commit body
Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [ ] Unsafe blocks (if any) have justifying comments
- [ ] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [ ] Performance impact has been considered and is acceptable

Closes #52926
Follow-up to #48861
cc @SomeoneToIgnore

Release Notes:

- Edited buffers are no longer saved by default before running a task,
but you can still configure this using the "save" field in `tasks.json`.

---------

Co-authored-by: Kirill Bulatov <mail4score@gmail.com>

Justin Su and Kirill Bulatov created

4deb400 language_core: Introduce fallback highlights (#52575)

Click to expand commit body
Self-Review Checklist:

- [X] I've reviewed my own diff for quality, security, and reliability
- [ ] Unsafe blocks (if any) have justifying comments
- [ ] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [ ] Performance impact has been considered and is acceptable

Release Notes:

- Added the option for highlights from languages to specify fallbacks.
That means that if you have a pattern with the captures `@second.capture
@first.capture`, Zed will first try resolving a highlight from your
theme for the code fragment using the first capture, then look for the
second capture if no match for the first capture could be found.

---------

Co-authored-by: Kirill Bulatov <kirill@zed.dev>

Finn Evers and Kirill Bulatov created

f92b498 docs: Remove incomplete section in extension publishing steps (#52980)

Click to expand commit body
Release Notes:

- N/A

Finn Evers created

63b0791 agent_ui: Skip restoring external threads without metadata (#52978)

Click to expand commit body
Make sure we don't try and load a thread we don't have metadata for and
therefore is unlikely to exist

Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A

Ben Brandt created