Contributions are welcome! This guide covers everything you need to get started.
For detailed conventions, see docs/CONVENTIONS.md.
- Node.js 24+ (LTS recommended)
- npm 10+
# Install dependencies
npm i
# Start the development server
npm run dev
# Build and preview
npm run build
npm run previewsrc/
app/ App shell, providers, router
components/ Shared UI components
features/ Independent feature modules (connectors, marketplace, studio, traces, etc.)
hooks/ Shared custom React hooks
i18n/ Translations
lib/ Business logic and services
pages/ Route-level page components
stores/ Zustand stores (Yjs-backed)
test/ Unit tests (mirrors src/ structure)
tools/ Tool plugin definitions
types/ Shared TypeScript types
Feature modules (src/features/) are self-contained. They may import from src/lib/, src/stores/, and src/types/ but never from other features.
npm run test:run # Run all unit tests once
npm run test:watch # Watch mode (recommended during development)
npm run test:coverage # Tests with coverage report
npm run test:e2e # E2E tests (Playwright)
npm run test:e2e:ui # E2E tests with interactive UIAll new code in src/lib/ and src/stores/ must follow TDD:
- Red — Write a failing test that describes expected behavior
- Green — Write the minimum code to make it pass
- Refactor — Improve code quality while keeping tests green
- Verify — Run
npm run test:coveragebefore committing
| Directory | Target | Priority |
|---|---|---|
src/lib/** |
60%+ | Critical |
src/stores/** |
60%+ | Critical |
src/components/** |
30%+ | Medium |
src/pages/** |
20%+ | Low |
- Unit tests:
src/test/{category}/{name}.test.ts - E2E tests:
tests/e2e/{scenario}.spec.ts
| Type | Pattern | Example |
|---|---|---|
| Component | PascalCase.tsx |
AgentCard.tsx |
| Hook | use{Name}.ts |
useThreads.ts |
| Store | {name}Store.ts |
agentStore.ts |
| Service/utility | kebab-case.ts |
context-broker.ts |
| Test | {name}.test.ts |
agent-store.test.ts |
Tailwind CSS utility classes. No CSS modules. No styled-components. No hard-coded color values — use tokens (bg-primary, text-default-500).
Never hardcode user-facing strings. All text goes through the i18n system. Apostrophes use ' in translation strings.
Yjs is the single source of truth. Stores write directly to Yjs maps; reads come through reactive hooks (useLiveMap, useLiveValue). See docs/CONVENTIONS.md for patterns.
- Commit messages: Gitmoji with imperative mood, concise (
:sparkles: Add agent memory export, notAdded agent memory export feature) - Branch naming:
feature/short-description,fix/short-description - PRs: Include a summary and test plan
npm run lint # Run ESLint
npm run typecheck # Run TypeScript type checker- Architecture — System design and data layer
- Conventions — Full coding conventions
- Decisions — Why things are the way they are
- Glossary — Term definitions