Performance Review Manager — a local, single-user ("solo EM") pnpm monorepo. See README.md and /docs for product context.
@prm/api(apps/api) — Hono + better-sqlite3 backend onhttp://127.0.0.1:8787. Run withpnpm dev:api(usestsx watch, no strict typecheck).@prm/ui(apps/ui) — React + Vite frontend onhttp://localhost:5173, proxies/api→ the API. Run withpnpm dev:ui.pnpm devruns both in parallel — this is the primary dev entrypoint.@prm/desktop(apps/desktop) — Tauri shell.desktop:dev/desktop:buildneed Rust + system WebView libraries and are not validated in the headless cloud VM. Packaged desktop installers run via Actions → Desktop Installers → Run workflow (not on every merge; defaults to Windows + Linux). Formal GitHub Releases (with installers attached) use Actions → Release → Run workflow.
- This repo requires pnpm 10.33.3. The VM's default corepack resolves pnpm 11, which (a) rejects this committed lockfile via a
minimumReleaseAgesupply-chain policy and (b) ignores thepnpm.onlyBuiltDependenciesfield inpackage.jsonthat is needed to build thebetter-sqlite3native module. The update script pins 10.33.3 viacorepack prepare pnpm@10.33.3 --activate; keep using pnpm 10.x. If nativebetter-sqlite3is missing, runpnpm rebuild better-sqlite3.
- Local data lives in
/workspace/data(gitignored): SQLite DB, encrypted vault, uploaded files. Delete it to reset to a clean state (stop the API first, since it holds the DB handle), or use Delete workspace in Settings / Erase workspace on Unlock (password + typeDELETE). - First app load offers Empty workspace or Demo team (seeds an 8-person org). After init it shows "Unlock". Default demo password:
workbench. - Locking the workspace ("Lock & encrypt") seals the SQLite DB + files to
.encat rest; unlocking decrypts them. - After erase, the create flow returns so you can start a new empty or demo workspace.
.sessionstores the auth token only (not the AES key). After an API process restart you must unlock again even if the UI still has a token.
pnpm build(production) may still fail on residual packaging issues; preferpnpm -r typecheck+pnpm testas the merge gate. Dev servers (tsx/vite) run fine because they do not strict-typecheck.- Core loop evaluation & capture gaps:
docs/CORE_LOOP_EVAL.md.
- Stdio MCP for bulk-loading dossier evidence into the local API:
pnpm mcp(orpnpm --filter @prm/mcp start). - Requires API on
127.0.0.1:8787. Unlock viaprm_unlockor setPRM_PASSWORDto the workspace password — there is no built-in demo default (demo vaults often useworkbench, but never assume that for real data). - Setup example:
.cursor/mcp.json.exampleandpackages/mcp/README.md. - Typical flow with other MCPs (Jira/Google): fetch externally →
prm_bulk_load_evidence/prm_upload_documenthere.