pitroom 0.6.4 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pitroom",
3
3
  "description": "A free pit crew for your expensive coding agent: the superpowers development workflow, run by cheap workers. Delegate research, fixes, tests, reviews and whole plans from Claude Code, Codex or any agent to OpenCode, Codex or Claude Code workers, with receipts that prove the savings.",
4
- "version": "0.6.4",
4
+ "version": "0.6.5",
5
5
  "author": {
6
6
  "name": "TahaAtas"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pitroom",
3
- "version": "0.6.4",
3
+ "version": "0.6.5",
4
4
  "description": "A free pit crew for your expensive coding agent: delegate research, fixes, tests, reviews and parallel investigations to cheap worker agents running your own models, with verified answers, exact diffs and cost receipts.",
5
5
  "author": {
6
6
  "name": "TahaAtas"
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.5
4
+
5
+ ### Models, costs and effort
6
+ - `pitroom models [worker] [--all] [--json]` lists what Codex (from its model cache), Claude Code (aliases) and OpenCode (`opencode models`) offer, the effort levels each model accepts, your costs and what your own runs used (runs, average tokens, reported dollars).
7
+ - Config `costs` (`{"codex:gpt-6-sol": 1, "codex:gpt-6.1-sol": 2}`): your relative cost per model. Pitroom cannot know vendor prices, so it does not guess them; `pitroom doctor` prints the cost of the models in use and notes a cheaper one you priced.
8
+ - `--effort LEVEL` for every worker (`model#level`: Codex effort, Claude Code `--effort`, OpenCode variant). The skills tell the agent to pick the cheapest model and the lowest effort that fits.
9
+ - Fix: a target that names only an effort (`codex:#low`) skipped the configured `models` default and ran the vendor's own default model. It now gets the configured model with that effort. A Codex or Claude Code worker with no pinned model gets a warning.
10
+
11
+ ### More workers, free first
12
+ - Up to 20 workers run at once by default (`maxParallel`), 30 at most; before, the default was 4. The rest queue and the fallback chain absorbs free-tier rate limits.
13
+ - An optional `review` tier in `tiers` names who reviews a run (and needs no same-backend warning). The skills start on the `cheap` tier, OpenCode's free model, and raise a task only when it needs more; plans are written the same way.
14
+
15
+ ### Project files
16
+ - `THIRD_PARTY_NOTICES.md` carries the MIT notice of superpowers, which the workflow skills are adapted from, and ships in the npm package; the README stays clean and links to it.
17
+ - `CODE_OF_CONDUCT.md`, issue forms (bug report, feature request), a pull request template and a contact-link page for security reports.
18
+ - `npm run bump -- patch|minor|major|X.Y.Z` moves the version in `package.json`, `package-lock.json` (which still said 0.1.0) and both plugin manifests together and adds a CHANGELOG heading; a test fails while any file disagrees or the new CHANGELOG heading still has its placeholder text.
19
+
20
+ ### README
21
+ - The workflow and the architecture are SVG diagrams (they render on GitHub and on npm, unlike mermaid). The speed gain is stated with measured numbers: 470 s of worker time in 156 s of wall clock.
22
+ - Install commands per agent as copy-and-paste blocks (Claude Code, Codex, npm), with update and uninstall; diagrams for the workflow and for how a run flows; the free-first setup, `pitroom models`, costs and effort are explained; the hard-coded version line is gone (the badges show the real versions).
23
+
24
+ ### Seeing Pitroom at work
25
+ - The card hook also reaches the agent (`additionalContext`), so the user hears which worker and model ran even where the host shows no hook messages. Runs that finished without a card are announced on the next `pitroom` command.
26
+ - `pitroom savings --models` lists workers and models with runs, tokens, cost and savings.
27
+
3
28
  ## 0.6.4
4
29
 
5
30
  ### Deleting is the user's call
package/PRIVACY.md CHANGED
@@ -2,29 +2,45 @@
2
2
 
3
3
  _Last updated: 2026-09-30_
4
4
 
5
- Pitroom is a command-line tool and a set of agent skills that run on your own computer. This page says what it does with your data.
5
+ Pitroom is a command-line tool and a set of agent skills that run on your own computer. This page says what data is involved, what for, who receives it, how long it is kept and what you can do about it.
6
6
 
7
7
  ## What the Pitroom authors collect
8
8
 
9
9
  Nothing. Pitroom has no accounts, no analytics and no telemetry, and its own code makes no network requests. No data is sent to the authors.
10
10
 
11
- ## What happens when you delegate work
11
+ ## Data categories and purposes
12
12
 
13
- Pitroom starts a worker agent CLI that you installed and signed in to yourself. Whatever you ask a worker to do is handled by that CLI and by the model provider behind it:
13
+ When you delegate work, Pitroom handles these categories of data, only to carry out that work:
14
14
 
15
- - the task text you or your agent write;
16
- - the files the worker reads in your project;
17
- - for reviews, the diff under review with 10 lines of context, written to a package file the reviewer reads.
15
+ | Data | Purpose |
16
+ |---|---|
17
+ | The task text you or your agent write | Tell the worker what to do |
18
+ | Files of your project that the worker reads, and its edits | Let the worker do the task; return an exact diff |
19
+ | For reviews, the diff under review with 10 lines of context | Let a second worker review the change |
20
+ | Run records: the task, the worker's answer, diffs, timings | Let your agent and you read results, apply or undo them |
21
+ | Savings ledger: token counts, cost estimates, worker and model names per run (no task text, no code) | Show what delegating saved |
22
+ | Settings you choose (`~/.config/pitroom/config.json`) | Remember your worker, models and tiers |
18
23
 
19
- That data goes to the provider of the worker's model, under that provider's terms and privacy policy, not under this one. Pitroom does not filter the content it hands to a worker: secrets that are committed to a reviewed range are sent as they are. Workers cannot read `.env` files or private key files through Pitroom's permission profiles. To keep code on your machine, point the worker at a local model.
24
+ Project files may contain personal data of yours or of third parties; Pitroom does not look for it, filter it or add to it.
20
25
 
21
- ## What Pitroom stores on your computer
26
+ ## Recipients
22
27
 
23
- - Run records (the task, the worker's answer, diffs, receipts and the savings ledger) in `~/.local/state/pitroom`, or in the folder named by `PITROOM_HOME`.
24
- - Optional settings in `~/.config/pitroom/config.json`.
25
- - Private working copies of your project for isolated runs, inside the state folder. They are removed when you apply or discard a run.
28
+ Pitroom starts a worker agent CLI that you installed and signed in to yourself. The task text, the files it reads and, for reviews, the diff go to that CLI and to the provider of the worker's model, under that provider's terms and privacy policy, not under this one. Pitroom does not filter this content: secrets committed in a reviewed range are sent as they are. The file-reading tools of OpenCode and Claude Code workers refuse `.env` files and private keys, but Codex workers are not restricted that way and a shell command can still read such files, so keep secrets out of the project folder you delegate in. To keep code on your machine, point the worker at a local model. Nobody else receives data from Pitroom.
26
29
 
27
- Nothing is stored in your repository. To delete the records, run `pitroom clean` or remove the state folder.
30
+ ## Where data is stored and for how long
31
+
32
+ - Run records and the savings ledger: `~/.local/state/pitroom`, or the folder named by `PITROOM_HOME`. Pitroom never deletes them by itself: they stay until you remove them.
33
+ - Private working copies of your project for isolated runs: inside the same folder, removed when you apply or discard the run.
34
+ - Settings: `~/.config/pitroom/config.json`, until you delete it.
35
+
36
+ Nothing is stored in your repository.
37
+
38
+ ## Your controls
39
+
40
+ - `pitroom clean --yes` removes run records older than 14 days (change it with `--days N`); unapplied isolated patches are kept, and so is the savings ledger.
41
+ - Delete the state folder to remove everything, including the ledger; delete the settings file to reset your settings.
42
+ - `pitroom discard <run>` removes a run's private working copy.
43
+ - You choose which worker CLI and model receive your data (`-W`, `config`), and whether a worker may use the web (`--web`, off by default).
28
44
 
29
45
  ## Changes and contact
30
46
 
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### A free pit crew for your expensive coding agent
6
6
 
7
- **Send the reading, fixes, tests and reviews to cheap workers. Keep the decisions.**
7
+ **Cheaper and faster: hand the reading, fixes, tests and reviews to workers that run in parallel. Keep the decisions.**
8
8
 
9
9
  Model-agnostic · Verified answers · Receipts, not vibes · OpenCode / Codex / Claude Code workers
10
10
 
@@ -20,10 +20,12 @@ Model-agnostic · Verified answers · Receipts, not vibes · OpenCode / Codex /
20
20
  <br />
21
21
 
22
22
  **[Quick start](#quick-start)** ·
23
+ [Benchmarks](#benchmarks) ·
23
24
  [Workflow](#workflow) ·
24
25
  [Skills](#skills) ·
25
26
  [Commands](#commands) ·
26
27
  [Workers](#workers) ·
28
+ [Responsibility](#responsibility) ·
27
29
  [Write an adapter](docs/backends.md)
28
30
 
29
31
  <br />
@@ -36,8 +38,6 @@ Model-agnostic · Verified answers · Receipts, not vibes · OpenCode / Codex /
36
38
 
37
39
  </div>
38
40
 
39
- > **Current version: 0.6.0.**
40
-
41
41
  ---
42
42
 
43
43
  ## Why Pitroom?
@@ -46,7 +46,7 @@ Claude Code, Codex and friends spend premium tokens *reading*: grepping, opening
46
46
 
47
47
  Pitroom goes one step further:
48
48
 
49
- > **Your agent stays in the driver's seat. A pit crew of cheap workers does the legwork, and hands back only the answer, the exact diff and a receipt.**
49
+ > **Your agent stays in the driver's seat. A pit crew of cheap workers does the legwork in parallel, while your agent keeps going, and hands back only the answer, the exact diff and a receipt.**
50
50
 
51
51
  <table>
52
52
  <tr>
@@ -98,7 +98,9 @@ In isolate mode nothing reaches your tree until you apply it.
98
98
 
99
99
  - **Receipts, not vibes.** Tokens the worker burned, tokens returned to your agent, compression ratio, and an estimate of what your primary model would have charged. `pitroom savings --card card.svg` makes a shareable card.
100
100
  - **Self-healing worker chain.** Free models get rate-limited or retired. List fallback workers once (`fallback`) and a run that hits "model not found", 429 or quota errors moves to the next model automatically. Still no model hardcoded: the chain is yours.
101
- - **A crew, not just one worker.** `pitroom crew` starts several workers at once, `pitroom watch --json` streams one line per change so your agent follows them live, `pitroom wait -g` collects every answer, `pitroom apply -g` lands isolated patches in order. A queue (`maxParallel`) keeps free tiers from rate-limiting you; parallel writers are refused.
101
+ - **A crew, not just one worker.** `pitroom crew` starts several workers at once, `pitroom watch --json` streams one line per change so your agent follows them live, `pitroom wait -g` collects every answer, `pitroom apply -g` lands isolated patches in order. Up to 20 workers run at once by default (`maxParallel`, 30 at most), the rest queue, and the fallback chain absorbs free-tier rate limits; parallel writers are refused.
102
+ - **Faster, not only cheaper.** Workers run in the background and side by side (up to 20 at once) while your agent keeps working, so slow reading and review stop blocking it. In the [benchmark](#benchmarks), 470 s of worker time finished in 156 s of wall clock, about 3× faster than one question after another, and your agent's own context stayed small.
103
+ - **Free first, dearer only when needed.** Runs and plan tasks start on the `cheap` tier, OpenCode's free model; `standard` (Codex) and `capable` (Claude Code) are for tasks that need them, and an optional `review` tier names who reviews. `pitroom models` shows what each worker offers, the effort levels (`low` … `xhigh`) each model accepts, what you say it costs (`costs`) and what it used; `--effort` sets the level per run. Details: [Models, costs and effort](#models-costs-and-effort).
102
104
  - **Exact changes, even in a dirty tree.** Pitroom snapshots the working tree with a throwaway git index (your index, branches and stash are never touched), so it reports *only the worker's* edits and can undo exactly those: `pitroom revert <id>`.
103
105
  - **Your agent sets the permissions.** It creates each worker with the permissions the task and your session allow (read-only, isolated copy, in-place edits, web), and a worker never widens its own. A fixed floor stays for every run: no git history changes, no `sudo`, no publishing, no secrets. A worker cannot land a deletion either: `pitroom apply` refuses a patch that deletes files unless your agent passes `--allow-delete`.
104
106
  - **Real isolation.** `--isolate` runs the worker in a private copy of your **current** state (its own repository, sharing your objects read-only), uncommitted and untracked files included, then hands you a patch: `pitroom apply <id>` (checked, refuses on conflict) or `pitroom discard <id>`.
@@ -108,7 +110,7 @@ In isolate mode nothing reaches your tree until you apply it.
108
110
 
109
111
  ### How it stays safe
110
112
 
111
- Each run gets the worker's own safety mechanism set to the mode (for OpenCode, a permission profile injected through `OPENCODE_CONFIG_CONTENT`): no commit/push/reset/checkout/stash/clean/rebase, no bulk deletes, no `sudo`, no `.env` or key files, no web tools unless you pass `--web`, no subagents, no recursive delegation. Only `allow`/`deny` rules, so a headless run never stalls on a prompt. A **git guard** on the worker's PATH also stops `sh -c "git push"`, `env git reset`, aliases and scripts from committing, pushing, resetting, stashing or touching your index. Your `opencode.json` is never touched.
113
+ Each run gets the worker's own safety mechanism set to the mode (for OpenCode, a permission profile injected through `OPENCODE_CONFIG_CONTENT`): no commit/push/reset/checkout/stash/clean/rebase, no bulk deletes, no `sudo`, a file-reading tool that refuses `.env` and key files (OpenCode and Claude Code workers), no web tools unless you pass `--web`, no subagents, no recursive delegation. Only `allow`/`deny` rules, so a headless run never stalls on a prompt. A **git guard** on the worker's PATH also stops `sh -c "git push"`, `env git reset`, aliases and scripts from committing, pushing, resetting, stashing or touching your index. Your `opencode.json` is never touched. These safeguards reduce risk; they are not a security boundary (see [Responsibility](#responsibility) and [SECURITY.md](SECURITY.md)).
112
114
 
113
115
  ---
114
116
 
@@ -132,77 +134,91 @@ FILES CHANGED: none
132
134
  · returned ~554 tokens, 294× compression · est. saved $0.152 vs Claude Sonnet
133
135
  ```
134
136
 
135
- Every run prints a receipt, and `pitroom savings` adds them up:
137
+ Every run prints a receipt, and `pitroom savings` adds them up (a bigger measurement follows in [Benchmarks](#benchmarks)):
136
138
 
137
139
  <p align="center"><img src="docs/card.svg" width="520" alt="Pitroom savings card"></p>
138
140
 
139
141
  ---
140
142
 
141
- ## Quick start
142
-
143
- <table>
144
- <tr>
145
-
146
- <td width="25%" valign="top">
147
-
148
- ### 01
143
+ ## Benchmarks
149
144
 
150
- **Install**
145
+ Measured on a real, public repository: [PI-Desktop](https://github.com/vastsa/PI-Desktop) at commit `c2bfe35`, 2,349 tracked files and about 419,000 lines of TypeScript and Rust. Eight questions of the kind an agent asks before it changes code, run as one read-only crew (`pitroom crew`, at most four workers at a time) on OpenCode's free `muse-spark-1.3-contributor-free` model.
151
146
 
152
- Plugin or npm (below)
147
+ | Question | Worker time | Tokens processed | Returned to the agent | Compression | Refs verified |
148
+ |---|---|---|---|---|---|
149
+ | Where is the plugin runtime, and which functions activate and deactivate a plugin? | 37 s | 405,380 | 767 | 529× | 10/11 |
150
+ | When does the agent runtime compact a conversation? (function and exact condition) | 90 s | 1,250,719 | 763 | 1,639× | 17/17 |
151
+ | Where is session state persisted to disk in the Rust host? | 71 s | 854,969 | 1,426 | 600× | 29/45 ¹ |
152
+ | Which IPC channels expose window management to the renderer? | 32 s | 165,180 | 716 | 231× | 3/28 ¹ |
153
+ | How does a tool call travel from the agent runtime to the Rust host? | 119 s | 1,818,524 | 866 | 2,100× | 14/15 |
154
+ | Which packages and apps depend on the i18n package? | 33 s | 271,297 | 656 | 414× | 15/16 |
155
+ | Where is auto-update implemented, and what does the Windows portable target change? | 29 s | 215,693 | 743 | 290× | 20/21 |
156
+ | Which tests cover the RPC layer? | 59 s | 511,209 | 1,747 | 293× | 6/7 |
157
+ | **All eight** | **156 s** wall clock | **5,492,971** | **7,684** | **715×** | 114/160 |
153
158
 
154
- </td>
155
-
156
- <td width="25%" valign="top">
159
+ Workers read 5.5 million tokens of code and docs (96 steps, 179 tool calls) and handed the agent 7,684 tokens, about 960 per answer. The eight runs add up to 470 s of worker time but finished in 156 s of wall clock, because four ran at a time (the limit then; the default is now 20): about 3× faster than one after another. That compares the same workers with themselves, not with your agent doing the reading alone, which I did not measure. `pitroom savings` estimates $3.86 saved for these eight at Claude Sonnet list prices.
157
160
 
158
- ### 02
161
+ **Were the answers right?** Checked by hand against the repository: 46 key claims across all eight answers (the cited line and what it says) were all correct, and two completeness checks held (exactly 6 invoke and 3 event window channels; no tests in `config_sync_rpc.rs`). The i18n answer lists the 12 source files that import the package and leaves out 11 test and fixture files that do too, which the question did not ask about. Pitroom's own checker marks fewer references as verified than that: ¹ those two answers cite bare file names (`transcripts.rs:651`) that it cannot resolve to a path, and it counts them as unverified although the lines are right.
159
162
 
160
- **Connect a worker**
163
+ **A change in an isolated copy:** "add a one-line comment above `resolveUpdateMode`" finished in 16 s and 4 steps (142,491 tokens). The patch was one file and one line, the comment matched the code, and your working tree is untouched until you apply.
161
164
 
162
- OpenCode, Codex or Claude Code
165
+ **What this does not show**
166
+ - One repository, one free model, one run per question: there is no variance here, and another model or repository will differ.
167
+ - An open-ended task ("find up to five spelling mistakes in `docs/`") did not finish: it was stopped after 19 minutes and 57 tool calls. Give workers bounded tasks.
168
+ - "Tokens processed" is what the workers read and wrote. What your agent would have spent doing the same reading itself is an estimate, not a measurement: the savings figure assumes it would process about the same tokens. The $0 worker cost is because the model is free.
169
+ - The hand check covered key claims, not every citation.
163
170
 
164
- </td>
171
+ To repeat it on your own repository: `pitroom crew -d <repo> -g bench "<question 1>" "<question 2>" …`, then `pitroom wait -g bench`, `pitroom show <run>` and `pitroom savings --models`.
165
172
 
166
- <td width="25%" valign="top">
173
+ ---
167
174
 
168
- ### 03
175
+ ## Quick start
169
176
 
170
- **Check it**
177
+ You need Node.js 18+ and at least one worker CLI: [OpenCode](https://opencode.ai) v2+ (the default worker, with free models), [Codex CLI](https://github.com/openai/codex) or [Claude Code](https://claude.com/claude-code).
171
178
 
172
- `pitroom doctor --probe`
179
+ ### 1. Install: pick your agent
173
180
 
174
- </td>
181
+ **Claude Code**
175
182
 
176
- <td width="25%" valign="top">
183
+ ```bash
184
+ claude plugin marketplace add ATASTECH/pitroom
185
+ claude plugin install pitroom@pitroom
186
+ ```
177
187
 
178
- ### 04
188
+ <sub>Inside a session: `/plugin marketplace add ATASTECH/pitroom`, then `/plugin install pitroom@pitroom`.</sub>
179
189
 
180
- **Use it**
190
+ **Codex**
181
191
 
182
- Ask your agent, or run `pitroom`
192
+ ```bash
193
+ codex plugin marketplace add ATASTECH/pitroom
194
+ codex plugin add pitroom@pitroom
195
+ npm i -g pitroom
196
+ ```
183
197
 
184
- </td>
198
+ **Any other agent (Cursor, Gemini CLI, a plain shell) or just the CLI**
185
199
 
186
- </tr>
187
- </table>
200
+ ```bash
201
+ npm i -g pitroom
202
+ pitroom install
203
+ ```
188
204
 
189
- Requires Node.js 18+ and at least one worker CLI: [OpenCode](https://opencode.ai) v2+ (the default worker), [Codex CLI](https://github.com/openai/codex) or [Claude Code](https://claude.com/claude-code).
205
+ | Path | You get |
206
+ |---|---|
207
+ | Claude Code plugin | The 14 skills, the session-start hook that introduces Pitroom, and a card after each `pitroom` command. |
208
+ | Codex plugin | The 14 skills. Codex has no session-start hook, so Pitroom is not introduced on its own: the skills load when a task matches, or name one. `pitroom` itself comes from npm. |
209
+ | npm + `pitroom install` | The CLI, and the skills linked into `~/.agents/skills` and `~/.claude/skills`. |
190
210
 
191
- ### Choose how to install
211
+ Pick one path, not several: `doctor` warns if the skills load twice. The plugins alone do not put `pitroom` on your PATH, so install it from npm too if you want to run it yourself (`watch`, `models`, `savings`, the status line).
192
212
 
193
- | You use | Install | What you get |
194
- |---|---|---|
195
- | **Claude Code** | `claude plugin marketplace add ATASTECH/pitroom`<br>`claude plugin install pitroom@pitroom`<br>(inside a session: `/plugin marketplace add ATASTECH/pitroom`, `/plugin install pitroom@pitroom`) | The 14 skills, the session-start hook that introduces Pitroom, and a card after each `pitroom` command. The plugin is the published npm package: under 0.5 MB, no dependencies. |
196
- | **Codex** | `codex plugin marketplace add ATASTECH/pitroom`<br>`codex plugin add pitroom@pitroom`<br>and `npm i -g pitroom` | The 14 skills. Codex plugins have no session-start hook, so Pitroom is not introduced on its own: the skills load when a task matches, or ask for one by name. The `pitroom` command itself comes from npm. |
197
- | **Any other agent, or only the CLI** | `npm i -g pitroom`<br>`pitroom install` | The CLI, and the skills linked into `~/.agents/skills` and `~/.claude/skills`. |
213
+ ### 2. Check the setup
198
214
 
199
215
  ```bash
200
- pitroom doctor --probe # worker CLI, models, permissions, skills, one live round trip
216
+ pitroom doctor --probe
201
217
  ```
202
218
 
203
- Pick one path: `doctor` warns if the skills load twice. To run `pitroom` yourself in a terminal (`watch`, `savings`, the status line below), install it from npm as well; the plugins alone do not put it on your PATH.
219
+ It checks the worker CLIs, models, permissions and skills, and runs one live round trip.
204
220
 
205
- ### Your first run
221
+ ### 3. Use it
206
222
 
207
223
  Pitroom is a toolbox, not a procedure: your agent uses it when it helps, or you ask explicitly:
208
224
 
@@ -214,8 +230,26 @@ Or start a worker yourself and read its receipt:
214
230
  ```bash
215
231
  pitroom "Which files read the session cookie? Cite file:line."
216
232
  pitroom savings # what all your runs saved so far
233
+ pitroom models # what each worker offers, what it costs you, what it used
217
234
  ```
218
235
 
236
+ <details>
237
+ <summary>Update and uninstall</summary>
238
+
239
+ ```bash
240
+ # update
241
+ claude plugin update pitroom@pitroom
242
+ codex plugin marketplace upgrade pitroom
243
+ npm i -g pitroom@latest
244
+
245
+ # uninstall
246
+ claude plugin uninstall pitroom@pitroom
247
+ codex plugin remove pitroom@pitroom
248
+ pitroom uninstall && npm rm -g pitroom
249
+ ```
250
+
251
+ </details>
252
+
219
253
  ---
220
254
 
221
255
  ## Modes
@@ -241,17 +275,18 @@ Long jobs: `--bg` returns immediately; `pitroom wait <id>` blocks for up to 9 mi
241
275
 
242
276
  Pitroom ships a full development methodology as skills, adapted from [superpowers](https://github.com/obra/superpowers) so that its subagents are cheap workers: your agent brainstorms and plans with you, then executes the plan task by task while workers do the typing and a second model does the reviewing.
243
277
 
244
- ```text
245
- pitroom-brainstorming ──► spec (docs/pitroom/specs/)
246
- pitroom-writing-plans ──► plan (docs/pitroom/plans/), every task tagged with a worker tier
247
- pitroom-driven-development, per task:
248
- pitroom run -i --plan PLAN --step N implementer worker, isolated copy, TDD evidence, STATUS line
249
- pitroom review <run> read-only reviewer on another backend: SPEC and QUALITY verdicts
250
- pitroom run --continue <run> "…" fix rounds; the re-review sees only the fix diff
251
- pitroom apply <run> · tests · commit the primary lands it; workers never commit
252
- pitroom review --range main..HEAD --plan PLAN whole-branch review on the capable tier
253
- pitroom-finishing ──► merge, PR or keep (asked, never automatic)
254
- ```
278
+ <p align="center"><img src="docs/workflow.svg" width="100%" alt="Workflow: brainstorming, then a plan with a worker tier per task, then for every task a worker implements in an isolated copy, another model reviews, fix rounds repeat until approved, and your agent applies, tests and commits; then a whole-branch review and finishing."></p>
279
+
280
+ | Step | Skill | Command |
281
+ |---|---|---|
282
+ | Design | `pitroom-brainstorming` | writes the spec to `docs/pitroom/specs/` |
283
+ | Plan | `pitroom-writing-plans` | writes the plan to `docs/pitroom/plans/`, a worker tier on every task |
284
+ | Implement | `pitroom-driven-development` | `pitroom run -i --plan PLAN --step N` |
285
+ | Review | `pitroom-review` | `pitroom review <run>` (a read-only reviewer on another model) |
286
+ | Fix | `pitroom-receiving-review` | `pitroom run --continue <run> "…"` (the re-review sees only the fix) |
287
+ | Land | `pitroom-driven-development` | `pitroom apply <run>`, your tests, your commit |
288
+ | Branch review | `pitroom-review` | `pitroom review --range main..HEAD --plan PLAN` |
289
+ | Finish | `pitroom-finishing` | merge, pull request or keep: asked, never automatic |
255
290
 
256
291
  A review package holds the diff under review with 10 lines of context, and the reviewer's CLI sends it to that worker's model provider. Pitroom does not filter it: secrets committed in a reviewed range go along as they are.
257
292
 
@@ -272,6 +307,9 @@ pitroom crew -g v04-demo \
272
307
  pitroom watch -g v04-demo --json # what the primary agent follows, one line per change:
273
308
  ```
274
309
 
310
+ <details>
311
+ <summary>What the crew prints: the stream your agent follows and the status table</summary>
312
+
275
313
  ```text
276
314
  {"event":"started","run":"20260930-102812-a65d","mode":"read","task":"Where does Pitroom enforce the maxParallel queue, and how d…"}
277
315
  {"event":"progress","run":"20260930-102812-a65d","steps":3,"tools":4,"last":"grep SIGINT|SIGTERM|stop.*queued|stopped.*queued"}
@@ -288,9 +326,11 @@ RUN STATE MODE TIME STEPS WORKER NOW /
288
326
  20260930-102812-a65d done read 39s 7 opencode (default model) maxParallel is enforced by file-based slots (`s…
289
327
  ```
290
328
 
329
+ </details>
330
+
291
331
  Humans get the same table live with `pitroom watch -g NAME`; `pitroom wait -g NAME --brief` prints one line per worker, `pitroom show <run>` the full answer.
292
332
 
293
- For changes, `pitroom crew -i …` gives every worker its own isolated copy of your current state and `pitroom apply -g NAME` lands the patches in order, stopping at the first conflict. At most `maxParallel` workers (default 4) run at once, the rest queue; only one `--write` run per repository is allowed. `pitroom stop -g NAME` stops running and queued workers.
333
+ For changes, `pitroom crew -i …` gives every worker its own isolated copy of your current state and `pitroom apply -g NAME` lands the patches in order, stopping at the first conflict. Up to `maxParallel` workers (default 20, at most 30) run at once, the rest queue; only one `--write` run per repository is allowed. `pitroom stop -g NAME` stops running and queued workers.
294
334
 
295
335
  ---
296
336
 
@@ -317,6 +357,9 @@ For changes, `pitroom crew -i …` gives every worker its own isolated copy of y
317
357
 
318
358
  ## Commands
319
359
 
360
+ <details>
361
+ <summary>All commands and exit codes</summary>
362
+
320
363
  ```text
321
364
  pitroom run [-r|-w|-i] [-W WORKER] [-m MODEL] [-d DIR] [-f FILE]… [-t 30m] [--verify CMD] [--link a,b] [--bg] "task"
322
365
  pitroom run --continue <run|last> "follow-up"
@@ -328,13 +371,16 @@ pitroom status|wait|watch [run… | -g NAME] wait: --any --brief --timeou
328
371
  pitroom show [run] --patch --events --full --json
329
372
  pitroom apply [run | -g NAME] · pitroom discard|revert [run] · pitroom stop [run | -g NAME]
330
373
  pitroom ls [--running] [-g NAME] · pitroom clean [--days 14] [--yes]
331
- pitroom savings [--since 7d|30d|all] [--card file.svg] [--badge]
374
+ pitroom savings [--since 7d|30d|all] [--models] [--card file.svg] [--badge]
375
+ pitroom models [worker] [--all] [--json] models, effort levels, your costs, your usage
332
376
  pitroom statusline [--then CMD] · pitroom hook-card
333
377
  pitroom doctor [--probe] · pitroom config · pitroom install [--copy] [--force] · pitroom uninstall
334
378
  ```
335
379
 
336
380
  Exit codes: `0` ok · `1` worker failed · `2` usage · `3` refused/setup · `4` timeout · `5` read-only violation · `6` verify failed · `75` still running.
337
381
 
382
+ </details>
383
+
338
384
  ### Seeing Pitroom at work in Claude Code
339
385
 
340
386
  Two settings make every delegation visible, whether or not the agent mentions it. A status line shows running workers and this week's savings (`--then` keeps your own status line first); a card appears after each `pitroom` command the agent runs, once per phase (started, finished with its result, applied). The plugin registers the card hook itself; with `pitroom install`, add both to `~/.claude/settings.json`:
@@ -354,19 +400,14 @@ Two settings make every delegation visible, whether or not the agent mentions it
354
400
 
355
401
  ![Pitroom workflow: primary agent → Pitroom CLI → OpenCode, Codex or Claude Code workers → verified answer, exact diff and receipt returned to the primary agent.](docs/pitroom-flow.png)
356
402
 
357
- ```text
358
- primary agent ──(skill: "delegate?")──► pitroom run "task"
359
- │ snapshot tree (throwaway index) [write]
360
- │ isolated copy of current state [isolate]
361
- │ worker adapter: mode → the CLI's own permissions
362
- ▼
363
- worker CLI, e.g. opencode run --standalone --format json (stdin closed, git guard, your default model)
364
- │ NDJSON events
365
- ▼
366
- final answer · exact diff · receipt ──► primary agent verifies / applies
367
- ```
403
+ <p align="center"><img src="docs/architecture.svg" width="100%" alt="How a run flows: the primary agent delegates to the Pitroom CLI, which starts a worker CLI in read, isolate or write mode; events, then the answer, an exact diff and a receipt come back."></p>
368
404
 
369
- Known headless footguns handled for every worker: `opencode run` blocks forever on an open stdin pipe; `ask` permissions stall headless runs; default output carries ANSI and banners; and in OpenCode v2 a plain `run` attaches to the shared background service, where per-run permissions and the git guard would not apply. Pitroom closes stdin, uses allow/deny-only profiles, parses `--format json` and always runs a private `--standalone` server.
405
+ <details>
406
+ <summary>Headless problems Pitroom handles for every worker</summary>
407
+
408
+ Handled for every worker: `opencode run` blocks forever on an open stdin pipe; `ask` permissions stall headless runs; default output carries ANSI and banners; and in OpenCode v2 a plain `run` attaches to the shared background service, where per-run permissions and the git guard would not apply. Pitroom closes stdin, uses allow/deny-only profiles, parses `--format json` and always runs a private `--standalone` server.
409
+
410
+ </details>
370
411
 
371
412
  ---
372
413
 
@@ -377,7 +418,8 @@ A worker is named by a target: `backend[:model]`.
377
418
  ```bash
378
419
  pitroom run "…" # preferred worker (config "worker", default opencode)
379
420
  pitroom run -W opencode:opencode/space-bunny-free "…" # a specific backend and model
380
- pitroom run -W 'codex:#low' "…" # Codex's default model, low reasoning effort
421
+ pitroom run -W 'codex:#low' "…" # the model from config "models" (not Codex's default), low reasoning effort
422
+ pitroom run --effort high "…" # any worker: model#level (Codex, Claude Code, OpenCode)
381
423
  pitroom run -W claude:haiku "…" # Claude Code on a cheap model
382
424
  pitroom run -m nvidia/z-ai/glm-5.3 "…" # another model on the preferred worker
383
425
  ```
@@ -389,24 +431,42 @@ pitroom run -m nvidia/z-ai/glm-5.3 "…" # another model on th
389
431
  | Claude Code | ✅ | tool allowlist (`--restricted --safe-mode`, `dontAsk`) | reported | `claude auth login`; its default is often Opus, so prefer `-W claude:haiku` |
390
432
  | Gemini CLI | soon | approval mode + policy engine | | |
391
433
 
434
+ ### Models, costs and effort
435
+
436
+ `pitroom models` lists what each worker offers (Codex from its own model cache, Claude Code's aliases, OpenCode's `opencode models`), the reasoning-effort levels each model accepts, what you say it costs and what your own runs used:
437
+
438
+ ```text
439
+ worker model effort (* default) cost runs avg tokens $/run in use
440
+ codex gpt-6.1-sol low*/medium/high/xhigh/max/ultra 2 20 174k - tier standard
441
+ codex gpt-6-sol low/medium*/high/xhigh/max/ultra 1 1 24k - -
442
+ claude haiku low/medium/high/xhigh/max ? - - - -
443
+ ```
444
+
445
+ Pitroom cannot know vendor prices and does not fetch them, so a cost is what you enter: `"costs": {"codex:gpt-6-sol": 1, "codex:gpt-6.1-sol": 2}` in the config, in any unit (they are only compared). `pitroom doctor` then prints the cost of the models in use and says when you priced a cheaper one of the same worker. A target that names only an effort (`codex:#low`) uses the model from `models`; a Codex or Claude Code worker with no pinned model gets a warning, because it would run the vendor's own default, which can change and cost more. `--effort LEVEL` sets the level for one run; your agent picks model and level from `pitroom models` (cheapest that fits: `low` for lookups, `medium` for ordinary changes, `high` for reviews).
446
+
392
447
  Fallbacks cross backends (e.g. `"fallback": ["codex:#low", "opencode"]`): a worker that is rate-limited, logged out or missing its model hands the task to the next. Follow-ups (`--continue`) always stay on the worker that owns the session. Writing an adapter: [docs/backends.md](docs/backends.md).
393
448
 
394
449
  ---
395
450
 
396
451
  ## Configuration
397
452
 
453
+ <details>
454
+ <summary>Environment variables</summary>
455
+
398
456
  | Env | Default | |
399
457
  |---|---|---|
400
458
  | `PITROOM_WORKER` | `opencode` | Preferred worker target: `backend[:model]` |
401
459
  | `PITROOM_MODEL` | the worker's default | Model for the preferred worker |
402
460
  | `PITROOM_FALLBACK` | none | Comma-separated targets to fail over to on model/provider errors |
403
461
  | `PITROOM_TIMEOUT` | `30m` | Per-run timeout |
404
- | `PITROOM_MAX_PARALLEL` | `4` | Workers running at once; more queue |
462
+ | `PITROOM_MAX_PARALLEL` | `20` | Workers running at once (at most 30); more queue |
405
463
  | `PITROOM_PRIMARY` | `sonnet` | Pricing preset for the savings estimate: `sonnet`, `opus`, `haiku`, `gpt-5` |
406
464
  | `PITROOM_PRICE` | | Custom primary price, USD per 1M tokens: `"in,out[,cachedIn]"` |
407
465
  | `PITROOM_HOME` | `~/.local/state/pitroom` | Where run records and the ledger live |
408
466
  | `PITROOM_<WORKER>_BIN` | on PATH | Path to a worker CLI, e.g. `PITROOM_OPENCODE_BIN` |
409
467
 
468
+ </details>
469
+
410
470
  Or put defaults in `~/.config/pitroom/config.json` (flags and env still win); `pitroom config` shows every effective value and where it came from. `models` gives each worker a default model for targets that name none (`-W codex`, a `"codex"` fallback); a model in the target or `-m` still wins. `tiers` names workers for `--tier` and for plan tasks' `**Worker:**` lines:
411
471
 
412
472
  ```json
@@ -414,19 +474,25 @@ Or put defaults in `~/.config/pitroom/config.json` (flags and env still win); `p
414
474
  "worker": "opencode",
415
475
  "fallback": ["opencode:opencode/space-bunny-free", "codex"],
416
476
  "models": { "codex": "gpt-6.1-sol", "claude": "claude-sonnet-5-5" },
417
- "tiers": { "cheap": "opencode", "standard": "codex", "capable": "claude" },
477
+ "costs": { "codex:gpt-6-sol": 1, "codex:gpt-6.1-sol": 2 },
478
+ "tiers": { "cheap": "opencode", "standard": "codex", "capable": "claude", "review": "opencode:opencode/space-bunny-free" },
418
479
  "timeout": "20m",
419
480
  "primary": "opus",
420
481
  "link": ["node_modules"],
421
- "maxParallel": 3
482
+ "maxParallel": 20
422
483
  }
423
484
  ```
424
485
 
486
+ - `worker` and `fallback`: who runs a task when you name no one, and who takes over when it fails; `models`: the model each worker uses when a target names none.
487
+ - `tiers`: `cheap`, `standard` and `capable` name the workers for plan tasks and `--tier`; an optional `review` tier names who reviews a run (by default another worker than the implementer's, `standard` first).
488
+ - `costs`: your relative cost per `worker:model`, only compared with each other; `maxParallel`: workers at once (default 20, at most 30).
489
+
490
+
425
491
  ---
426
492
 
427
493
  ## FAQ
428
494
 
429
- **Where does my code go?** To whichever provider your worker's model uses. For private code, point the worker at a local model. `.env` files and private keys are blocked from the worker either way.
495
+ **Where does my code go?** To whichever provider your worker's model uses. For private code, point the worker at a local model. The file-reading tools of OpenCode and Claude Code workers refuse `.env` files and private keys; Codex workers are not restricted that way and a shell command can still read them, so keep secrets out of the folder you delegate in.
430
496
 
431
497
  **How is "saved" computed?** It assumes your primary agent would have processed about the same tokens the worker did, priced at your primary's list prices (`PITROOM_PRIMARY` / `PITROOM_PRICE`), minus the worker's cost and the cost of reading the report. It is an estimate and is labelled as one.
432
498
 
@@ -436,9 +502,17 @@ Or put defaults in `~/.config/pitroom/config.json` (flags and env still win); `p
436
502
 
437
503
  ---
438
504
 
505
+ ## Responsibility
506
+
507
+ Pitroom is provided as is, under the [MIT License](LICENSE), and is an independent project: it is not affiliated with or endorsed by OpenAI, Anthropic, OpenCode or the other tools it can drive.
508
+
509
+ **You are responsible for how you use it.** You decide what you delegate and to which model provider, which permissions a worker gets, and what you apply to your projects. Workers are AI agents and can be wrong: review their changes and run your tests before you rely on them. Pitroom's permission profiles, git guard and isolated copies reduce risk, but they are not a security boundary against a determined attacker or a malicious repository. Keep secrets out of the folder you delegate in, prefer isolated mode for changes you have not reviewed, and follow the terms of the worker CLIs and model providers you connect. What reaches a provider is described in the [privacy policy](PRIVACY.md).
510
+
511
+ ---
512
+
439
513
  ## Contributing
440
514
 
441
- Issues and pull requests are welcome. Worker adapters are the easiest place to start: [docs/backends.md](docs/backends.md).
515
+ Issues and pull requests are welcome. Start with [CONTRIBUTING.md](CONTRIBUTING.md): setup, tests, the dist bundle and the commit style. Worker adapters are the easiest place to begin: [docs/backends.md](docs/backends.md).
442
516
 
443
517
  ```bash
444
518
  npm install
@@ -446,14 +520,18 @@ npm test # end-to-end tests against a fake worker CLI + adapter contrac
446
520
  npm run typecheck
447
521
  ```
448
522
 
523
+ **Security:** please report vulnerabilities privately, as described in [SECURITY.md](SECURITY.md), not in a public issue.
524
+
449
525
  **[Report an issue](https://github.com/ATASTECH/pitroom/issues/new)** ·
450
- [Open issues](https://github.com/ATASTECH/pitroom/issues)
526
+ [Open issues](https://github.com/ATASTECH/pitroom/issues) ·
527
+ [Security policy](SECURITY.md) ·
528
+ [Code of conduct](CODE_OF_CONDUCT.md)
451
529
 
452
530
  ---
453
531
 
454
532
  ## Credits
455
533
 
456
- The workflow skills (brainstorming, planning, worker-driven development, review, debugging, TDD, verification, worktrees, finishing) are adapted from [superpowers](https://github.com/obra/superpowers)
534
+ The workflow skills (brainstorming, planning, worker-driven development, review, debugging, TDD, verification, worktrees, finishing) are adapted from [superpowers](https://github.com/obra/superpowers) by Jesse Vincent, under the MIT License; the notice is in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
457
535
 
458
536
  ## License
459
537
 
@@ -0,0 +1,19 @@
1
+ # Third-party notices
2
+
3
+ Pitroom itself is licensed under the [MIT License](LICENSE). The workflow skills in `skills/` (brainstorming, planning, worker-driven development, review, debugging, TDD, verification, worktrees and finishing) are adapted from the skills of **superpowers** by Jesse Vincent, <https://github.com/obra/superpowers>, used under the MIT License reproduced below. They were rewritten so that their subagents are Pitroom workers.
4
+
5
+ ## superpowers
6
+
7
+ MIT License
8
+
9
+ Copyright (c) 2025 Jesse Vincent
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
16
+
17
+ ## Not bundled
18
+
19
+ Pitroom starts worker CLIs you install yourself (OpenCode, Codex CLI, Claude Code). They are not part of this package and keep their own licenses and terms.