# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Commands This project uses **Yarn 3 (Berry)** — pinned via `packageManager` in `package.json`. Use `yarn`, not `npm`. - `yarn dev` — start the Vite dev server - `yarn build` — production build to `dist/` - `yarn preview` — serve the production build locally - `yarn check` — type-check with `svelte-check` (the only "lint"/CI gate; there is no ESLint/Prettier and no test suite) `yarn check` runs automatically on `git commit` via the Husky `pre-commit` hook, and on every PR / push to `main` via the `ci-test` workflow. There are no unit tests, so `yarn check` is the check to run before considering a change done. ## Architecture A single-page, statically-generated personal résumé site — no router, no backend, no data fetching. Everything is hardcoded content in Svelte components. - **Entry:** `src/main.ts` mounts `App.svelte` into `#app` (see `index.html`) using Svelte 5's `mount()`. - **Composition:** `App.svelte` stacks four page **sections** from `src/lib/`: `HeaderSection`, `SkillsSection`, `ExpSection`, `ContactSection`. Adding/reordering page content happens here. - **Reusable primitives** live in `src/lib/components/` (`Header`, `Hero`, `Link`) and `src/lib/icons/`. Sections compose these; primitives hold no page-specific content. - Résumé text (skills, experience, contact info) is written inline in the section components — edit the relevant `*Section.svelte` file to change site content. ## Conventions - **Svelte 5 runes syntax** throughout: props via `let { ... } = $props()`, slots via `{@render children?.()}`. Do not use legacy `export let` / ``. - Prefer `