vibegroup 0.1.4 → 0.1.6

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/dist/cli.js CHANGED
@@ -70,7 +70,7 @@ var package_default;
70
70
  var init_package = __esm(() => {
71
71
  package_default = {
72
72
  name: "vibegroup",
73
- version: "0.1.4",
73
+ version: "0.1.6",
74
74
  description: "Talk to your teammates' Claude Code agents — agent-to-agent collaboration for Claude Code over a shared channel.",
75
75
  type: "module",
76
76
  bin: {
@@ -94,11 +94,21 @@ var init_package = __esm(() => {
94
94
  bugs: {
95
95
  url: "https://vibegroup.sh"
96
96
  },
97
- keywords: ["claude", "claude-code", "agents", "collaboration", "cli", "vibegroup"],
97
+ keywords: [
98
+ "claude",
99
+ "claude-code",
100
+ "agents",
101
+ "collaboration",
102
+ "cli",
103
+ "vibegroup"
104
+ ],
98
105
  publishConfig: {
99
106
  access: "public"
100
107
  },
101
- workspaces: ["packages/*", "plugin"],
108
+ workspaces: [
109
+ "packages/*",
110
+ "plugin"
111
+ ],
102
112
  scripts: {
103
113
  "build:relay": "cd packages/relay && bun run build",
104
114
  "build:plugin": "cd plugin && bun run build",
@@ -230,6 +240,32 @@ var init_install = __esm(() => {
230
240
  init_pluginInstall();
231
241
  });
232
242
 
243
+ // src/lib/channel.ts
244
+ import { spawnSync as spawnSync2 } from "node:child_process";
245
+ import { existsSync as existsSync3, readFileSync as readFileSync3 } from "node:fs";
246
+ import { dirname as dirname3 } from "node:path";
247
+ function readManagedSettings() {
248
+ try {
249
+ const p = managedSettingsPath();
250
+ if (existsSync3(p))
251
+ return JSON.parse(readFileSync3(p, "utf8"));
252
+ } catch {}
253
+ return null;
254
+ }
255
+ function channelAllowlisted() {
256
+ return isAllowlisted(readManagedSettings());
257
+ }
258
+ function enableChannelWithSudo() {
259
+ const path = managedSettingsPath();
260
+ const json = JSON.stringify(mergeManagedSettings(readManagedSettings()), null, 2);
261
+ const script = `mkdir -p "${dirname3(path)}" && cat > "${path}"`;
262
+ const r = spawnSync2("sudo", ["sh", "-c", script], { input: json, stdio: ["pipe", "inherit", "inherit"] });
263
+ return r.status === 0;
264
+ }
265
+ var init_channel = __esm(() => {
266
+ init_allowlist();
267
+ });
268
+
233
269
  // src/ui/runner.ts
234
270
  import { render } from "ink";
235
271
  function runInk(make) {
@@ -466,24 +502,6 @@ var exports_init = {};
466
502
  __export(exports_init, {
467
503
  initCommand: () => initCommand
468
504
  });
469
- import { spawnSync as spawnSync2 } from "node:child_process";
470
- import { existsSync as existsSync3, readFileSync as readFileSync3 } from "node:fs";
471
- import { dirname as dirname3 } from "node:path";
472
- function readManagedSettings() {
473
- try {
474
- const p = managedSettingsPath();
475
- if (existsSync3(p))
476
- return JSON.parse(readFileSync3(p, "utf8"));
477
- } catch {}
478
- return null;
479
- }
480
- function writeAllowlistWithSudo() {
481
- const path = managedSettingsPath();
482
- const json = JSON.stringify(mergeManagedSettings(readManagedSettings()), null, 2);
483
- const script = `mkdir -p "${dirname3(path)}" && cat > "${path}"`;
484
- const r = spawnSync2("sudo", ["sh", "-c", script], { input: json, stdio: ["pipe", "inherit", "inherit"] });
485
- return r.status === 0;
486
- }
487
505
  async function initCommand(rest, flags = {}, env = process.env) {
488
506
  const dev = flags.dev === true;
489
507
  console.log(`vibegroup setup
@@ -505,13 +523,13 @@ async function initCommand(rest, flags = {}, env = process.env) {
505
523
  }
506
524
  if (dev) {
507
525
  console.log("• Dev mode: skipping the channel allowlist (launch with `vibegroup claude --dev`).");
508
- } else if (isAllowlisted(readManagedSettings())) {
526
+ } else if (channelAllowlisted()) {
509
527
  console.log("✓ Channel already enabled.");
510
528
  } else {
511
529
  console.log(`
512
530
  • Enabling the vibegroup channel needs admin once (Claude Code gates channel plugins).`);
513
- console.log(` Writing ${managedSettingsPath()} — enter your password if prompted.`);
514
- if (!writeAllowlistWithSudo()) {
531
+ console.log(" Enter your password if prompted.");
532
+ if (!enableChannelWithSudo()) {
515
533
  console.error(" Could not write managed settings. Retry, or run `vibegroup init --dev` to skip it and use `vibegroup claude --dev`.");
516
534
  return 1;
517
535
  }
@@ -534,7 +552,7 @@ async function initCommand(rest, flags = {}, env = process.env) {
534
552
  }
535
553
  var init_init = __esm(() => {
536
554
  init_auth();
537
- init_allowlist();
555
+ init_channel();
538
556
  init_pluginInstall();
539
557
  init_login();
540
558
  });
@@ -562,6 +580,9 @@ function createTeam(opts, input) {
562
580
  function listRooms(opts, slug) {
563
581
  return call(opts, "GET", `/teams/${encodeURIComponent(slug)}/rooms`);
564
582
  }
583
+ function createRoom(opts, slug, name) {
584
+ return call(opts, "POST", `/teams/${encodeURIComponent(slug)}/rooms`, { name });
585
+ }
565
586
  function invite(opts, slug, email) {
566
587
  return call(opts, "POST", `/teams/${encodeURIComponent(slug)}/invitations`, { email });
567
588
  }
@@ -583,6 +604,7 @@ var exports_team = {};
583
604
  __export(exports_team, {
584
605
  teamCommand: () => teamCommand,
585
606
  roomsCommand: () => roomsCommand,
607
+ roomCommand: () => roomCommand,
586
608
  inviteCommand: () => inviteCommand
587
609
  });
588
610
  function client(env) {
@@ -611,6 +633,25 @@ async function teamCommand(rest, flags, env) {
611
633
  return 1;
612
634
  }
613
635
  }
636
+ async function roomCommand(rest, flags, env) {
637
+ const slug = str(flags.team);
638
+ if (rest[0] !== "create" || !rest[1] || !slug) {
639
+ console.error("usage: vibegroup room create <name> --team <slug>");
640
+ return 1;
641
+ }
642
+ const opts = client(env);
643
+ if (!opts)
644
+ return 1;
645
+ try {
646
+ const { room } = await createRoom(opts, slug, rest[1].toLowerCase());
647
+ console.log(`Created room "${room.name}" in ${slug}.`);
648
+ console.log(`Join it (rooms are set at launch, so start a session in it): vibegroup claude --team ${slug} --room ${room.name}`);
649
+ return 0;
650
+ } catch (e) {
651
+ console.error(`could not create room: ${e.message}`);
652
+ return 1;
653
+ }
654
+ }
614
655
  async function roomsCommand(flags, env) {
615
656
  const slug = str(flags.team);
616
657
  if (!slug) {
@@ -699,7 +740,7 @@ function extractFlag(args, name) {
699
740
  }
700
741
  return { value, rest };
701
742
  }
702
- function claudeCommand(args, env = process.env, launcher) {
743
+ function claudeCommand(args, env = process.env, launcher, channel = realChannelGate) {
703
744
  if (!isLoggedIn(readAuth(env))) {
704
745
  console.error("Not logged in — run `vibegroup login` first.");
705
746
  return 1;
@@ -711,6 +752,13 @@ function claudeCommand(args, env = process.env, launcher) {
711
752
  console.error("No team selected — pass `--team <slug>` (the team whose room you want to join).");
712
753
  return 1;
713
754
  }
755
+ if (!dangerously && !channel.allowlisted()) {
756
+ console.log("Enabling the vibegroup channel — one-time, needs admin. Enter your password if prompted.");
757
+ if (!channel.enable()) {
758
+ console.error("Could not enable the channel. Retry, or launch with `vibegroup claude --dev` (no admin needed).");
759
+ return 1;
760
+ }
761
+ }
714
762
  const vg = {
715
763
  VIBEGROUP_TEAM: team,
716
764
  VIBEGROUP_ROOM: room && room.length > 0 ? room : "general",
@@ -718,10 +766,12 @@ function claudeCommand(args, env = process.env, launcher) {
718
766
  };
719
767
  return launchClaude({ extraArgs: extra, dangerously, env: vg }, launcher);
720
768
  }
721
- var DEFAULT_API_BASE = "https://api.vibegroup.sh";
769
+ var DEFAULT_API_BASE = "https://api.vibegroup.sh", realChannelGate;
722
770
  var init_claudeCmd = __esm(() => {
723
771
  init_claudeLaunch();
724
772
  init_auth();
773
+ init_channel();
774
+ realChannelGate = { allowlisted: channelAllowlisted, enable: enableChannelWithSudo };
725
775
  });
726
776
 
727
777
  // src/cli.ts
@@ -813,6 +863,10 @@ async function run(argv, env = process.env) {
813
863
  const { teamCommand: teamCommand2 } = await Promise.resolve().then(() => (init_team(), exports_team));
814
864
  return teamCommand2(rest, flags, env);
815
865
  }
866
+ case "room": {
867
+ const { roomCommand: roomCommand2 } = await Promise.resolve().then(() => (init_team(), exports_team));
868
+ return roomCommand2(rest, flags, env);
869
+ }
816
870
  case "rooms": {
817
871
  const { roomsCommand: roomsCommand2 } = await Promise.resolve().then(() => (init_team(), exports_team));
818
872
  return roomsCommand2(flags, env);
@@ -843,6 +897,7 @@ Commands:
843
897
  logout Clear the cached session
844
898
  status Show your auth + connection status
845
899
  team create <slug> [--name] Create a team (a WorkOS org + a general room)
900
+ room create <name> --team <slug> Add a room to a team
846
901
  invite <email> --team <s> Invite someone to a team
847
902
  rooms --team <slug> List a team's rooms
848
903
  claude --team <slug> [--room <name>] [...]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibegroup",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Talk to your teammates' Claude Code agents — agent-to-agent collaboration for Claude Code over a shared channel.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -24,11 +24,21 @@
24
24
  "bugs": {
25
25
  "url": "https://vibegroup.sh"
26
26
  },
27
- "keywords": ["claude", "claude-code", "agents", "collaboration", "cli", "vibegroup"],
27
+ "keywords": [
28
+ "claude",
29
+ "claude-code",
30
+ "agents",
31
+ "collaboration",
32
+ "cli",
33
+ "vibegroup"
34
+ ],
28
35
  "publishConfig": {
29
36
  "access": "public"
30
37
  },
31
- "workspaces": ["packages/*", "plugin"],
38
+ "workspaces": [
39
+ "packages/*",
40
+ "plugin"
41
+ ],
32
42
  "scripts": {
33
43
  "build:relay": "cd packages/relay && bun run build",
34
44
  "build:plugin": "cd plugin && bun run build",
@@ -37,10 +37,11 @@ The session is cached now, so the `vibegroup` CLI works. AskUserQuestion: **"Cre
37
37
 
38
38
  ## Phase 3 — Launch a channel session
39
39
 
40
- If the vibegroup channel isn't set up on this machine yet, tell the user to run `vibegroup init` once in their terminal (it installs the plugin and enables the channel needs their password once). Then:
40
+ The vibegroup channel is admin-gated (it lives in root-owned managed settings), so **you can't enable it from here** it's a terminal action, like login. Tell the user to run, in their terminal:
41
41
  ```bash
42
42
  vibegroup claude --team <slug>
43
43
  ```
44
+ The **first run enables the channel** (one `sudo` password prompt), then launches Claude Code in the room. Every later run just launches. If they'd rather not use admin, `vibegroup claude --team <slug> --dev` skips it via the development-channel flag (no password).
44
45
 
45
46
  ## Done
46
47
 
@@ -7,8 +7,13 @@ Read the first word of $ARGUMENTS as a subcommand and route:
7
7
  - `init` (or no setup yet) → run the onboarding in **/vibegroup:init** (sign in, create/join a team, launch a channel session).
8
8
  - `status` → run `vibegroup status` and report.
9
9
  - `team` / `rooms` / `invite` / `login` / `logout` → run the matching `vibegroup` CLI command with the remaining arguments, and report the result.
10
+ - **create a room** (e.g. "create a room ai") → that's a room **inside a team**, NOT a new team. Run `vibegroup room create <name> --team <slug>` (use the user's current team; ask if unknown — `vibegroup status`/`vibegroup rooms --team <slug>`). Do **not** run `team create` for a room request.
10
11
  - `ask`, `peers`, or no argument → **collaborate** (below).
11
12
 
13
+ ## A session is bound to one room
14
+
15
+ A Claude session joins **one** `team:room`, fixed at launch by `vibegroup claude --team <slug> --room <name>` (default room: `general`). You **cannot switch or join another room inside a running session** — to work in a different (or newly created) room, the user restarts: `vibegroup claude --team <slug> --room <name>`. After creating a room, tell the user to relaunch into it.
16
+
12
17
  ## Collaborate with peer agents
13
18
 
14
19
  Peer agents in your team's room can ask each other what they're working on. Use the vibegroup MCP tools: