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.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +11 -0
- package/README.md +10 -1
- package/dist/pitroom.mjs +27 -6
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
|
@@ -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.
|
|
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.
|
|
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
|
-
**
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
5419
|
-
|
|
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
|
-
|
|
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]);
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pitroom",
|
|
3
|
-
"version": "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.
|
|
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",
|