Skip to content
PAC

Repositories

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.

What do you want to do

docheck out, in install orderread firstrun
run a node of your ownnothing -- install the cliINSTALL.mdthe install one-liner, which hands over to pac onboard
run one node from sourcepac-nodepac-node/README.mdjust demo
understand the designthis siteDesign, then sdk/README.md--
watch two nodes write a flowpac-node pac-plugins pac-network pac-flow-meta pac-ux, and jc-tee-vm beside thempac-flow-meta/README.md, devtools/README.mdMODEL=claude MODEL_ARG="-p --model sonnet" just dev, then just intent "..."
write a flowpac-node pac-plugins pac-network pac-router pac-ux, and a copy of pac-flow-templatepac-flow-template/README.md, then src/index.tsjust dev in your flow, just a1 api GET /flows/<id>/board
write an adapter -- a source, an operation, a transport, a package source, an executorpac-node pac-plugins; a flow lane's set to try it livepac-plugins/README.md, then the sibling adapter of the same kindpnpm check; then a lane's just dev and just a1 plugins add --package <name>
change the kernelpac-nodepac-node/README.md, CLAUDE.mdpnpm check, just demo
change the cli, the page, the mcp server, or the apppac-node pac-plugins pac-network pac-uxpac-ux/README.mdjust dev, just dev-two
host a directory or a registrypac-node pac-networkpac-network/README.mdjust up
run or change the boxjc-tee-vm alone -- npm, outside the constellationjc-tee-vm/README.mdTEE_MODE=mock PORT=3000 npm run server
fix cipac-cipac-ci/README.mdsmoke.yml by hand, then move constellation-v1

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 repositories

The node

repowhatneeds beside it
pac-nodethe 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 fornothing of PAC's
pac-pluginsevery 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 onlypac-node
pac-routerone flow service, ctx.router: a principal's sentence decided into an intent some flow declared, and started through that flow's own routepac-node pac-plugins pac-network

The network

repowhatneeds beside it
pac-networkwhat 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/)pac-node

The ux

repowhatneeds beside it
pac-uxthe clients of the control api: lib (@projectpac/client), onboard, cli (pac), mcp, web, desktop; install.sh and the INSTALL.md generated beside itpac-node pac-plugins for the gate; all nine for a desktop release, which packs them

The flows

repowhatneeds beside it
pac-flow-metathe 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 filepac-node pac-plugins pac-network
pac-flow-templatethe smallest complete flow, one file. Copy the repository to start your own; there is no generatorpac-node pac-plugins pac-network pac-router
pac-flow-skills, pac-flow-joint-search, pac-flow-objectsprior 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 templatesas the template

The box

repowhatneeds beside it
jc-tee-vmthe 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 pnpmnothing

Around it

repowhat
pac-designthis site
pac-websiteprojectpac.net
pac-cithe 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 pac
for 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.git
done
sh 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.