pithy-games adds a game team to the pithy plugin. Game design, a Unity client, and playtests with simulated players, built on Pithy’s game capabilities — auth, multiplayer, matchmaking, leaderboard, rating and ledger — and on the socket contract every engine plays against.
Install it
You need the pithy CLI first, from Install. Then, inside Claude Code:
/plugin marketplace add pithy-sh/pithy#release
/plugin install pithy-games@pithypithy-games depends on pithy, so installing it installs pithy with it. Both carry the pithy CLI’s version, so they always match. #release is deliberate, for the reason the base plugin’s page gives, and the release branch caveat there applies here too.
Install from one source. pithy-games@pithy brings pithy@pithy. If pithy@synced, from Anthropic’s plugin directory, is installed as well, every pithy agent and skill appears twice. Remove one.
The team
It reuses the base team — pithy:server, pithy:client-web, pithy:client-mobile and pithy:runner — and adds one agent. A web game is pithy:client-web as it is. A React Native game is pithy:client-mobile.
| Agent | Default | Job |
|---|---|---|
client-unity | Sonnet, medium | The Unity client in C#. Generates the HTTP layer from openapi.json, writes the socket layer against asyncapi.json, and knows IL2CPP stripping and WebGL. Compiling is yours, in your own Unity project |
Unity is the same work done by hand: the generator, its pinned version, and the command.
Choose its model
client_unity_model and client_unity_effort are this plugin’s settings, with the defaults above. Change them with /plugin, or from a shell:
echo '{"client_unity_model": "opus", "client_unity_effort": "high"}' | claude plugin configure pithy-games@pithy --values-stdinA plugin’s settings reach only its own skills. So the base team’s — server_model, runner_model and the rest — stay pithy’s, set on pithy@pithy, and /new-game brings that team in through pithy’s own /new-app so they apply. /playtest dispatches the runner on its own default, Haiku at low effort.
The skills
/new-game is /new-app with a game’s capabilities and a Unity target. It asks which clients play — web, mobile, Unity — runs /app-design and /game-design, scaffolds through /new-app, has the server agent add the capabilities the design calls for, and dispatches client-unity once the contract exists. A Unity client is an API client, like a mobile app, so a Unity-only game is pithy init --target mobile with no mobile agent.
/game-design settles what the server is the authority for, what the room holds, the game’s action and view schemas, and anti-cheat, before any code. It runs in the main session, because those are the decisions a cheaper model should not make.
/playtest has pithy:runner sign in simulated players against pithy dev, join them to one room, play the moves the design implies, and return a summary: per move, which players got a state or the refusal’s code, then the final phase and outcome. Its script runs on Node 22.18 or later.
A gap in the kit is filed with the base plugin’s /report-kit-gap.
The agents build against both documents
pithy contract writes openapi.json, and asyncapi.json beside it for a Worker that serves a socket, with each game’s <gameKey>.action and <gameKey>.view schemas in it. The server agent keeps both current. client-unity generates from the first and writes its socket against the second, so it never guesses a route or a frame.