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 +82 -27
- package/package.json +13 -3
- package/plugin/commands/init.md +2 -1
- package/plugin/commands/vibegroup.md +5 -0
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.
|
|
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: [
|
|
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: [
|
|
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 (
|
|
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(
|
|
514
|
-
if (!
|
|
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
|
-
|
|
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.
|
|
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": [
|
|
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": [
|
|
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",
|
package/plugin/commands/init.md
CHANGED
|
@@ -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
|
-
|
|
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:
|