Browse Source
Removes the default vitest/Playwright demo files and the /demo hub page that only linked to the removed Playwright demo. Replaces the generic sv-create README and "Welcome to SvelteKit" placeholder homepage with content describing this project and linking to the real demos. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>main
9 changed files with 44 additions and 78 deletions
@ -1,42 +1,34 @@ |
|||
# sv |
|||
# webavatar-core |
|||
|
|||
Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). |
|||
A base SvelteKit project meant to be branched off for future webavatar client projects. It provides the reusable core infrastructure those projects would otherwise reimplement from scratch — session management, auth tokens, and the realtime model connection — as a foundation to branch from, not a finished product. |
|||
|
|||
## Creating a project |
|||
See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full architecture map, and [AGENTS.md](AGENTS.md) for project conventions and structure. `docs/` holds a deep-dive per subsystem. |
|||
|
|||
If you're seeing this, you've probably already done this step. Congrats! |
|||
|
|||
```sh |
|||
# create a new project |
|||
npx sv create my-app |
|||
``` |
|||
|
|||
To recreate this project with the same configuration: |
|||
|
|||
```sh |
|||
# recreate this project |
|||
npx sv@0.17.0 create --template minimal --types ts --add prettier eslint vitest="usages:component,unit" playwright --install npm webavatar-base |
|||
``` |
|||
|
|||
## Developing |
|||
|
|||
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: |
|||
## Getting started |
|||
|
|||
```sh |
|||
npm install |
|||
cp .env.example .env |
|||
# fill in OPENAI_API_KEY and REALTIME_TOKEN_SECRET in .env |
|||
npm run dev |
|||
|
|||
# or start the server and open the app in a new browser tab |
|||
npm run dev -- --open |
|||
``` |
|||
|
|||
## Building |
|||
Open [`/demo/realtime`](http://localhost:5173/demo/realtime) for the realtime session reference wiring, or [`/demo/humanoid`](http://localhost:5173/demo/humanoid) for the humanoid avatar-state demo (works offline via `REALTIME_PROVIDER=mock`, no API key needed). |
|||
|
|||
To create a production version of your app: |
|||
## Scripts |
|||
|
|||
```sh |
|||
npm run build |
|||
``` |
|||
- `npm run dev` / `npm run build` / `npm run preview` — standard SvelteKit commands. |
|||
- `npm run check` — type-check. `npm run lint` / `npm run format` — prettier + eslint. |
|||
- `npm run test:unit` — vitest. `npm run test:e2e` — Playwright. |
|||
- `npm start` — run the production build via `server.js` (the persistent Node process the realtime WebSocket relay requires — see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)). |
|||
|
|||
You can preview the production build with `npm run preview`. |
|||
## Documentation |
|||
|
|||
> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. |
|||
| Subsystem | Doc | |
|||
| ------------------------------------------------------------- | --------------------------------------------------- | |
|||
| Architecture overview and module layering | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | |
|||
| Realtime session management | [docs/REALTIME_SESSION.md](docs/REALTIME_SESSION.md) | |
|||
| Tool calling (server- and client-executed) | [docs/TOOLS.md](docs/TOOLS.md) | |
|||
| Analytics recording | [docs/ANALYTICS.md](docs/ANALYTICS.md) | |
|||
| Configuration (env vars, persona) | [docs/CONFIGURATION.md](docs/CONFIGURATION.md) | |
|||
| `humanoid` package (avatar-state, animation composition) | [docs/HUMANOID.md](docs/HUMANOID.md) | |
|||
|
|||
@ -1,8 +0,0 @@ |
|||
<script> |
|||
import { greet } from './greet'; |
|||
|
|||
let { host = 'SvelteKit', guest = 'Vitest' } = $props(); |
|||
</script> |
|||
|
|||
<h1>{greet(host)}</h1> |
|||
<p>{greet(guest)}</p> |
|||
@ -1,15 +0,0 @@ |
|||
import { page } from 'vitest/browser'; |
|||
import { describe, expect, it } from 'vitest'; |
|||
import { render } from 'vitest-browser-svelte'; |
|||
import Welcome from './Welcome.svelte'; |
|||
|
|||
describe('Welcome.svelte', () => { |
|||
it('renders greetings for host and guest', async () => { |
|||
render(Welcome, { host: 'SvelteKit', guest: 'Vitest' }); |
|||
|
|||
await expect |
|||
.element(page.getByRole('heading', { level: 1 })) |
|||
.toHaveTextContent('Hello, SvelteKit!'); |
|||
await expect.element(page.getByText('Hello, Vitest!')).toBeInTheDocument(); |
|||
}); |
|||
}); |
|||
@ -1,8 +0,0 @@ |
|||
import { describe, it, expect } from 'vitest'; |
|||
import { greet } from './greet'; |
|||
|
|||
describe('greet', () => { |
|||
it('returns a greeting', () => { |
|||
expect(greet('Svelte')).toBe('Hello, Svelte!'); |
|||
}); |
|||
}); |
|||
@ -1,3 +0,0 @@ |
|||
export function greet(name: string): string { |
|||
return 'Hello, ' + name + '!'; |
|||
} |
|||
@ -1,2 +1,22 @@ |
|||
<h1>Welcome to SvelteKit</h1> |
|||
<p>Visit <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> to read the documentation</p> |
|||
<script lang="ts"> |
|||
import { resolve } from '$app/paths'; |
|||
</script> |
|||
|
|||
<h1>webavatar-core</h1> |
|||
<p> |
|||
A base SvelteKit project for webavatar client projects. It provides the reusable |
|||
infrastructure those projects would otherwise reimplement from scratch — session management, |
|||
auth tokens, and the realtime model connection — as a foundation to branch from, not a finished |
|||
product. |
|||
</p> |
|||
|
|||
<h2>Demos</h2> |
|||
<ul> |
|||
<li><a href={resolve('/demo/realtime')}>/demo/realtime</a> — realtime session reference wiring</li> |
|||
<li> |
|||
<a href={resolve('/demo/humanoid')}>/demo/humanoid</a> — humanoid avatar-state derivation |
|||
</li> |
|||
</ul> |
|||
|
|||
<h2>Docs</h2> |
|||
<p>See <code>docs/ARCHITECTURE.md</code> in the repo for the full architecture map, or the README for getting started.</p> |
|||
|
|||
@ -1,5 +0,0 @@ |
|||
<script lang="ts"> |
|||
import { resolve } from '$app/paths'; |
|||
</script> |
|||
|
|||
<a href={resolve('/demo/playwright')}>playwright</a> |
|||
@ -1 +0,0 @@ |
|||
<h1>Playwright e2e test demo</h1> |
|||
@ -1,6 +0,0 @@ |
|||
import { expect, test } from '@playwright/test'; |
|||
|
|||
test('has expected h1', async ({ page }) => { |
|||
await page.goto('/demo/playwright'); |
|||
await expect(page.locator('h1')).toBeVisible(); |
|||
}); |
|||
Loading…
Reference in new issue