Thanks for your interest. This project is built to be hackable — every layer has a single responsibility and is independently testable.
pnpm install
pnpm build
pnpm testYou need Node 20.18.0 LTS (.nvmrc) and pnpm 9+.
packages/core— pure logic (Octokit clients, ingestion, scoring, classification, filters, cache, Zod schemas). No@actions/*imports allowed here; this package must stay framework-free so the CLI can ship with it.packages/renderers— Markdown (Eta), JSON Resume, PDF (React-PDF), SVG (Satori).packages/action— the Action entrypoint. Wires inputs →core→renderers→ outputs. Bundles via ncc intodist/index.js.packages/cli— Commander-based CLI, same engine.apps/docs— Starlight (Astro) docs site.examples/— dogfood configs.
- TypeScript strict +
noUncheckedIndexedAccess. Noany, no@ts-ignore. - Validate everything that crosses a boundary with Zod; the schema is the source of truth for types (
z.infer). - Biome handles linting and formatting. Run
pnpm lint/pnpm format. - Write tests with Vitest. Mock HTTP with MSW, never with stubbed fetch.
This project uses Changesets. When your change is user-visible, run:
pnpm changeset…and pick the appropriate bump. Release-please opens release PRs from main.
The Action entrypoint is bundled with @vercel/ncc to dist/index.js at the repo root. CI runs pnpm verify-dist and fails if dist/ is out of date relative to the source.
@vercel/ncc is intentionally excluded from Dependabot. Dependabot cannot
rebuild dist/index.js after bumping ncc, so its PRs would always trip the
bundle-presence gate. To update ncc:
pnpm --filter @portfoliocraft/action add -D @vercel/ncc@latestpnpm --filter @portfoliocraft/action build- Commit both
package.json/pnpm-lock.yamland the regenerateddist/. - Open a PR titled
chore(deps): bump @vercel/ncc to <version>.
The release workflow re-bundles on Linux before tagging, so the bundle that ships to the Marketplace is always deterministic regardless of the dev OS.
The Starlight site lives at apps/docs/ and ships with vercel.json for a
one-click Vercel deploy:
- Sign in to Vercel and Import the
AbdullahBakir97/PortfolioCraftrepo. - Set the Root Directory to
apps/docs. - Vercel auto-detects Astro and respects the
vercel.jsonbuild command. - (Optional) Set a custom domain like
portfoliocraft.dev.
The ignoreCommand in vercel.json skips deploys when the change doesn't
touch apps/docs/ or packages/ — keeps the daily Dependabot churn from
triggering pointless previews.
Please include:
- PortfolioCraft version (
v1.x.yor commit SHA). - Workflow excerpt that triggered the bug.
- Output of running locally with
--dry-run --explain. - Whether the GitHub user is public/private and approximate repo count.