@botbuddy/cli 1.0.0 → 1.1.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botbuddy/cli",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "BotBuddy — Swarm coordination CLI for multi-agent workflows",
5
5
  "type": "module",
6
6
  "bin": {
@@ -47,18 +47,18 @@ export async function runBridge(args) {
47
47
  let wsPort = 4500;
48
48
  let repoPath = process.cwd();
49
49
  let model = "gpt-5.4";
50
- let autoStart = false;
50
+ let noServer = false;
51
51
 
52
52
  for (let i = 0; i < args.length; i++) {
53
53
  if ((args[i] === "--port" || args[i] === "-p") && args[i + 1]) wsPort = parseInt(args[++i], 10);
54
54
  else if ((args[i] === "--repo" || args[i] === "-r") && args[i + 1]) repoPath = args[++i];
55
55
  else if ((args[i] === "--model" || args[i] === "-m") && args[i + 1]) model = args[++i];
56
- else if (args[i] === "--auto-start") autoStart = true;
56
+ else if (args[i] === "--no-server") noServer = true;
57
57
  }
58
58
 
59
59
  const wsUrl = `ws://127.0.0.1:${wsPort}`;
60
- const hostname = (await import("os")).then(m => m.hostname());
61
- const host = await hostname;
60
+ const { hostname: getHostname } = await import("os");
61
+ const host = getHostname();
62
62
 
63
63
  console.log(`${bold("BotBuddy Codex Bridge")}\n`);
64
64
  console.log(` ${dim("WebSocket:")} ${cyan(wsUrl)}`);
@@ -67,6 +67,50 @@ export async function runBridge(args) {
67
67
  console.log(` ${dim("Host:")} ${dim(host)}`);
68
68
  console.log(` ${dim("Security:")} ${green("HMAC-SHA256")} session signing + ${green("loopback-only")} WS\n`);
69
69
 
70
+ // ── Step 0: Auto-start codex app-server ──
71
+ let serverProc = null;
72
+ if (!noServer) {
73
+ console.log(dim("→ Starting codex app-server..."));
74
+ const { spawn } = await import("child_process");
75
+ serverProc = spawn("codex", ["app-server", "--listen", wsUrl], {
76
+ stdio: ["ignore", "pipe", "pipe"],
77
+ env: { ...process.env },
78
+ });
79
+
80
+ serverProc.on("error", (err) => {
81
+ if (err.code === "ENOENT") {
82
+ console.log(` ${red("✗")} 'codex' not found in PATH. Install it or use ${cyan("--no-server")} to skip.`);
83
+ process.exit(1);
84
+ }
85
+ console.error(` ${red("✗")} Failed to start codex app-server: ${err.message}`);
86
+ });
87
+
88
+ // Wait for the server to be ready
89
+ await new Promise((resolve) => {
90
+ let resolved = false;
91
+ serverProc.stdout.on("data", (chunk) => {
92
+ const text = chunk.toString();
93
+ if (!resolved && text.includes("listening on")) {
94
+ resolved = true;
95
+ console.log(` ${green("✓")} codex app-server started on port ${wsPort}`);
96
+ resolve();
97
+ }
98
+ });
99
+ serverProc.stderr.on("data", (chunk) => {
100
+ const text = chunk.toString().trim();
101
+ if (text) console.log(` ${dim(`[codex] ${text}`)}`);
102
+ });
103
+ // Timeout fallback — proceed after 5s even if we didn't see the message
104
+ setTimeout(() => {
105
+ if (!resolved) {
106
+ resolved = true;
107
+ console.log(` ${yellow("⚠")} Proceeding without readiness confirmation`);
108
+ resolve();
109
+ }
110
+ }, 5000);
111
+ });
112
+ }
113
+
70
114
  // ── Step 1: Register bridge session with BotBuddy ──
71
115
  console.log(dim("→ Connecting to BotBuddy..."));
72
116
  const session = await relayPost("/bridge/connect", {
@@ -417,6 +461,10 @@ export async function runBridge(args) {
417
461
  await relayPost("/bridge/disconnect", { session_id: sessionId });
418
462
  } catch {}
419
463
  if (ws) ws.close();
464
+ if (serverProc) {
465
+ console.log(dim("→ Stopping codex app-server..."));
466
+ serverProc.kill("SIGTERM");
467
+ }
420
468
  console.log(`${green("✓")} Bridge disconnected.`);
421
469
  process.exit(0);
422
470
  };
package/src/commands.mjs CHANGED
@@ -76,11 +76,11 @@ ${bold("BROWSE")}
76
76
  browse agents|tasks|resources|activity|settings
77
77
 
78
78
  ${bold("CODEX")}
79
- codex bridge [options] Start Codex app-server bridge
79
+ codex bridge [options] Start Codex app-server + bridge (single command)
80
80
  -p, --port <port> WebSocket port (default: 4500)
81
81
  -r, --repo <path> Repository path (default: cwd)
82
82
  -m, --model <model> Default model (default: gpt-5.4)
83
- --auto-start Auto-start app-server
83
+ --no-server Don't auto-start app-server (if already running)
84
84
 
85
85
  ${bold("OTHER")}
86
86
  help Show this help