diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..01bdf79 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,35 @@ +# 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 `