pitroom 0.10.1 → 0.11.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.10.1",
4
+ "version": "0.11.0",
5
5
  "author": {
6
6
  "name": "TahaAtas"
7
7
  },
@@ -18,5 +18,6 @@
18
18
  "subagents",
19
19
  "tokens",
20
20
  "workers"
21
- ]
21
+ ],
22
+ "hooks": "./hooks/claude-hooks.json"
22
23
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pitroom",
3
- "version": "0.10.1",
3
+ "version": "0.11.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,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.11.0
4
+
5
+ ### Gemini CLI as your primary agent
6
+ - Pitroom installs into Gemini CLI as an extension: `gemini extensions install https://github.com/ATASTECH/pitroom` gives it the 14 skills and a short context file that introduces Pitroom (`gemini-extension.json`, `gemini-context.md`). Gemini CLI also still works as a worker (`-W gemini`); the two are separate. Gemini asks you to confirm the extension. Its session-start hook text did not reach a Gemini session in a test (Gemini probably runs extension hooks only once you trust them), so the context file is what introduces Pitroom there.
7
+ - `hooks/hooks.json` is now valid for both Claude Code and Gemini CLI (a Gemini extension reads that file too and warned about Claude Code's `PostToolUse` event on every session): it holds SessionStart only, with a command that fills `${CLAUDE_PLUGIN_ROOT}` in Claude Code and `${extensionPath}` in Gemini CLI. The card after each `pitroom` command is Claude Code's alone and moved to `hooks/claude-hooks.json`, named by `hooks` in the Claude plugin manifest. `npm run bump` and the release test keep `gemini-extension.json` in step with the version.
8
+
9
+ ### Doctor
10
+ - Worker CLIs that are installed but not in your config now get a section ("Gemini CLI (installed, not in your config)") with how to use them, so a new worker is not invisible. They never count as warnings, and a CLI that is not installed stays out of the way.
11
+ - A Gemini API key that Gemini CLI keeps itself is no longer reported as "not signed in".
12
+ - Doctor warns when Pitroom is a Gemini extension and its skills are also linked into `~/.agents/skills`: Gemini would load them twice.
13
+
14
+ ### Docs
15
+ - The README has a Gemini CLI install block and a row in the install table.
16
+
3
17
  ## 0.10.1
4
18
 
5
19
  ### Docs
package/README.md CHANGED
@@ -260,7 +260,14 @@ codex plugin add pitroom@pitroom
260
260
  npm i -g pitroom
261
261
  ```
262
262
 
263
- **Any other agent (Cursor, Gemini CLI, a plain shell) or just the CLI**
263
+ **Gemini CLI**
264
+
265
+ ```bash
266
+ gemini extensions install https://github.com/ATASTECH/pitroom
267
+ npm i -g pitroom
268
+ ```
269
+
270
+ **Any other agent (Cursor, a plain shell) or just the CLI**
264
271
 
265
272
  ```bash
266
273
  npm i -g pitroom
@@ -270,6 +277,7 @@ pitroom install
270
277
  | Path | You get |
271
278
  |---|---|
272
279
  | Claude Code plugin | The 14 skills, the session-start hook that introduces Pitroom, and a card after each `pitroom` command. |
280
+ | Gemini CLI extension | The 14 skills and a short context file that introduces Pitroom (Gemini asks you to confirm the extension). Gemini CLI also works as a *worker*, which is separate: see [Workers](#workers). |
273
281
  | Codex plugin | The 14 skills, a session-start hook that introduces Pitroom (so it is known even when Codex drops skill descriptions because many are installed), and a card after each `pitroom` command. Codex asks you to trust the plugin's hooks once. The hooks call `pitroom`, which comes from npm (`npm i -g pitroom`). |
274
282
  | npm + `pitroom install` | The CLI, and the skills linked into `~/.agents/skills` and `~/.claude/skills`. |
275
283
 
package/dist/lib.mjs CHANGED
@@ -774,6 +774,8 @@ function doctor3({ models, hasFallback }) {
774
774
  const type = settings().security?.auth?.selectedType;
775
775
  if (key || vertex) {
776
776
  checks.push({ level: "ok", message: `Gemini CLI: ${key ? "an API key is set" : "Vertex AI is set up"}` });
777
+ } else if (type === "gemini-api-key" || type === "vertex-ai") {
778
+ checks.push({ level: "ok", message: `Gemini CLI: ${type === "vertex-ai" ? "Vertex AI" : "an API key"} is selected (kept by Gemini CLI)` });
777
779
  } else if (signedIn && type === "oauth-personal") {
778
780
  checks.push({
779
781
  level: "warn",
package/dist/pitroom.mjs CHANGED
@@ -874,6 +874,8 @@ function doctor3({ models, hasFallback }) {
874
874
  const type = settings().security?.auth?.selectedType;
875
875
  if (key || vertex) {
876
876
  checks.push({ level: "ok", message: `Gemini CLI: ${key ? "an API key is set" : "Vertex AI is set up"}` });
877
+ } else if (type === "gemini-api-key" || type === "vertex-ai") {
878
+ checks.push({ level: "ok", message: `Gemini CLI: ${type === "vertex-ai" ? "Vertex AI" : "an API key"} is selected (kept by Gemini CLI)` });
877
879
  } else if (signedIn && type === "oauth-personal") {
878
880
  checks.push({
879
881
  level: "warn",
@@ -4353,7 +4355,7 @@ function secretWarning(files, mode) {
4353
4355
  }
4354
4356
 
4355
4357
  // src/core/run.ts
4356
- var VERSION2 = true ? "0.10.1" : "0.0.0-dev";
4358
+ var VERSION2 = true ? "0.11.0" : "0.0.0-dev";
4357
4359
  function planWork(o) {
4358
4360
  if (!o.plan) return { task: o.task.trim(), tier: o.tier };
4359
4361
  if (o.continueFrom) throw new UserError("a follow-up continues its parent's task; drop --plan/--step");
@@ -5289,6 +5291,19 @@ function doctor5(probe) {
5289
5291
  addAll(backend.doctor({ models: [...new Set(models)], hasFallback: chain.length > 1 }));
5290
5292
  add("ok", `${backend.name}: read-only runs enforced by ${READ_ONLY_HOW[backend.capabilities.readOnly]}`);
5291
5293
  }
5294
+ const unused = allBackends().filter((b) => !byBackend.has(b.id));
5295
+ for (const backend of unused) {
5296
+ let found;
5297
+ try {
5298
+ found = backend.doctor({ models: [], hasFallback: true });
5299
+ } catch {
5300
+ continue;
5301
+ }
5302
+ if (!found.length || found[0].level === "fail") continue;
5303
+ section2(`${backend.name} (installed, not in your config)`);
5304
+ for (const c of found) add("ok", c.message);
5305
+ add("ok", `use it with -W ${backend.id}[:model], or name it in "fallback" or "tiers" in the config`);
5306
+ }
5292
5307
  section2("Skills and agents");
5293
5308
  addAll(skillChecks());
5294
5309
  if (probe && chain[0]) {
@@ -5364,6 +5379,12 @@ function skillChecks() {
5364
5379
  else if (names.length) checks.push({ level: "warn", message: `skills in ${base2}: only ${names.join(", ")} of ${all.length}; run \`pitroom install\`` });
5365
5380
  else if (!viaPlugin) checks.push({ level: "warn", message: `no Pitroom skills in ${base2}; run \`pitroom install\`` });
5366
5381
  }
5382
+ if (geminiExtensionInstalled()) {
5383
+ const linked = installedSkills().some((i) => i.base.includes(`${path24.sep}.agents${path24.sep}`) && i.names.length);
5384
+ checks.push(
5385
+ linked ? { level: "warn", message: "Pitroom is installed as a Gemini CLI extension and linked into ~/.agents/skills: Gemini loads the skills twice; run `pitroom uninstall` or `gemini extensions uninstall pitroom`" } : { level: "ok", message: "Gemini CLI extension installed (skills + context)" }
5386
+ );
5387
+ }
5367
5388
  if (viaPlugin) {
5368
5389
  const linked = installedSkills().some((i) => i.base.includes(`${path24.sep}.claude${path24.sep}`) && i.names.length);
5369
5390
  checks.push(
@@ -5381,6 +5402,10 @@ function skillChecks() {
5381
5402
  }
5382
5403
  return checks;
5383
5404
  }
5405
+ function geminiExtensionInstalled() {
5406
+ const home2 = process.env.GEMINI_CLI_HOME ?? os10.homedir();
5407
+ return fs28.existsSync(path24.join(home2, ".gemini", "extensions", "pitroom"));
5408
+ }
5384
5409
  function pluginInstalled() {
5385
5410
  try {
5386
5411
  const f = path24.join(os10.homedir(), ".claude", "plugins", "installed_plugins.json");
@@ -0,0 +1,5 @@
1
+ # Pitroom
2
+
3
+ Pitroom is installed: you can hand bounded work (research, fixes in an isolated copy, tests, reviews) to cheaper worker agents and get back a verified answer, the exact diff and a receipt. You decide, verify and answer.
4
+
5
+ Start with the `using-pitroom` skill (a menu of the `pitroom-*` skills and when each pays off). The CLI is `pitroom` (`npm i -g pitroom`; `pitroom doctor` checks the setup). Use it when it helps; for a small task you can do yourself, skip it.
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "pitroom",
3
+ "version": "0.11.0",
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
+ "contextFileName": "gemini-context.md"
6
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "hooks": {
3
+ "PostToolUse": [
4
+ {
5
+ "matcher": "Bash",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/dist/pitroom.mjs\" hook-card",
10
+ "timeout": 10
11
+ }
12
+ ]
13
+ }
14
+ ]
15
+ }
16
+ }
package/hooks/hooks.json CHANGED
@@ -6,23 +6,11 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/session-start.mjs\"",
9
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}${extensionPath}/hooks/session-start.mjs\"",
10
10
  "async": false
11
11
  }
12
12
  ]
13
13
  }
14
- ],
15
- "PostToolUse": [
16
- {
17
- "matcher": "Bash",
18
- "hooks": [
19
- {
20
- "type": "command",
21
- "command": "node \"${CLAUDE_PLUGIN_ROOT}/dist/pitroom.mjs\" hook-card",
22
- "timeout": 10
23
- }
24
- ]
25
- }
26
14
  ]
27
15
  }
28
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pitroom",
3
- "version": "0.10.1",
3
+ "version": "0.11.0",
4
4
  "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.",
5
5
  "type": "module",
6
6
  "author": "TahaAtas",
@@ -23,6 +23,8 @@
23
23
  "policies",
24
24
  ".claude-plugin",
25
25
  ".codex-plugin",
26
+ "gemini-extension.json",
27
+ "gemini-context.md",
26
28
  "assets",
27
29
  "docs/backends.md",
28
30
  "README.md",