Switch package manager from Yarn to pnpm (#214)

* 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]>
This commit is contained in:
2026-07-13 02:30:39 -05:00
committed by GitHub
co-authored by Claude Opus 4.8
parent b8d1c61dbf
commit 2d14d87a83
12 changed files with 1344 additions and 3047 deletions
+6 -5
View File
@@ -14,13 +14,14 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
node-version-file: '.tool-versions'
cache: 'pnpm'
- name: Install Dependencies
run: |
npm install -g yarn
yarn install
run: pnpm install --frozen-lockfile
- name: Lint solution
run: yarn check
run: pnpm check
+6 -5
View File
@@ -13,16 +13,17 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
node-version-file: '.tool-versions'
cache: 'pnpm'
- name: Install Dependencies
run: |
npm install -g yarn
yarn install
run: pnpm install --frozen-lockfile
- name: Build solution
run: yarn build
run: pnpm build
- name: Archive artifacts
uses: actions/[email protected]
with:
-11
View File
@@ -2,8 +2,6 @@
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
@@ -22,12 +20,3 @@ dist-ssr
*.njsproj
*.sln
*.sw?
# Yarn 2+
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
+1 -1
View File
@@ -1 +1 @@
yarn check
pnpm check
Binary file not shown.
-873
View File
File diff suppressed because one or more lines are too long
-2
View File
@@ -1,2 +0,0 @@
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-3.5.1.cjs
+8 -8
View File
@@ -4,14 +4,14 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Commands
This project uses **Yarn 3 (Berry)** — pinned via `packageManager` in `package.json`. Use `yarn`, not `npm`.
This project uses **pnpm** — pinned via `packageManager` in `package.json` (enable it with `corepack enable`). Use `pnpm`, not `npm` or `yarn`.
- `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)
- `pnpm dev` — start the Vite dev server
- `pnpm build` — production build to `dist/`
- `pnpm preview` — serve the production build locally
- `pnpm 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.
`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
@@ -28,8 +28,8 @@ A single-page, statically-generated personal résumé site — no router, no bac
- Prefer `<script lang="ts">` with a typed props object for new components (see `components/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/vite` plugin and `@import "tailwindcss"` in `src/app.css`; customize through CSS, not a `tailwind.config.js`. `tailwind-merge` is 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>` in `index.html`.
- `checkJs` is on and `.js`/`.svelte` files are type-checked — keep JSDoc/types valid so `yarn check` passes.
- `checkJs` is on and `.js`/`.svelte` files are type-checked — keep JSDoc/types valid so `pnpm check` passes.
## Deploy
Pushing to `main` triggers the `deploy` workflow: `yarn build` → upload `dist/` → GitHub Pages (https://dankotowski.dev). Note CI uses Node 20, while local dev is pinned to Node 22.14.0 in `.tool-versions`.
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.
+1 -1
View File
@@ -23,7 +23,7 @@
"typescript": "^5.8.2",
"vite": "^6.2.4"
},
"packageManager": "[email protected]",
"packageManager": "[email protected]",
"dependencies": {
"tailwind-merge": "^3.1.0"
}
+1317
View File
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +1,5 @@
# esbuild ships its native binary via an optional dependency; its postinstall
# is only a launcher optimization. Allowed so pnpm 11 doesn't block install on
# the undecided build script.
allowBuilds:
esbuild: true
-2141
View File
File diff suppressed because it is too large Load Diff