vibegroup 0.1.2 → 0.1.3

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/README.md CHANGED
@@ -11,6 +11,12 @@ When you and your teammates are each heads-down in your own repo on your own mac
11
11
 
12
12
  ## Install
13
13
 
14
+ ```bash
15
+ npx vibegroup install # registers the vibegroup plugin in Claude Code
16
+ ```
17
+
18
+ Or install the CLI globally:
19
+
14
20
  ```bash
15
21
  npm i -g vibegroup
16
22
  ```
@@ -18,7 +24,7 @@ npm i -g vibegroup
18
24
  ## Quickstart
19
25
 
20
26
  ```bash
21
- vibegroup login # sign in (opens your browser)
27
+ vibegroup init # one-time: install the plugin, enable the channel, sign in
22
28
  vibegroup team create acme --name Acme # create a team (or get invited to one)
23
29
  vibegroup claude --team acme # launch Claude Code wired to your team's room
24
30
  ```
@@ -38,7 +44,9 @@ Inside the session, your agent can reach teammates' agents:
38
44
  ## Commands
39
45
 
40
46
  ```
41
- vibegroup login Sign in / sign up
47
+ vibegroup install Register the plugin in Claude Code (also: npx vibegroup install)
48
+ vibegroup init [email] One-time setup: plugin + channel + sign-in
49
+ vibegroup login [email] Sign in / sign up
42
50
  vibegroup logout Clear the cached session
43
51
  vibegroup status Show your auth status
44
52
  vibegroup team create <slug> [--name] Create a team (+ a general room)
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.2",
73
+ version: "0.1.3",
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: {
@@ -79,7 +79,6 @@ var init_package = __esm(() => {
79
79
  files: [
80
80
  "dist/cli.js",
81
81
  "README.md",
82
- "scripts/postinstall.mjs",
83
82
  ".claude-plugin/marketplace.json",
84
83
  "plugin/.claude-plugin",
85
84
  "plugin/.mcp.json",
@@ -107,7 +106,6 @@ var init_package = __esm(() => {
107
106
  "build:server": "cd packages/server && bun run build",
108
107
  build: "bun run build:relay && bun run build:server && bun run build:plugin && bun run build:cli",
109
108
  prepublishOnly: "bun run build:plugin && bun run build:cli",
110
- postinstall: "node scripts/postinstall.mjs",
111
109
  "test:cli": "bun test ./test/",
112
110
  "test:protocol": "cd packages/protocol && bun test",
113
111
  "test:relay": "cd packages/relay && bun test",
@@ -178,6 +176,60 @@ var init_allowlist2 = __esm(() => {
178
176
  init_allowlist();
179
177
  });
180
178
 
179
+ // src/lib/pluginInstall.ts
180
+ import { spawnSync } from "node:child_process";
181
+ import { fileURLToPath } from "node:url";
182
+ import { dirname as dirname2, join as join2 } from "node:path";
183
+ function packageRoot() {
184
+ return join2(dirname2(fileURLToPath(import.meta.url)), "..");
185
+ }
186
+ function claudeAvailable() {
187
+ try {
188
+ return spawnSync("claude", ["--version"], { stdio: "ignore" }).status === 0;
189
+ } catch {
190
+ return false;
191
+ }
192
+ }
193
+ function pluginInstalled() {
194
+ const r = spawnSync("claude", ["plugin", "list"], { encoding: "utf8" });
195
+ return r.status === 0 && /vibegroup@vibegroup/.test(r.stdout ?? "");
196
+ }
197
+ function installPlugin() {
198
+ if (!claudeAvailable()) {
199
+ return { ok: false, message: "Claude Code (`claude`) is not on your PATH. Install it first: https://docs.claude.com/claude-code" };
200
+ }
201
+ const root = packageRoot();
202
+ spawnSync("claude", ["plugin", "marketplace", "remove", "vibegroup"], { stdio: "ignore" });
203
+ const add = spawnSync("claude", ["plugin", "marketplace", "add", root], { stdio: "inherit" });
204
+ if (add.status !== 0)
205
+ return { ok: false, message: "failed to add the vibegroup marketplace" };
206
+ const inst = spawnSync("claude", ["plugin", "install", "vibegroup@vibegroup"], { stdio: "inherit" });
207
+ if (inst.status !== 0 && !pluginInstalled())
208
+ return { ok: false, message: "failed to install the vibegroup plugin" };
209
+ return { ok: true, message: "plugin installed" };
210
+ }
211
+ var init_pluginInstall = () => {};
212
+
213
+ // src/commands/install.ts
214
+ var exports_install = {};
215
+ __export(exports_install, {
216
+ installCommand: () => installCommand
217
+ });
218
+ async function installCommand() {
219
+ console.log(`Installing the vibegroup plugin into Claude Code…
220
+ `);
221
+ const r = installPlugin();
222
+ if (!r.ok) {
223
+ console.error(r.message);
224
+ return 1;
225
+ }
226
+ console.log("\n✓ Plugin installed. Next: `vibegroup init` to enable the channel + sign in.");
227
+ return 0;
228
+ }
229
+ var init_install = __esm(() => {
230
+ init_pluginInstall();
231
+ });
232
+
181
233
  // src/ui/runner.ts
182
234
  import { render } from "ink";
183
235
  function runInk(make) {
@@ -551,20 +603,9 @@ var exports_init = {};
551
603
  __export(exports_init, {
552
604
  initCommand: () => initCommand
553
605
  });
554
- import { spawnSync } from "node:child_process";
606
+ import { spawnSync as spawnSync2 } from "node:child_process";
555
607
  import { existsSync as existsSync3, readFileSync as readFileSync3 } from "node:fs";
556
- import { fileURLToPath } from "node:url";
557
- import { dirname as dirname2, join as join2 } from "node:path";
558
- function packageRoot() {
559
- return join2(dirname2(fileURLToPath(import.meta.url)), "..");
560
- }
561
- function commandExists(cmd) {
562
- return spawnSync(cmd, ["--version"], { stdio: "ignore" }).status === 0;
563
- }
564
- function pluginInstalled() {
565
- const r = spawnSync("claude", ["plugin", "list"], { encoding: "utf8" });
566
- return r.status === 0 && /vibegroup@vibegroup/.test(r.stdout ?? "");
567
- }
608
+ import { dirname as dirname3 } from "node:path";
568
609
  function readManagedSettings() {
569
610
  try {
570
611
  const p = managedSettingsPath();
@@ -576,15 +617,15 @@ function readManagedSettings() {
576
617
  function writeAllowlistWithSudo() {
577
618
  const path = managedSettingsPath();
578
619
  const json2 = JSON.stringify(mergeManagedSettings(readManagedSettings()), null, 2);
579
- const script = `mkdir -p "${dirname2(path)}" && cat > "${path}"`;
580
- const r = spawnSync("sudo", ["sh", "-c", script], { input: json2, stdio: ["pipe", "inherit", "inherit"] });
620
+ const script = `mkdir -p "${dirname3(path)}" && cat > "${path}"`;
621
+ const r = spawnSync2("sudo", ["sh", "-c", script], { input: json2, stdio: ["pipe", "inherit", "inherit"] });
581
622
  return r.status === 0;
582
623
  }
583
624
  async function initCommand(rest, flags = {}, env = process.env) {
584
625
  const dev = flags.dev === true;
585
626
  console.log(`vibegroup setup
