testing
All paths are relative to `apps/emdash-desktop/`.
How it fires
How this agent gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
Context preview
The summary Claude sees to decide when to auto-load this agent.
All paths are relative to `apps/emdash-desktop/`.
Agent definition
testing.mdTesting And Validation
All paths are relative to `apps/emdash-desktop/`.
Core Local Gate
Run these before merging (from the repo root or `apps/emdash-desktop/`):
pnpm run format
pnpm run lint
pnpm run typecheck
pnpm run test
Test Layout
- main-process tests: colocated in `src/main/core/**/*.test.ts`
- renderer unit tests: `src/renderer/tests/`
- renderer browser tests: `src/renderer/tests/browser/` (run via Playwright)
Current Setup
- Vitest config is in `vitest.config.ts` (separate from the build config in `electron.vite.config.ts`).
- Five test projects:
- `node` — `src/**/*.test.ts` excluding `_*` dirs, browser tests, migration tests, `*.db.test.ts`, and `src/main/db/legacy-port/**/*.test.ts`
- `main-db` — `src/main/core/**/*.db.test.ts` and `src/main/db/legacy-port/**/*.test.ts` against real SQLite
- `fixtures` — fixture generator, run via `pnpm run db:fixtures`
- `migrations` — `src/main/db/tests/migrations/**`, run via `pnpm run test:migrations`
- `browser` — `src/renderer/tests/browser/**/*.test.{ts,tsx}` via Playwright
- `pnpm run test` runs the `node`, `main-db`, `migrations`, and `browser` projects.
- Tests use per-file `vi.mock()` setup.
- Integration-style tests create temporary repos and worktrees in `os.tmpdir()`.
CI Notes
- `.github/workflows/code-consistency-check.yml` uses `nx affected` to enforce
format:check, typecheck, and lint only for projects touched by the PR. Nx computes the affected set using `nrwl/nx-set-shas` and the PR base/head SHAs.
- Tests are still expected locally before merging even though they are not enabled in that workflow yet.
Focused Validation
- after IPC/RPC changes: rerun the affected Vitest file and confirm the controller is wired in `src/main/rpc.ts`
- after worktree or PTY changes: rerun the closest `src/main/core/` test files
- after schema changes: run `pnpm run db:fixtures` and `pnpm run test:migrations`
Read more
Testing And Validation
All paths are relative to `apps/emdash-desktop/`.
Core Local Gate
Run these before merging (from the repo root or `apps/emdash-desktop/`):
pnpm run format pnpm run lint pnpm run typecheck pnpm run test
Test Layout
- main-process tests: colocated in `src/main/core/**/*.test.ts`
- renderer unit tests: `src/renderer/tests/`
- renderer browser tests: `src/renderer/tests/browser/` (run via Playwright)
Current Setup
- Vitest config is in `vitest.config.ts` (separate from the build config in `electron.vite.config.ts`).
- Five test projects:
- `node` — `src/**/*.test.ts` excluding `_*` dirs, browser tests, migration tests, `*.db.test.ts`, and `src/main/db/legacy-port/**/*.test.ts`
- `main-db` — `src/main/core/**/*.db.test.ts` and `src/main/db/legacy-port/**/*.test.ts` against real SQLite
- `fixtures` — fixture generator, run via `pnpm run db:fixtures`
- `migrations` — `src/main/db/tests/migrations/**`, run via `pnpm run test:migrations`
- `browser` — `src/renderer/tests/browser/**/*.test.{ts,tsx}` via Playwright
- `pnpm run test` runs the `node`, `main-db`, `migrations`, and `browser` projects.
- Tests use per-file `vi.mock()` setup.
- Integration-style tests create temporary repos and worktrees in `os.tmpdir()`.
CI Notes
- `.github/workflows/code-consistency-check.yml` uses `nx affected` to enforce
format:check, typecheck, and lint only for projects touched by the PR. Nx computes the affected set using `nrwl/nx-set-shas` and the PR base/head SHAs.
- Tests are still expected locally before merging even though they are not enabled in that workflow yet.
Focused Validation
- after IPC/RPC changes: rerun the affected Vitest file and confirm the controller is wired in `src/main/rpc.ts`
- after worktree or PTY changes: rerun the closest `src/main/core/` test files
- after schema changes: run `pnpm run db:fixtures` and `pnpm run test:migrations`
Emdash is the Open-Source Agentic Development Environment (🧡 YC W26). Run multiple coding agents in parallel. Use any provider.
Repo: generalaction/emdash
Other agents on emdash.
- 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 not mix cross-session routing with per-session state projection.
Open agent - main-process
The main process is organized into domain modules under `src/main/core/`. Each domain typically has a `controller.ts` (RPC handlers) and service/implementation files.
Open agent - overview
All paths are relative to `apps/emdash-desktop/`.
Open agent - renderer
All paths are relative to `apps/emdash-desktop/`.
Open agent - shared
- Agent/provider DTOs: - `src/shared/core/agents/agent-payload.ts` - provider metadata and capabilities are sourced from `packages/plugins/src/agents/registry.ts` - IPC primitives: - `src/shared/ipc/rpc.ts` — typed RPC router, controller, and client - `src/shared/ipc/events.ts`
Open agent - workspace-server
The Workspace Server (`apps/workspace-server/`) is a Node daemon that runs on a remote machine and exposes workspace runtimes (git, files, deps, ACP, …) to Emdash clients over the `@emdash/wire` protocol. Clients connect over an SSH-forwarded Unix socket; the daemon is
Open agent

