pitroom 0.18.0 → 0.19.0

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.18.0",
4
+ "version": "0.19.0",
5
5
  "author": {
6
6
  "name": "TahaAtas"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pitroom",
3
- "version": "0.18.0",
3
+ "version": "0.19.0",
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,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.19.0
4
+
5
+ ### Doctor
6
+ - `pitroom doctor` has a **Use** section: with no runs yet it says so and how to start ("ask your agent to use Pitroom", or `pitroom run "where is <something> defined?"`); afterwards it says how many runs there have been and when the last one was. Skills can be installed and an agent may still never think of Pitroom: this is the first thing a new user sees.
7
+
8
+ ### Fixes
9
+ - **`pitroom dash --detach` could not find a dash that was up.** The registry entry (`dash.json`) was deleted whenever the dash did not answer within 1.5 s, or when the file was read while the server was writing it; the command then reported "did not start" with the server running (seen as a flake on Windows and once on macOS). The entry is now removed only when its process is gone, and is written through a temp file.
10
+
11
+ ### Docs
12
+ - Cursor has its own entry in the Quick start (`pitroom install --mcp --client cursor`), with what is and is not verified: Cursor's documentation lists `~/.agents/skills` and `~/.claude/skills`, where `pitroom install` links the skills; we have not run it in a Cursor session, and a forum report says its CLI does not load `~/.agents/skills`.
13
+
3
14
  ## 0.18.0
4
15
 
5
16
  ### Windows
package/README.md CHANGED
@@ -282,7 +282,16 @@ gemini extensions install https://github.com/ATASTECH/pitroom
282
282
  npm i -g pitroom
283
283
  ```
284
284
 
285
- **Any agent that speaks MCP (Cursor, Claude Desktop, and the three above too)**
285
+ **Cursor**
286
+
287
+ ```bash
288
+ npm i -g pitroom
289
+ pitroom install --mcp --client cursor
290
+ ```
291
+
292
+ <sub>This adds `pitroom mcp` to `~/.cursor/mcp.json` and leaves the other servers in that file alone; restart Cursor if it does not show up. Cursor gets the ten MCP tools described below. The skills are linked into `~/.agents/skills` and `~/.claude/skills` (`--no-skills` skips that), and [Cursor's documentation](https://cursor.com/docs/skills) lists both as places it loads skills from; we have not run that in a Cursor session, and a Cursor forum report says its CLI (`cursor-agent`) does not load `~/.agents/skills`. `pitroom install --mcp --dry-run` shows what it would change first.</sub>
293
+
294
+ **Any agent that speaks MCP (Claude Desktop, and the ones above too)**
286
295
 
287
296
  Pitroom is also an [MCP](https://modelcontextprotocol.io) server on stdio: ten tools instead of shell commands and skills (`pitroom_run`, `pitroom_wait`, `pitroom_show`, `pitroom_info`, `pitroom_review`, `pitroom_audit`, `pitroom_apply`, `pitroom_discard`, `pitroom_revert`, `pitroom_stop`), the runs as resources, and four prompts. The tool definitions sit in the client's context for the whole session, so they are kept small: about 1.9k tokens. It is listed in the [MCP Registry](https://registry.modelcontextprotocol.io) as `io.github.ATASTECH/pitroom`, so clients that browse the registry can find it. After `npm i -g pitroom`, let Pitroom register itself in the clients it finds (Claude Code, Codex, Gemini CLI, Cursor, Claude Desktop):
288
297
 
package/dist/pitroom.mjs CHANGED
@@ -3691,7 +3691,7 @@ function progress(meta) {
3691
3691
  }
3692
3692
 
3693
3693
  // src/core/run.ts
3694
- var VERSION2 = true ? "0.18.0" : "0.0.0-dev";
3694
+ var VERSION2 = true ? "0.19.0" : "0.0.0-dev";
3695
3695
  function planWork(o) {
3696
3696
  if (!o.plan) return { task: o.task.trim(), tier: o.tier };
3697
3697
  if (o.continueFrom) throw new UserError("a follow-up continues its parent's task; drop --plan/--step");
@@ -5410,13 +5410,17 @@ async function ping(port) {
5410
5410
  }
5411
5411
  }
5412
5412
  async function runningDash() {
5413
+ let r;
5413
5414
  try {
5414
- const r = JSON.parse(fs27.readFileSync(registryFile(), "utf8"));
5415
- if (isAlive(r.pid) && await ping(r.port)) return { ...r, url: `http://127.0.0.1:${r.port}/` };
5415
+ r = JSON.parse(fs27.readFileSync(registryFile(), "utf8"));
5416
5416
  } catch {
5417
+ return void 0;
5417
5418
  }