586
627
  `);
587
- if (!commandExists("claude")) {
628
+ if (!claudeAvailable()) {
588
629
  console.error("Claude Code (`claude`) is not on your PATH. Install it first: https://docs.claude.com/claude-code");
589
630
  return 1;
590
631
  }
@@ -592,10 +633,9 @@ async function initCommand(rest, flags = {}, env = process.env) {
592
633
  console.log("✓ Plugin already installed.");
593
634
  } else {
594
635
  console.log("• Installing the vibegroup plugin into Claude Code…");
595
- spawnSync("claude", ["plugin", "marketplace", "add", packageRoot()], { stdio: "inherit" });
596
- spawnSync("claude", ["plugin", "install", "vibegroup@vibegroup"], { stdio: "inherit" });
597
- if (!pluginInstalled()) {
598
- console.error("Plugin install did not complete. Try manually: claude plugin install vibegroup@vibegroup");
636
+ const r = installPlugin();
637
+ if (!r.ok) {
638
+ console.error(r.message);
599
639
  return 1;
600
640
  }
601
641
  console.log("✓ Plugin installed.");
@@ -632,6 +672,7 @@ async function initCommand(rest, flags = {}, env = process.env) {
632
672
  var init_init = __esm(() => {
633
673
  init_auth();
634
674
  init_allowlist();
675
+ init_pluginInstall();
635
676
  init_login();
636
677
  });
637
678
 
@@ -753,7 +794,7 @@ var init_team = __esm(() => {
753
794
  });
754
795
 
755
796
  // src/lib/claudeLaunch.ts
756
- import { spawnSync as spawnSync2 } from "node:child_process";
797
+ import { spawnSync as spawnSync3 } from "node:child_process";
757
798
  function buildClaudeArgs(opts = {}) {
758
799
  const extra = opts.extraArgs ?? [];
759
800
  return opts.dangerously ? ["--dangerously-load-development-channels", CHANNEL_SPEC, ...extra] : ["--channels", CHANNEL_SPEC, ...extra];
@@ -762,7 +803,7 @@ function launchClaude(opts = {}, launcher = defaultLauncher) {
762
803
  return launcher("claude", buildClaudeArgs(opts), opts.env);
763
804
  }
764
805
  var CHANNEL_SPEC = "plugin:vibegroup@vibegroup", defaultLauncher = (cmd, args, env) => {
765
- const r = spawnSync2(cmd, args, { stdio: "inherit", env: env ? { ...process.env, ...env } : process.env });
806
+ const r = spawnSync3(cmd, args, { stdio: "inherit", env: env ? { ...process.env, ...env } : process.env });
766
807
  if (r.error)
767
808
  throw r.error;
768
809
  return r.status ?? 0;
@@ -893,6 +934,10 @@ async function run(argv, env = process.env) {
893
934
  const { allowlistPathCommand: allowlistPathCommand2 } = await Promise.resolve().then(() => (init_allowlist2(), exports_allowlist));
894
935
  return allowlistPathCommand2();
895
936
  }
937
+ case "install": {
938
+ const { installCommand: installCommand2 } = await Promise.resolve().then(() => (init_install(), exports_install));
939
+ return installCommand2();
940
+ }
896
941
  case "init": {
897
942
  const { initCommand: initCommand2 } = await Promise.resolve().then(() => (init_init(), exports_init));
898
943
  return initCommand2(rest, flags, env);
@@ -929,6 +974,7 @@ var VERSION, DEFAULT_API_BASE2 = "https://api.vibegroup.sh", HELP = `vibegroup
929
974
  Usage: vibegroup <command> [options]
