PAC is a set of sibling git repositories under one parent directory, and they find each other by relative path. pac-node is the root: every other checkout resolves cordis through it (overrides in each pnpm-workspace.yaml), so pac-node installs first and the rest follow the order written in install-constellation.sh. Nobody needs all of them; the first table says which subset each job wants. This page is a map, and each repository's README is the reference, so it is linked rather than restated.
pac-ux is in the flow rows because every flow lane runs the cli from source (node ../pac-ux/cli/src/main.ts). A flow's own ci does not need it, because its suites do not.
the kernel: sdk/ (what a plugin compiles against), lib/, the eight core plugins under core/, daemon/, worker/, testing/. core/data is a stub that mounts and does nothing; its README says what it is for
every installable plugin that is not a flow, at adapters/<core module>/<seam>/<name>; the flow services under flow-services/; lib/ (@projectpac/plugin-lib, the contracts adapters implement); flow-devkit/ (the lane scripts and fixtures the flow repositories share). No justfile: pnpm check only
what the project hosts so a node does not have to: the node directory (services/node-directory/, the server and the plugin a node installs to reach it) and the plugin registry (services/plugin-registry/)
the flow a joined node runs: state an intent, and the two nodes' agents negotiate a design, then the package that implements it, which both install and run. src/library/pac.d.ts is the surface of a node as one file
prior art: a method one node holds run for another; a question neither side's data answers alone; an agreed action over objects each side owns (parked -- it needs an object daemon nothing here ships). Hand-written flows of the kind meta now negotiates; read them for how a negotiation is scripted, not as templates
the joint-computation box: an attested runtime that runs a program every party approved, once, over inputs only it decrypts, and hands each party its own output. Server and client sdk; runners wasm, python, dobj; TEE_MODE from mock to real hardware. Outside the node, and npm rather than pnpm
the composite action that lays the constellation out as siblings in ci, and the install script behind it. Not part of the constellation: not installed, not versioned with it, not in the registry
Getting the constellation
Tools: Node 24 -- .nvmrc in every repository, so nvm use reads it; use that major, because better-sqlite3 is compiled against the Node ABI at install and a newer Node fails every suite that opens a database with a NODE_MODULE_VERSION mismatch that reads like a broken change and is not one. pnpm 11.21.0, the packageManager in every manifest (npm i -g pnpm@11.21.0). just; mprocs for every just dev (brew install mprocs); git; curl. jc-tee-vm is npm, not pnpm.
mkdir pac && cd pacfor r in pac-node pac-plugins pac-network pac-router pac-flow-template pac-flow-meta pac-ux pac-ci jc-tee-vm; do git clone git@github.com:project-pac/$r.gitdonesh pac-ci/constellation/install-constellation.sh pac-node pac-plugins pac-network pac-router pac-flow-template pac-flow-meta pac-ux(cd jc-tee-vm && npm install)
pac-node installs first, and the rest in the order install-constellation.sh has them: every other checkout resolves cordis through pac-node (overrides in its pnpm-workspace.yaml), because the Context/Events declaration merge only adds up when every checkout resolves the same copy, and a repository installed before pac-node fails with two copies of the same class. The script runs on a laptop as it does in ci. Name the repositories you cloned and it orders them, refuses a set whose link:s point outside it, and installs each with --frozen-lockfile; it never clones, and with no arguments it wants all ten present. By hand: pnpm install in each, in that order.
The rule those manifests follow: a runtime dependency on a sibling names a published version -- "@projectpac/sdk": "0.6.0" -- redirected to the checkout by an overrides entry, because a link: survives pnpm pack verbatim and a package declaring one cannot be published; a devDependency is a link: path. A value imported at runtime is a dependency, full stop: a link: resolves anything in a checkout and fails on a node that installed from a registry.
From there, each repository's README says how its lane runs and each AGENTS.md (CLAUDE.md is a symlink to it) says what trips people up; pnpm check is the gate everywhere and what ci runs. In ci, every repository but pac-node lays its siblings out with project-pac/pac-ci/constellation and a needs list that is its hand-written transitive closure.