5418
- fs27.rmSync(registryFile(), { force: true });
5419
- return void 0;
5419
+ if (!isAlive(r.pid)) {
5420
+ fs27.rmSync(registryFile(), { force: true });
5421
+ return void 0;
5422
+ }
5423
+ return await ping(r.port) ? { ...r, url: `http://127.0.0.1:${r.port}/` } : void 0;
5420
5424
  }
5421
5425
  function openBrowser(url) {
5422
5426
  const [cmd, args] = process.platform === "darwin" ? ["open", [url]] : process.platform === "win32" ? ["cmd", ["/c", "start", "", url]] : ["xdg-open", [url]];
@@ -5468,7 +5472,9 @@ async function dashCommand(o) {
5468
5472
  dash = await startDash({ port: 0, idleMs: o.idleMs });
5469
5473
  }
5470
5474
  fs27.mkdirSync(home(), { recursive: true });
5471
- fs27.writeFileSync(registryFile(), JSON.stringify({ pid: process.pid, port: dash.port }));
5475
+ const tmp = `${registryFile()}.${process.pid}.tmp`;
5476
+ fs27.writeFileSync(tmp, JSON.stringify({ pid: process.pid, port: dash.port }));
5477
+ renameOver(tmp, registryFile());
5472
5478
  const stop = () => void dash.close();
5473
5479
  process.once("SIGINT", stop);
5474
5480
  process.once("SIGTERM", stop);
@@ -6868,6 +6874,19 @@ var NEXT = [
6868
6874
  { when: /not logged in/, command: "claude auth login", why: "sign in the Claude Code worker (Codex: codex login)" },
6869
6875
  { when: /Gemini CLI is not signed in|IneligibleTierError/, command: "export GEMINI_API_KEY=\u2026", why: "a Google AI Studio key for the Gemini worker" }
6870
6876
  ];
6877
+ function usageLine() {
6878
+ const ids = listRunIds();
6879
+ if (!ids.length) {
6880
+ return 'no runs yet. Ask your agent to use Pitroom (for example "have a worker find where X is defined"), or try it yourself: pitroom run "where is <something> defined?"';
6881
+ }
6882
+ let when2 = "";
6883
+ try {
6884
+ const hours = Math.max(0, Math.round((Date.now() - Date.parse(readMeta(ids[ids.length - 1]).startedAt)) / 36e5));
6885
+ when2 = hours < 1 ? ", the last one within the hour" : hours < 48 ? `, the last one ${hours} h ago` : `, the last one ${Math.round(hours / 24)} days ago`;
6886
+ } catch {
6887
+ }
6888
+ return `${ids.length} run${ids.length === 1 ? "" : "s"} so far${when2} (pitroom savings shows what they saved)`;
6889
+ }
6871
6890
  function firstNodeOnPath() {
6872
6891
  for (const dir of (process.env.PATH ?? "").split(path30.delimiter).filter(Boolean)) {
6873
6892
  const file2 = path30.join(dir, process.platform === "win32" ? "node.exe" : "node");
@@ -6985,6 +7004,8 @@ function doctor5(probe) {
6985
7004
  for (const m of stale) add("warn", `${m.name} runs a different command for pitroom mcp than this install's: \`pitroom install --mcp --no-skills\` updates it`);
6986
7005
  section2("Skills and agents");
6987
7006
  addAll(skillChecks());
7007
+ section2("Use");
7008
+ add("ok", usageLine());
6988
7009
  if (probe && chain[0]) {
6989
7010
  section2("Live probe");
6990
7011
  const p = liveProbe(chain[0]);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pitroom",
3
- "version": "0.18.0",
3
+ "version": "0.19.0",
4
4
  "description": "A free pit crew for your expensive coding agent: hand reading, fixes, tests and reviews to cheap worker agents and get back the answer, the exact diff and a receipt. Fourteen skills adapt a full development workflow. Needs the pitroom command (npm i -g pitroom).",
5
5
  "contextFileName": "gemini-context.md"
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pitroom",
3
- "version": "0.18.0",
3
+ "version": "0.19.0",
4
4
  "mcpName": "io.github.ATASTECH/pitroom",
5
5
  "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, Claude Code or Gemini CLI workers, with receipts that prove the savings.",
6
6
  "type": "module",