docs/superpowers/worklogs/2026-05-14-monorepo-architecture-reorg.md
Append-only log for implementation, validation, and delegation notes.
Status note: This file is chronological. Earlier entries may mention paths that were moved by later tasks. Use the latest handoff plus
AGENTS.mdanddocs/contributing/architecture.mdxfor current-state guidance.
feat/explore-hono-orpc-migration.apps/server/package.jsonpackage.jsonpackages/api/package.jsonpackages/env/package.jsonpackages/utils/package.jsonpnpm-lock.yamldocs/superpowers/plans/2026-05-14-monorepo-architecture-reorg.mddocs/superpowers/handoffs/2026-05-14-monorepo-architecture-reorg.mddocs/superpowers/worklogs/2026-05-14-monorepo-architecture-reorg.mdpackages/resume as @reactive-resume/resume.packages/utils/src/resume/patch.ts to packages/resume/src/patch.ts.packages/utils/src/network-icons.ts to packages/resume/src/icons.ts.packages/resume/src.@reactive-resume/utils/resume/patch and @reactive-resume/utils/network-icons imports to @reactive-resume/resume/patch and @reactive-resume/resume/icons.pnpm-lock.yaml for the new package and consumer dependency edges.fast-json-patch from @reactive-resume/utils and @reactive-resume/ai; it now belongs to @reactive-resume/resume.@reactive-resume/schema from @reactive-resume/utils because DOCX files still import schema and Task 2 owns that extraction.pnpm --filter @reactive-resume/resume test failed before Vitest because pnpm wanted to refresh modules in a non-TTY.CI=true; it failed because the new workspace package was not yet represented in the frozen lockfile.pnpm install --lockfile-only --no-frozen-lockfile; completed with no downloads.node_modules had been purged and registry access was blocked by sandbox DNS (ENOTFOUND / fetch failed).pnpm install --no-frozen-lockfile with network approval to restore node_modules; completed.pnpm --filter @reactive-resume/resume test passed: 2 files, 43 tests.pnpm --filter @reactive-resume/resume typecheck passed.pnpm --filter @reactive-resume/ai typecheck passed.pnpm --filter @reactive-resume/api typecheck passed.pnpm --filter web typecheck passed.pnpm --filter @reactive-resume/db typecheck, pnpm --filter @reactive-resume/import typecheck, and pnpm --filter @reactive-resume/utils typecheck.pnpm exec biome check ... initially found import-order/type-import issues; pnpm exec biome check --write ... fixed 10 touched files.pnpm exec biome check ... passed afterward on the touched package/source/manifests.packages/db had a type-only manifest dependency on @reactive-resume/resume.StoredJsonPatchOperation type for JSONB column annotations in packages/db/src/schema/agent.ts.@reactive-resume/resume from packages/db/package.json and pnpm-lock.yaml.pnpm --filter @reactive-resume/db typecheck passed after the DB boundary correction.pnpm --filter @reactive-resume/api typecheck passed.pnpm --filter web typecheck passed.pnpm --filter @reactive-resume/resume test passed: 2 files, 43 tests.pnpm --filter @reactive-resume/resume typecheck passed.packages/docx as @reactive-resume/docx with source-consumed root export.packages/utils/src/resume/docx into packages/docx/src.buildDocx from @reactive-resume/docx.@reactive-resume/utils/resume/docx export.docx and @reactive-resume/schema from @reactive-resume/utils.@reactive-resume/docx as a web dependency.pnpm --filter @reactive-resume/docx test passed: 5 files, 46 tests.pnpm --filter @reactive-resume/docx typecheck passed.pnpm --filter @reactive-resume/utils typecheck passed.pnpm --filter web typecheck passed.packages/docx as @reactive-resume/docx with source-consumed root export "." -> "./src/index.ts".packages/utils/src/resume/docx/* to packages/docx/src/*, keeping the implementation and tests colocated.@reactive-resume/utils/resume/docx to @reactive-resume/docx.@reactive-resume/utils ./resume/docx export.docx and @reactive-resume/schema from @reactive-resume/utils; the new DOCX package owns those dependencies and depends on @reactive-resume/utils only for shared color parsing.@reactive-resume/docx as a web dependency and refreshed pnpm-lock.yaml.pnpm --filter @reactive-resume/docx test failed on pnpm's non-TTY dependency-status install guard.CI=true pnpm --filter @reactive-resume/docx test then failed because sandbox DNS blocked registry fetches while pnpm recreated node_modules.CI=true pnpm --filter @reactive-resume/docx test with network approval; passed: 5 files, 46 tests.pnpm --filter @reactive-resume/docx typecheck passed.pnpm --filter @reactive-resume/utils typecheck passed.pnpm --filter web typecheck passed.pnpm --filter web test -- 'src/routes/builder/$resumeId/-sidebar/right/sections/export.test.tsx' passed; Vitest reported 78 files and 430 tests.pnpm exec biome check --write ... passed on the moved DOCX package, touched web callers, and package manifests; no fixes were applied.packages/pdf/src/browser.tsx with createResumePdfBlob({ data, template, resolveSectionTitle }).packages/pdf/src/server.tsx with createResumePdfFile({ data, filename, template, resolveSectionTitle }).@reactive-resume/pdf/browser and @reactive-resume/pdf/server package exports.apps/web/src/libs/resume/pdf-document.tsx; the web wrapper now resolves localized section titles and delegates blob generation to @reactive-resume/pdf/browser.apps/web/src/libs/resume/pdf-document.server.tsx to delegate file generation to @reactive-resume/pdf/server after resolving localized section titles.apps/web/src/components/resume/preview.browser.tsx so the PDF.js canvas viewer remains in web but PDF blob generation goes through the web-local wrapper.apps/server/src/handlers/resume-pdf.tsx to reuse @reactive-resume/pdf/server and preserve the existing File response body flow.pnpm --filter @reactive-resume/pdf test -- src/browser.test.tsx src/server.test.tsx failed because packages/pdf/src/browser.tsx and packages/pdf/src/server.tsx did not exist.createElement while keeping requested .tsx filenames.pnpm --filter @reactive-resume/pdf test -- src/browser.test.tsx src/server.test.tsx passed; Vitest reported 17 files and 139 tests.useLocalizedResumeDocument generation path.apps/web/src/components/resume/preview.browser.test.tsx to mock/assert createResumePdfBlob.pnpm --filter web test -- src/components/resume/preview.browser.test.tsx passed; Vitest reported 78 files and 430 tests.pnpm --filter web test -- 'src/routes/builder/$resumeId/-sidebar/right/sections/export.test.tsx' 'src/routes/$username/-components/public-resume.test.tsx' 'src/routes/$username/-components/pdf-viewer.test.tsx' passed; Vitest reported 78 files and 430 tests.packages/mcp as @reactive-resume/mcp with source-consumed exports for the compact public surface and direct server-card/tool/prompt/resource subpaths.apps/web/src/routes/mcp/-helpers into packages/mcp/src, then removed the empty web MCP helper route directory.apps/server/src/handlers/mcp.ts and apps/server/src/handlers/metadata.ts to import from @reactive-resume/mcp, removing the app-to-app source imports from apps/server into apps/web.RouterClient; no HTTP RPC calls were introduced inside the server process.list_resumes, list_resume_tags, read_resume, get_resume_analysis, create_resume, import_resume, duplicate_resume, apply_resume_patch, update_resume, delete_resume, lock_resume, unlock_resume, and get_resume_statistics.reactive_resume_* aliases/instructions.packages/ai/src/tools/resume-tool-contracts.ts with the shared JSON Patch operations contract and reused it from packages/ai/src/tools/patch-resume.ts and MCP patch schemas.pnpm-lock.yaml; web no longer owns @modelcontextprotocol/sdk, and server now depends on @reactive-resume/mcp.pnpm --filter @reactive-resume/mcp test reported no matching package before creation.pnpm --filter @reactive-resume/mcp test hit pnpm's non-TTY dependency-status install guard.CI=true pnpm --filter @reactive-resume/mcp test then failed with a frozen-lockfile mismatch after moving dependencies.pnpm install --lockfile-only --no-frozen-lockfile; completed.CI=true pnpm --filter @reactive-resume/mcp test failed because sandbox DNS blocked registry fetches while pnpm restored node_modules.CI=true pnpm --filter @reactive-resume/mcp test with network approval; passed: 4 files, 29 tests.pnpm --filter @reactive-resume/mcp typecheck initially failed because the package type graph reaches API/auth TSX and tests had optional text access; fixed by enabling JSX in the package tsconfig and narrowing test content access.pnpm --filter @reactive-resume/mcp test, pnpm --filter @reactive-resume/mcp typecheck, pnpm --filter server typecheck, pnpm --filter @reactive-resume/ai typecheck, focused pnpm exec biome check ..., and rg -n "\\.\\./\\.\\./\\.\\./web/src|apps/web/src|web/src/routes/mcp" apps/server/src packages/mcp/src.pnpm exec biome check ... import/format issues in touched PDF/web files and type errors around the React element type passed into pdf(...) and renderToBuffer(...).Parameters<typeof pdf>[0] and Parameters<typeof renderToBuffer>[0].pnpm exec biome check --write ...; Biome fixed 4 touched files.pnpm --filter @reactive-resume/pdf test passed: 17 files, 139 tests.pnpm --filter @reactive-resume/pdf typecheck passed.pnpm --filter web typecheck passed.pnpm --filter server typecheck passed.pnpm exec biome check packages/pdf/src/browser.tsx packages/pdf/src/server.tsx packages/pdf/src/browser.test.tsx packages/pdf/src/server.test.tsx packages/pdf/package.json apps/web/src/libs/resume/pdf-document.tsx apps/web/src/libs/resume/pdf-document.server.tsx apps/web/src/components/resume/preview.browser.tsx apps/web/src/components/resume/preview.browser.test.tsx apps/server/src/handlers/resume-pdf.tsx docs/superpowers/plans/2026-05-14-monorepo-architecture-reorg.md docs/superpowers/worklogs/2026-05-14-monorepo-architecture-reorg.md docs/superpowers/handoffs/2026-05-14-monorepo-architecture-reorg.md passed.pnpm --filter web test -- src/components/resume/preview.browser.test.tsx passed; Vitest reported 78 files and 430 tests.pnpm --filter web test -- 'src/routes/builder/$resumeId/-sidebar/right/sections/export.test.tsx' 'src/routes/$username/-components/public-resume.test.tsx' 'src/routes/$username/-components/pdf-viewer.test.tsx' passed; Vitest reported 78 files and 430 tests.tailor_resume prompt.docs/guides/using-the-mcp-server.mdx to document canonical tool names such as list_resumes, read_resume, and apply_resume_patch, and removed tailor_resume.packages/mcp/src/tool-annotations.test.ts.rg "reactive_resume_|tailor_resume|web/src/routes/mcp|apps/web/src|\\.\\./\\.\\./\\.\\./web" apps/server packages/mcp packages/ai/src docs/guides/using-the-mcp-server.mdx -n; no matches.pnpm --filter @reactive-resume/mcp test, pnpm --filter @reactive-resume/mcp typecheck, pnpm --filter server typecheck, pnpm --filter @reactive-resume/ai typecheck, and focused pnpm exec biome check ...; all passed.packages/api/src/routers/* and packages/api/src/services/*.AGENTS.md so the normative guidance now points API work at packages/api/src/features/* and documents the new resume, docx, pdf, and mcp package ownership boundaries.pnpm --filter @reactive-resume/api test: 19 files, 155 tests passed.pnpm --filter @reactive-resume/api typecheck, pnpm --filter server typecheck, and pnpm --filter web typecheck; all passed.pnpm exec biome check ... on AGENTS.md, API/server/web touchpoints, and coordination docs; passed.ssr: "data-only" setting and the builder preview route missing ssr: false.ssr: "data-only" in apps/web/src/routes/$username/$slug.tsx.ssr: false in apps/web/src/routes/builder/$resumeId/index.tsx.AGENTS.md and the handoff notes to point browser-only resume preview/public viewer code at apps/web/src/features/resume/* instead of the removed components/resume and libs/resume paths.packages/api/src/features/*.features/agent, with procedure modules for threads, messages, attachments, and actions, run-state in runs, tool construction in tools, and remaining shared runtime orchestration in service.ts.features/agent/service.ts still contains shared thread/message/action orchestration because the run lifecycle, message persistence, attachment linking, and patch transaction helpers are tightly coupled; splitting that service body further should be a dedicated follow-up with behavior-specific tests.features/resume, with procedure modules for crud, tags, statistics, analysis, event-router, sharing, and export; access helpers and event publication moved under the same feature.features/resume/service.ts remains the DB-backed facade for shared transaction helpers, update notifications, access/statistics coupling, and storage cleanup. The public procedure surface is capability-split, and further DB-service extraction should preserve the existing transaction and event behavior.apps/server/src/handlers/resume-pdf.tsx into packages/api/src/features/resume/export.ts; it now calls @reactive-resume/pdf/server../services/* and ./helpers/* wildcard exports../features/storage, ./features/resume, ./features/resume/export, and ./features/flags.apps/server to import storage/PDF runtime surfaces from explicit API feature exports.apps/web to keep API imports type-only, including the FeatureFlags type from @reactive-resume/api/features/flags.@reactive-resume/pdf as an API package dependency and refreshed pnpm-lock.yaml.pnpm --filter @reactive-resume/api typecheck failed because pnpm attempted a non-TTY dependency-status install after package metadata changes.CI=true; sandbox DNS blocked registry fetches while rebuilding node_modules.CI=true pnpm --filter @reactive-resume/api typecheck with network approval; dependency restoration completed and the first compiler pass found moved import paths that needed correction.pnpm --filter @reactive-resume/api test initially failed because the moved agent service test mocked the new ./service module instead of its relocated AI/resume dependencies; fixed the mocks.pnpm --filter @reactive-resume/api test, pnpm --filter @reactive-resume/api typecheck, pnpm --filter server typecheck, pnpm --filter web typecheck, and pnpm --filter @reactive-resume/mcp typecheck.pnpm exec biome check --write ... fixed 7 touched API files.@reactive-resume/api/services/* or @reactive-resume/api/helpers/* imports outside packages/api, no internal ../services or ../helpers imports, and no ./services/* or ./helpers/* wildcard exports in packages/api/package.json.apps/server/src into runtime adapter areas: http, rpc, mcp, openapi, static, and startup.apps/server/src/http/app.ts and kept apps/server/src/index.ts as the process entrypoint that runs startup checks and starts Hono.http/headers.ts, auth and health HTTP handlers to http, oRPC request handling and locale extraction to rpc, MCP auth/server setup/transport handling to mcp, OpenAPI and well-known metadata to openapi, uploads/schema/web-dist serving to static, and migrations/local-storage lifecycle checks to startup.index.ts, including serving apps/web/dist.@reactive-resume/api/routers, @reactive-resume/api/features/storage, and @reactive-resume/api/features/resume/export.pnpm --filter server test passed: 1 file, 1 test.pnpm --filter server typecheck passed.pnpm --filter server test passed: 1 file, 1 test.pnpm --filter server test passed: 1 file, 1 test.pnpm --filter server typecheck passed.pnpm --filter @reactive-resume/api typecheck passed.pnpm exec biome check apps/server/src docs/superpowers/plans/2026-05-14-monorepo-architecture-reorg.md docs/superpowers/worklogs/2026-05-14-monorepo-architecture-reorg.md docs/superpowers/handoffs/2026-05-14-monorepo-architecture-reorg.md initially found import-order issues in apps/server/src/http/app.ts and apps/server/src/mcp/handler.ts; after manual import ordering fixes, the same command passed.rg -n "apps/web/src|from ['\"][^'\"]*web/src|@reactive-resume/api/services/" apps/server/src returned no matches.rg -n "@reactive-resume/api/services/" apps/server packages/api apps/web packages returned no matches.rg -n "from ['\"][^'\"]*apps/web/src|from ['\"][^'\"]*web/src|apps/web/src" apps/server returned no matches.apps/web/src/components/resume/builder-resume-draft.ts to apps/web/src/features/resume/builder/draft.ts and updated builder/dialog consumers to import the feature-owned draft store directly.apps/web/src/components/resume to apps/web/src/features/resume/preview, including preview.tsx, preview.browser.tsx, preview.shared.tsx, pdf-canvas.tsx, and preview shared tests.features/resume/preview/resume-thumbnail.shared.ts and moved PDF.js thumbnail rendering into features/resume/preview/pdf-thumbnail.ts, so direct pdfjs-dist usage stays under features/resume.apps/web/src/libs/resume/pdf-document*.tsx to apps/web/src/features/resume/export/pdf-document*.tsx; the wrappers still resolve localized section titles in web and call @reactive-resume/pdf/browser or @reactive-resume/pdf/server.apps/web/src/routes/$username/-components to apps/web/src/features/resume/public, including public-resume.tsx, pdf-viewer.tsx, pdf-viewer.css, and their tests.features/resume/public/public-resume while preserving its loader, redirects, metadata, and route settings.apps/web/src/components/resume and apps/web/src/routes/$username/-components directories.apps/web/src/features/command-palette.apps/web/src/features/theme.apps/web/src/features/locale.apps/web/src/features/user.apps/web/src/features/auth; auth route files now keep route guards/search validation and compose feature pages.apps/web/src/features/settings; settings route files now keep dashboard headers and compose feature pages.apps/web/src/routes/dashboard/settings/job-search.tsx route-only because it is already a redirect shim.pnpm --filter web test -- src/features/command-palette src/features/theme src/features/locale passed; Vitest reported 74 files and 402 tests.pnpm --filter web typecheck passed.rg -n "@/components/(command-palette|theme|locale|user)" apps/web/src and rg -n "components/(command-palette|theme|locale|user)" apps/web/src returned no matches.apps/web/src/dialogs/{auth,api-key,resume}/schema.ts and composed them through apps/web/src/dialogs/schemas.ts.apps/web/src/dialogs/{auth,api-key,resume}/registry.tsx, with shared renderer helper types in apps/web/src/dialogs/renderer-registry.ts.apps/web/src/dialogs/store.ts to the single global dialog runtime/store while preserving typed openDialog(type, data) and DialogProps<T> exports.apps/web/src/dialogs/manager.tsx to render via composed registries instead of directly importing all auth/API-key/resume dialog components.pnpm --filter web test -- src/dialogs/store.test.ts failed because ./schemas did not exist.pnpm --filter web test -- src/dialogs/store.test.ts passed after the registry implementation.pnpm --filter web typecheck found renderer-entry variance errors; fixed by typing renderer entries as an existential union of concrete dialog renderers.pnpm --filter web typecheck passed after the renderer type fix.pnpm --filter web test -- src/dialogs/store.test.ts src/dialogs/resume/template/data.test.ts src/dialogs/resume/template/gallery.test.tsx passed; Vitest reported 74 files and 403 tests.pnpm --filter web typecheck passed.pnpm --filter web test -- src/dialogs/store.test.ts src/dialogs/resume/template/data.test.ts src/dialogs/resume/template/gallery.test.tsx passed; Vitest reported 74 files and 403 tests.pnpm exec biome check ... passed on the touched dialog registry/store/manager files and Task 8 coordination docs; Biome checked 12 TypeScript files and ignored Markdown.rg -n "ts-pattern|Create[A-Za-z]+Dialog|Update[A-Za-z]+Dialog|TemplateGalleryDialog|from \"\\./(api-key|auth|resume)" apps/web/src/dialogs/manager.tsx returned no matches.rg -n "@reactive-resume/schema/resume/data|awardItemSchema|certificationItemSchema|coverLetterItemSchema|customSectionSchema|educationItemSchema|experienceItemSchema|interestItemSchema|languageItemSchema|profileItemSchema|projectItemSchema|publicationItemSchema|referenceItemSchema|skillItemSchema|summaryItemSchema|volunteerItemSchema|z\\.object\\(\\{ type" apps/web/src/dialogs/store.ts returned no matches.pnpm exec turbo --version: 2.9.12pnpm exec biome --version: 2.4.15node_modules/.pnpm/[email protected]/node_modules/turbo/schema.json includes root boundaries, dependencies, dependents, implicitDependencies, and workspace tags.node_modules/@biomejs/biome/configuration_schema.json confirm local .grit plugins can be loaded through biome.json plugins.turbo.json with executable boundaries:
web and server, preventing package-to-app and app-to-app imports.vitest, @testing-library/jest-dom, @testing-library/react, and @testing-library/user-event so test imports do not require duplicating root test devDependencies in every workspace package.turbo.json files with extends: ["//"] and boundary tags for both apps and all packages.@boundaries-ignore root shared Vitest config to every workspace vitest.config.ts import of ../../vitest.shared; this is the only allowed cross-package source import left for the shared root test config.biome.json with style.noRestrictedImports patterns for:
@reactive-resume/*/src/**apps/**packages/**tooling/grit/no-cross-workspace-src-imports.grit and registered it in biome.json as a second layer for import/export/dynamic import sources that reference another workspace's src tree.@reactive-resume/ui/* -> ../../packages/ui/src/* path alias from apps/web/tsconfig.json; web now relies on the UI package export map.turbo.jsonapps/server/turbo.jsonapps/web/turbo.jsonapps/web/tsconfig.jsonbiome.jsontooling/grit/no-cross-workspace-src-imports.gritapps/server/vitest.config.tsapps/web/vitest.config.tspackages/ai/turbo.jsonpackages/ai/vitest.config.tspackages/api/turbo.jsonpackages/api/vitest.config.tspackages/auth/turbo.jsonpackages/auth/vitest.config.tspackages/config/turbo.jsonpackages/config/vitest.config.tspackages/db/turbo.jsonpackages/db/vitest.config.tspackages/docx/turbo.jsonpackages/docx/vitest.config.tspackages/email/turbo.jsonpackages/email/vitest.config.tspackages/env/turbo.jsonpackages/env/vitest.config.tspackages/fonts/turbo.jsonpackages/fonts/vitest.config.tspackages/import/turbo.jsonpackages/import/vitest.config.tspackages/mcp/turbo.jsonpackages/mcp/vitest.config.tspackages/pdf/turbo.jsonpackages/pdf/vitest.config.tspackages/resume/turbo.jsonpackages/resume/vitest.config.tspackages/runtime-externals/turbo.jsonpackages/schema/turbo.jsonpackages/schema/vitest.config.tspackages/scripts/turbo.jsonpackages/ui/turbo.jsonpackages/ui/vitest.config.tspackages/utils/turbo.jsonpackages/utils/vitest.config.tsdocs/superpowers/worklogs/2026-05-14-monorepo-architecture-reorg.mddocs/superpowers/handoffs/2026-05-14-monorepo-architecture-reorg.mdpnpm exec turbo boundaries failed with 321 issues before configuration, mostly undeclared root test-tool imports and shared root Vitest config imports.pnpm exec turbo boundaries passed after adding implicit dependencies and the Vitest config boundary-ignore comments.pnpm exec turbo boundaries passed: checked 660 files in 20 packages, no issues found.pnpm exec biome check biome.json turbo.json tooling/grit/no-cross-workspace-src-imports.grit apps/web/tsconfig.json apps/server/turbo.json apps/web/turbo.json packages/*/turbo.json passed: checked 24 files, no fixes applied.pnpm --filter web typecheck passed.pnpm --filter @reactive-resume/api typecheck passed.pnpm --filter server typecheck passed.noRestrictedImports, manual scans, and the removal of the web-to-UI source alias.vitest.shared import remains intentionally ignored in workspace Vitest configs. Moving that helper into a package would remove the ignore comments but would be a broader test-infra reorg.AGENTS.md with executable boundary rules, package-role/runtime tags, a placement decision tree, and the pnpm exec turbo boundaries validation command.docs/contributing/architecture.mdx, which still described an old single-src layout, with the current monorepo runtime map, workspace ownership table, boundary rules, feature placement guide, API layout, PDF/DOCX boundaries, and MCP boundary.docs/adr/0001-workspace-boundaries.md with the accepted decision, context, consequences, and rejected alternatives.docs/guides/ai-agent-tools.mdx already documents the canonical read_resume and apply_resume_patch tool names.AGENTS.md, the architecture guide, the ADR, turbo.json, workspace turbo.json tags, and biome.json are the source of truth.rg -n "src/integrations|src/components/resume|packages/api/src/services|packages/api/src/helpers|reactive_resume_|tailor_resume|Radix UI|ORPC" AGENTS.md docs/contributing/architecture.mdx docs/adr/0001-workspace-boundaries.md docs/guides/using-the-mcp-server.mdx docs/guides/ai-agent-tools.mdx returned only the expected ORPCClient labels in the architecture mermaid diagram.pnpm exec biome check AGENTS.md docs/contributing/architecture.mdx docs/adr/0001-workspace-boundaries.md docs/superpowers/plans/2026-05-14-monorepo-architecture-reorg.md docs/superpowers/worklogs/2026-05-14-monorepo-architecture-reorg.md docs/superpowers/handoffs/2026-05-14-monorepo-architecture-reorg.md did not process files because this Biome config ignores Markdown/MDX; there is no dedicated docs check script in package.json.pnpm install --lockfile-only; first pass was already up to date, and a later pass updated pnpm-lock.yaml after removing stale app dependencies.pnpm install after manifest cleanup so pnpm's dependency-status check would stop trying to purge modules from non-TTY subcommands.pnpm knip findings:
apps/web/src/features/resume/export/pdf-document.server.tsx.apps/server/package.json and apps/web/package.json.pdfExportRateLimit to downloadResumePdfProcedure.pnpm knip now exits successfully with only the existing configuration hint: src/server.ts apps/web knip.json Refine entry pattern (no matches).pnpm install --lockfile-only passed.pnpm exec biome check . passed: 756 files checked, no fixes applied.pnpm exec turbo boundaries passed: 659 files checked in 20 packages, no issues found.pnpm knip passed with one configuration hint and no unused files/dependencies/exports.pnpm typecheck passed: 18 successful tasks.pnpm test passed: 18 successful tasks; notable totals include web 74 files/403 tests, UI 42 files/421 tests, API 19 files/155 tests, PDF 17 files/139 tests.pnpm build passed: web and server builds completed.