Turns out #shadowcljs expects all dependencies to be at the root of node_modules, so pnpm's thing where it doesn't symlink transitive deps to node_modules breaks stuff.
The solution is to put a .npmrc file in your project root that contains "shamefully-hoist=true" (lol)
That's an hour of my life I'm never getting back

