* Switch package manager from Yarn to pnpm Replace Yarn 3 (Berry) with pnpm 11.12.0 (latest stable): - Pin packageManager to [email protected].0; add pnpm-lock.yaml - Remove yarn.lock, .yarnrc.yml, and the bundled .yarn/ release - Update CI (ci-test, deploy) to use pnpm/action-setup + setup-node pnpm cache, with `pnpm install --frozen-lockfile` and pnpm scripts - Switch Husky pre-commit hook to `pnpm check` - Add pnpm-workspace.yaml allowlisting esbuild's build script, which pnpm 11 otherwise blocks with a hard error on install - Update CLAUDE.md guidance and drop yarn-specific .gitignore entries Verified: pnpm install --frozen-lockfile, pnpm check, and pnpm build all pass locally. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> * CI: read Node version from .tool-versions for pnpm 11 compat pnpm 11.12.0 requires Node >=22.13, but the workflows pinned node-version: '20' (20.20.2), failing install. Point setup-node at .tool-versions (22.14.0) so CI and local dev share one source of truth. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> --------- Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
2.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Commands
This project uses pnpm — pinned via packageManager in package.json (enable it with corepack enable). Use pnpm, not npm or yarn.
pnpm dev— start the Vite dev serverpnpm build— production build todist/pnpm preview— serve the production build locallypnpm check— type-check withsvelte-check(the only "lint"/CI gate; there is no ESLint/Prettier and no test suite)
pnpm 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 pnpm 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.tsmountsApp.svelteinto#app(seeindex.html) using Svelte 5'smount(). - Composition:
App.sveltestacks four page sections fromsrc/lib/:HeaderSection,SkillsSection,ExpSection,ContactSection. Adding/reordering page content happens here. - Reusable primitives live in
src/lib/components/(Header,Hero,Link) andsrc/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.sveltefile to change site content.
Conventions
- Svelte 5 runes syntax throughout: props via
let { ... } = $props(), slots via{@render children?.()}. Do not use legacyexport let/<slot>. - Prefer
<script lang="ts">with a typed props object for new components (seecomponents/Link.svelte,components/Hero.svelte). Some older section files use plain<script>— match the file you are editing. - Tailwind CSS v4 with no config file. It is enabled via the
@tailwindcss/viteplugin and@import "tailwindcss"insrc/app.css; customize through CSS, not atailwind.config.js.tailwind-mergeis available for conditional class composition. - Styling is Tailwind utility classes in markup; the dark theme base (
bg-gray-950 text-white) is set on<body>inindex.html. checkJsis on and.js/.sveltefiles are type-checked — keep JSDoc/types valid sopnpm checkpasses.
Deploy
Pushing to main triggers the deploy workflow: pnpm build → upload dist/ → GitHub Pages (https://dankotowski.dev). CI reads its Node version from .tool-versions (pinned to 22.14.0), matching local dev — pnpm 11 requires Node >=22.13.