930
975
 
931
976
  Commands:
977
+ install Register the vibegroup plugin in Claude Code (also: npx vibegroup install)
932
978
  init [email] One-time setup: install the plugin, enable the channel, sign in
933
979
  login [email] Sign in / sign up (opens your browser, verifies email)
934
980
  logout Clear the cached session
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibegroup",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
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": {
@@ -9,7 +9,6 @@
9
9
  "files": [
10
10
  "dist/cli.js",
11
11
  "README.md",
12
- "scripts/postinstall.mjs",
13
12
  ".claude-plugin/marketplace.json",
14
13
  "plugin/.claude-plugin",
15
14
  "plugin/.mcp.json",
@@ -37,7 +36,6 @@
37
36
  "build:server": "cd packages/server && bun run build",
38
37
  "build": "bun run build:relay && bun run build:server && bun run build:plugin && bun run build:cli",
39
38
  "prepublishOnly": "bun run build:plugin && bun run build:cli",
40
- "postinstall": "node scripts/postinstall.mjs",
41
39
  "test:cli": "bun test ./test/",
42
40
  "test:protocol": "cd packages/protocol && bun test",
43
41
  "test:relay": "cd packages/relay && bun test",
@@ -1,38 +0,0 @@
1
- // Best-effort: after `npm i -g vibegroup`, register the plugin into Claude Code so
2
- // it's usable immediately. The channel allowlist (needs sudo) and sign-in still
3
- // happen in `vibegroup init`. Never fails the install — only global installs act.
4
- import { spawnSync } from 'node:child_process'
5
- import { fileURLToPath } from 'node:url'
6
- import { dirname, join } from 'node:path'
7
-
8
- try {
9
- if (process.env.npm_config_global !== 'true') process.exit(0)
10
-
11
- const has = (cmd) => {
12
- try {
13
- return spawnSync(cmd, ['--version'], { stdio: 'ignore' }).status === 0
14
- } catch {
15
- return false
16
- }
17
- }
18
-
19
- if (!has('claude')) {
20
- console.log('\nvibegroup installed. Install Claude Code, then run `vibegroup init` to set up the plugin + channel.\n')
21
- process.exit(0)
22
- }
23
-
24
- const list = spawnSync('claude', ['plugin', 'list'], { encoding: 'utf8' })
25
- if (list.status === 0 && /vibegroup@vibegroup/.test(list.stdout ?? '')) {
26
- console.log('\nvibegroup plugin already registered. Finish setup any time with `vibegroup init`.\n')
27
- process.exit(0)
28
- }
29
-
30
- const root = join(dirname(fileURLToPath(import.meta.url)), '..')
31
- console.log('\nRegistering the vibegroup plugin in Claude Code…')
32
- spawnSync('claude', ['plugin', 'marketplace', 'add', root], { stdio: 'inherit' })
33
- spawnSync('claude', ['plugin', 'install', 'vibegroup@vibegroup'], { stdio: 'inherit' })
34
- console.log('\n✓ Plugin registered. Next: run `vibegroup init` (enables the channel + signs you in).\n')
35
- } catch {
36
- // never break the install
37
- process.exit(0)
38
- }