@generativereality/cctabs 0.3.1 → 0.3.2

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": "cctabs",
3
3
  "description": "Claude Code tab manager. Terminal tabs as the UI, no tmux. Claude can orchestrate its own sibling sessions.",
4
- "version": "0.3.1",
4
+ "version": "0.3.2",
5
5
  "author": {
6
6
  "name": "generativereality",
7
7
  "url": "https://cctabs.com"
package/README.md CHANGED
@@ -206,11 +206,16 @@ flags = ["--allow-dangerously-skip-permissions"]
206
206
  | Terminal | Status |
207
207
  |----------|--------|
208
208
  | [Wave Terminal](https://waveterm.dev) | ✅ Full support |
209
+ | [Tabby](https://tabby.sh) | ✅ Full support (requires the [`tabby-cctabs`](./tabby-plugin/) companion plugin) |
209
210
  | iTerm2 | Planned |
210
211
  | Ghostty | Planned |
211
212
  | Warp | Planned |
212
213
 
213
- Wave is supported via its unix socket RPC. Other terminals will follow as adapters — PRs welcome.
214
+ Wave is supported via its unix socket RPC. Tabby is supported via a small companion plugin that exposes a localhost HTTP API the cctabs CLI talks to — install with `cctabs install-tabby-plugin`. Other terminals will follow as adapters — PRs welcome.
215
+
216
+ ### Login shells on macOS
217
+
218
+ cctabs-spawned tabs default to **login shells** (`zsh -l`, `bash -l`, etc.) so PATH is initialised the same way Tabby's UI-spawned tabs are. Without `-l`, macOS's `/etc/zprofile` doesn't run, `path_helper` doesn't populate `/usr/local/bin` and `/opt/homebrew/bin` from `/etc/paths`, and brand-new tabs are missing Node, Homebrew, and anything else that lives there. Symptoms: `env: node: No such file or directory` in Claude Code's Bash tool, plugin MCP servers failing to start with ENOENT when they shell out to `npx`, and cctabs CLI itself failing inside the tab it just spawned. See [Tabby issue #2](https://github.com/Eugeny/tabby/issues/2) for the historical context. Pass an explicit `args` array (including `[]`) when calling the `/tabs` endpoint if you need a non-login shell.
214
219
 
215
220
  ## License
216
221
 
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import { consola } from "consola";
11
11
  import * as p from "@clack/prompts";
12
12
  //#region package.json
13
13
  var name = "@generativereality/cctabs";
14
- var version = "0.3.1";
14
+ var version = "0.3.2";
15
15
  var description = "Claude Code tab manager. Terminal tabs as the UI, no tmux.";
16
16
  var package_default = {
17
17
  name,
@@ -2601,6 +2601,38 @@ function checkTabbyPlugin() {
2601
2601
  hint: "Run `cctabs install-tabby-plugin` from inside a Tabby tab — it npm-installs the plugin and reopens Tabby. Or do it by hand: `npm install --legacy-peer-deps --prefix \"$HOME/Library/Application Support/tabby/plugins\" tabby-cctabs`, then quit + reopen Tabby."
2602
2602
  };
2603
2603
  }
2604
+ /**
2605
+ * Probe whether `node` is findable in a freshly spawned shell — the canonical
2606
+ * symptom of the macOS non-login PATH bug. Spawning `zsh -l -c 'command -v
2607
+ * node'` simulates the same login-shell init (/etc/zprofile → path_helper)
2608
+ * that cctabs now uses when it opens new Tabby tabs. If this fails, brand-new
2609
+ * tabs will also fail to find Node, every plugin MCP that shells out to npx
2610
+ * will ENOENT, and the cctabs CLI itself becomes unusable from inside those
2611
+ * tabs (chicken-and-egg). The remediation hint covers both the upstream-fix
2612
+ * path (rely on a recent cctabs that defaults to `-l`) and the dotfile
2613
+ * workaround for users on older versions or non-Tabby terminals.
2614
+ */
2615
+ function checkSpawnedShellPath() {
2616
+ const r = spawnSync("zsh", [
2617
+ "-l",
2618
+ "-c",
2619
+ "command -v node"
2620
+ ], {
2621
+ encoding: "utf-8",
2622
+ timeout: 3e3
2623
+ });
2624
+ if (r.status === 0 && r.stdout?.trim()) return {
2625
+ name: "Spawned shell PATH (node findable)",
2626
+ status: "ok",
2627
+ detail: r.stdout.trim()
2628
+ };
2629
+ return {
2630
+ name: "Spawned shell PATH",
2631
+ status: "warn",
2632
+ detail: r.error?.message ?? r.stderr?.trim() ?? "node not found in a login zsh",
2633
+ hint: "A login zsh cannot find `node`. Either node is not installed, or PATH is broken. On macOS, `/usr/local/bin` is added by /etc/zprofile's path_helper — non-login shells skip it. Add `export PATH=\"/usr/local/bin:$PATH\"` to ~/.zshenv as a belt-and-braces fix."
2634
+ };
2635
+ }
2604
2636
  function checkWaveDb() {
2605
2637
  if (!existsSync(WAVE_DB_PATH)) return { result: {
2606
2638
  name: "Wave DB",
@@ -2705,6 +2737,7 @@ const doctorCommand = define({
2705
2737
  const results = [];
2706
2738
  let waveDb = null;
2707
2739
  results.push(checkTerminal(terminal));
2740
+ results.push(checkSpawnedShellPath());
2708
2741
  if (terminal === "tabby") results.push(checkTabbyPlugin());
2709
2742
  if (terminal === "wave") {
2710
2743
  results.push(checkWaveAccessibility());
@@ -2852,7 +2885,7 @@ const defaultCommand = define({
2852
2885
  description,
2853
2886
  args: {},
2854
2887
  async run() {
2855
- await sessionsCommand.run?.call(this, { args: {} });
2888
+ await sessionsCommand.run?.call(this, { values: {} });
2856
2889
  }
2857
2890
  });
2858
2891
  const subCommands = new Map([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@generativereality/cctabs",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Claude Code tab manager. Terminal tabs as the UI, no tmux.",
5
5
  "type": "module",
6
6
  "bin": {