Appearance
Testing
The desktop workspace ships three test surfaces. The test.yml GitHub workflow runs the first two on every PR; the third is opt-in locally and gates the gh-pages deploy.
Unit tests with coverage
@soma/ui, @soma/editor, and the soma renderer use Vitest under jsdom with @vitest/coverage-v8. Coverage reports land in <package>/coverage/ (HTML + lcov + coverage-summary.json) and CI uploads them as artifacts.
bash
just desktop-test-unit # all three packages, coverage on
pnpm --filter @soma/ui run test # @soma/ui only, no coverage
pnpm --filter @soma/editor run test # @soma/editor only (NodeAIRegistry…)
pnpm --filter soma run test # soma only, no coverage@soma/editor covers createDefaultAIRegistry — register, resolve by node type and surface, the locked category order (rewrite → transform → custom), and dispatch behavior including the "skip insertion when response not done / content blank / range missing" branches that the cutover 5d review surfaced.
@soma/ui reuses the Storybook preview annotations (decorators + parameters) via setProjectAnnotations in vitest.setup.ts, so every story file is testable through composeStories(...) — the same Intl, density, theme, and memory-router context that runs in Storybook. A smoke harness in src/stories/__tests__/stories-smoke.test.tsx renders the curated set; new stories drop in by adding an import * as Stories from "..." line.
UI E2E (Cucumber × Playwright)
desktop/desktop-e2e/ holds Gherkin features + step definitions, compiled to Playwright specs by playwright-bdd. The default target is the @soma/ui Storybook — same artifact we publish to /storybook/ on gh-pages. CI builds the catalog, serves the static export, and runs the suite against it before publish.
bash
just desktop-test-e2e # local: boots storybook + runs
E2E_BASE_URL=https://soma.vaam.store/storybook \
pnpm --filter @soma/e2e run test # against the live mirrorSee desktop/desktop-e2e/README.md for the step library + how to add a new feature.
Storybook on GitHub Pages
just docs-build builds VitePress into ./site and the @soma/ui Storybook into ./site/storybook. The release-pages.yml workflow publishes that directory as the gh-pages branch, served under the soma.vaam.store cname. The result is two routes under one host:
https://soma.vaam.store/— VitePress docshttps://soma.vaam.store/storybook/— Storybook catalog
The VitePress top-nav has a Storybook link; reviewers can poke the locked v0 surfaces in the browser without checking out the repo.