acp-runtime
The ACP runtime is the domain service that serves the ACP API contract. It owns the host-scoped dependencies needed to run provider ACP sessions, but it should…
The desktop app has exactly one component kit: **`@emdash/ui`** (`packages/ui`). The legacy Tailwind/cva kit that lived at `apps/emdash-desktop/src/core/primitives/ui/browser/` was deleted by the UI-kit unification migration — do not reintroduce it or shim to its old APIs.
How it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
The desktop app has exactly one component kit: **`@emdash/ui`** (`packages/ui`). The legacy Tailwind/cva kit that lived at `apps/emdash-desktop/src/core/primitives/ui/browser/` was deleted by the UI-kit unification migration — do not reintroduce it or shim to its old APIs.
The desktop app has exactly one component kit: **`@emdash/ui`** (`packages/ui`). The legacy Tailwind/cva kit that lived at `apps/emdash-desktop/src/core/primitives/ui/browser/` was deleted by the UI-kit unification migration — do not reintroduce it or shim to its old APIs.
menus, tooltips, toasts, tabs, markdown, time display — import them from `@emdash/ui`. Do not hand-build a styled equivalent in feature code.
utilities in feature `browser/` code are fine until the separate future Tailwind-removal effort. Do not use Tailwind to build new reusable styled components.
base-ui patterns per [UI styling conventions](ui-styling.md). Storybook stories covering variants and states are mandatory for every new or extended component.
`src/core/features/<feature>/browser/` (or the owning service/primitive), composed from `@emdash/ui` primitives. Only promote to `packages/ui` when a component is genuinely app-agnostic.
(`@core/primitives/styling/browser/cn`). It is the only sanctioned class-merging helper app-side; `packages/ui` does not use it.
from the trigger and sizes to at least the trigger by default. Use `width="trigger"` when a form control should keep an exact column width. Avoid `alignItemWithTrigger`; it makes the selected row overlap the trigger and is reserved for a deliberately native-select-like interaction.
entities such as agents, branches, remotes, machines, models, and working copies. Prefer the composed `ComboboxPopover` when its trigger/list/footer API is sufficient. Use `width="content-at-least-trigger"` when rows contain useful secondary metadata that needs more room than the trigger.
checkbox items are appropriate when an action menu also exposes a current preference.
or commands.
mentions and slash commands.
Popup width is an explicit content decision rather than a positioning side effect. `Select`, `Combobox`, and `DropdownMenu` content support `trigger`, `content`, and `content-at-least-trigger` widths.
A page-level list of records is a **`CollectionView`** (`packages/ui/src/react/patterns/collection-view/`), full stop. Card grids, trees (`TreeView`), sidebars, popup pickers, and changed-files lists are different patterns. The reference renderings are the stories in `packages/ui/src/react/patterns/collection-view/collection-view.stories.tsx`; the full locked spec lives with the unify-list-views effort.
dividers, hover/selected states, and always-on virtualization. Row content is either tabular `columns` (`CollectionViewColumn[]`, with `CollectionViewCell` for two-line text cells) or freeform `renderRow` — exactly one of the two. There is no header row.
`Root`) for search/filter/sort/sections/selection/pagination, or plain `items` + `getItemKey` when no state layer is needed. Selection, sections, and loading/error status auto-wire in view mode; `renderSectionHeader` overrides the default label+count section header (for select-all headers and the like).
Taller measured content overrides via `estimateSize`; per-surface pixel tweaking is not a thing.
`CollectionToolbar.Search`, `Spacer`, `Group`, and `Separator` as needed, then put it in `toolbar`; floating bulk bars and banners built on `ListPopoverCard` go in `footer`.
labels live in the sort spec, never re-declared in the UI.
the default presentation is a hover-revealed leading checkbox column plus a floating `ListPopoverCard` bulk bar. Row click opens the item and never mutates.
discoverability on management tables, hover buttons for at most 1–2 high-frequency actions. Destructive actions go last, separated, destructive-styled, with a confirm modal when irreversible.
interactive empty states are allowed); `Spinner` is the loading default. Custom `EmptyState` slot content must pass `bare` — the card paints its own surface, so the component's panel background would patch over it.
Query, bridge the query result into the view with `useQueryListSource(query, buildItems)` (an `external` list source) instead of `observable.box` bridges or hand-rolled loading/error branches. Routing is then framework-owned: `loading` + no rows
Emdash is the Open-Source Agentic Development Environment (🧡 YC W26). Run multiple coding agents in parallel. Use any provider.
Repo: generalaction/emdash
The ACP runtime is the domain service that serves the ACP API contract. It owns the host-scoped dependencies needed to run provider ACP sessions, but it should…
This page defines the target organization of `packages/core/src/`. Core is organized by module type so that shared domain APIs and their platform…
Git is split into a transport contract and a host-scoped runtime. Renderer, desktop, and workspace-server code share the Wire vocabulary without importing Git…
The main process is organized into domain modules under `src/main/core/`. Each domain typically has a `controller.ts` (RPC handlers) and service/implementation…
`@emdash/core/primitives/path/api` is the source of truth for portable file identity and lexical path operations. The detailed package docs live in…