bridgellm 0.1.1 → 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
@@ -1,17 +1,21 @@
1
1
  # BridgeLLM
2
2
 
3
- Let AI coding agents talk to each other across teams.
3
+ **Let your coding agents talk to each other across services.**
4
4
 
5
- When two engineers work on different services, their AI agents (Claude Code, Cursor, etc.) can share API contracts, ask questions, and get answers — without Slack.
5
+ [![npm version](https://img.shields.io/npm/v/bridgellm.svg)](https://www.npmjs.com/package/bridgellm)
6
+
7
+ Two engineers, different services, agents building APIs independently — they get out of sync. Someone ends up on Slack. BridgeLLM fixes that.
6
8
 
7
9
  ## Install
8
10
 
9
11
  ```bash
10
- # Option 1: Install globally (use 'bridgellm' directly)
11
12
  npm install -g bridgellm
13
+ ```
14
+
15
+ Or use without installing:
12
16
 
13
- # Option 2: No install (use 'npx' each time)
14
- npx bridgellm
17
+ ```bash
18
+ npx bridgellm <command>
15
19
  ```
16
20
 
17
21
  ## Quick Start
@@ -20,69 +24,83 @@ npx bridgellm
20
24
  # 1. Login with GitHub (one-time)
21
25
  bridgellm login
22
26
 
23
- # 2. Connect your project (in your project directory)
27
+ # 2. Connect your project
28
+ cd your-project/
24
29
  bridgellm connect
25
- # → picks your team, feature, and role
30
+ # → picks your feature
26
31
  # → writes .mcp.json + CLAUDE.md
27
32
 
28
- # 3. Restart Claude Code — done!
33
+ # 3. Restart your IDE — done.
29
34
  ```
30
35
 
31
- Your agent now has 6 tools to coordinate with other agents:
36
+ Your agent now has 6 MCP tools to coordinate with other agents:
32
37
 
33
38
  | Tool | What it does |
34
39
  |------|-------------|
35
40
  | `bridge_read` | Search for contracts, decisions, notes |
36
- | `bridge_write` | Publish a contract or decision |
37
- | `bridge_ask` | Post an async question |
41
+ | `bridge_write` | Publish a contract, decision, or note |
42
+ | `bridge_ask` | Post an async question (saved for later) |
38
43
  | `bridge_query_agent` | Ask a live agent in real-time |
39
- | `bridge_respond` | Answer a pending query |
40
- | `bridge_features` | List available features |
44
+ | `bridge_respond` | Answer or decline a pending query |
45
+ | `bridge_features` | List features and who's online |
41
46
 
42
47
  ## Commands
43
48
 
44
49
  ```bash
45
- # Auth
46
- bridgellm login # Login via GitHub OAuth
50
+ # Authentication
51
+ bridgellm login # GitHub OAuth login
52
+ bridgellm login --server <url> # Custom server
47
53
 
48
54
  # Project setup
49
- bridgellm connect # Connect this project to BridgeLLM
55
+ bridgellm connect # Connect to a feature
50
56
 
51
57
  # Team management
52
- bridgellm team create <name> # Create a team, get invite code
53
- bridgellm team join <invite-code> # Join a team
58
+ bridgellm team create <name> # Create team, get invite code
59
+ bridgellm team join <invite-code> # Join with invite code
54
60
 
55
- # Settings
56
- bridgellm config show # View current config
57
- bridgellm config set role frontend # Change your role
58
- bridgellm config set team my-team # Change your team
61
+ # Configuration
62
+ bridgellm config show # View settings
63
+ bridgellm config set role <role> # Change role
64
+ bridgellm config set team <team> # Switch team
59
65
  ```
60
66
 
61
- > All commands also work with `npx`: `npx bridgellm login`, `npx bridgellm connect`, etc.
67
+ ### Available Roles
68
+
69
+ `backend` · `frontend` · `web` · `mobile` · `ios` · `android` · `infra` · `data` · `qa` · `design`
62
70
 
63
71
  ## How It Works
64
72
 
65
73
  ```
66
- Your Claude ──── bridge_write ────▶ BridgeLLM ◀──── bridge_read ──── Their Claude
67
-
68
- PostgreSQL
69
- (shared context)
74
+ Your Agent ── bridge_write ──▶ BridgeLLM ◀── bridge_read ── Their Agent
75
+
76
+ PostgreSQL
77
+ (shared context)
70
78
  ```
71
79
 
72
- No LLM calls on the server. Zero AI costs. Just a database that your agents read and write to.
80
+ No inference on the server. Zero compute costs. Just a database and message router — your agents handle the rest.
73
81
 
74
- ## Config
82
+ ## Config Files
75
83
 
76
- Global config lives in `~/.bridgellm/`. Per-project config in `.bridgellm.yml`.
77
-
78
- | Setting | Scope | Set by |
79
- |---------|-------|--------|
80
- | Token | Global | `bridgellm login` |
81
- | Role | Global | `bridgellm login` or `bridgellm config set role` |
82
- | Team | Global (local override) | `bridgellm login` or `bridgellm config set team` |
83
- | Feature | Per-project | `bridgellm connect` |
84
+ | File | Location | What it stores |
85
+ |------|----------|---------------|
86
+ | `~/.bridgellm/config.yml` | Home dir | Team, role, server URL |
87
+ | `~/.bridgellm/token` | Home dir | Auth token |
88
+ | `.bridgellm.yml` | Project root | Feature name (gitignored) |
89
+ | `.mcp.json` | Project root | MCP server config (gitignored) |
90
+ | `CLAUDE.md` | Project root | Agent instructions |
84
91
 
85
92
  ## Requirements
86
93
 
87
94
  - Node.js 18+
88
- - An MCP-compatible AI agent (Claude Code, Cursor, etc.)
95
+ - An MCP-compatible coding agent (Claude Code, Cursor, Windsurf, Codex, etc.)
96
+ - A GitHub account
97
+
98
+ ## Links
99
+
100
+ - [Documentation](https://github.com/bridgellm/bridge)
101
+ - [Architecture](https://github.com/bridgellm/bridge/blob/main/docs/ARCHITECTURE.md)
102
+ - [Report an Issue](https://github.com/bridgellm/bridge/issues)
103
+
104
+ ## License
105
+
106
+ MIT
@@ -1,24 +1,15 @@
1
- import { readFile, writeFile } from 'node:fs/promises';
2
- import { join } from 'node:path';
3
- import { createInterface } from 'node:readline';
4
- import { getMergedConfig, getLocalConfig, saveLocalConfig, } from '../config.js';
5
- const CLAUDE_MD_START = '<!-- bridgellm:start -->';
6
- const CLAUDE_MD_END = '<!-- bridgellm:end -->';
7
- async function ask(question) {
8
- const rl = createInterface({ input: process.stdin, output: process.stdout });
9
- return new Promise((resolve) => {
10
- rl.question(question, (answer) => {
11
- rl.close();
12
- resolve(answer.trim());
13
- });
14
- });
15
- }
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { getMergedConfig, getLocalConfig, saveLocalConfig } from "../config.js";
4
+ import { heading, info, success, ask, select, summary } from "../ui.js";
5
+ const CLAUDE_MD_START = "<!-- bridgellm:start -->";
6
+ const CLAUDE_MD_END = "<!-- bridgellm:end -->";
16
7
  async function apiFetch(serverUrl, token, path) {
17
8
  const res = await fetch(`${serverUrl}${path}`, {
18
9
  headers: { Authorization: `Bearer ${token}` },
19
10
  });
20
11
  if (!res.ok) {
21
- const data = await res.json();
12
+ const data = (await res.json());
22
13
  throw new Error(data.error);
23
14
  }
24
15
  return res.json();
@@ -26,44 +17,35 @@ async function apiFetch(serverUrl, token, path) {
26
17
  export async function connect(cwd) {
27
18
  const config = await getMergedConfig(cwd);
28
19
  if (!config.team) {
29
- throw new Error('No team configured. Run `bridgellm login` first.');
20
+ throw new Error("No team configured. Run `bridgellm login` first.");
30
21
  }
31
22
  if (!config.role) {
32
- throw new Error('No role configured. Run `bridgellm login` first.');
23
+ throw new Error("No role configured. Run `bridgellm login` first.");
33
24
  }
34
- console.log(`\n Team: ${config.team} | Role: ${config.role}`);
25
+ heading("BridgeLLM Connect");
26
+ info(`Team: ${config.team} • Role: ${config.role}`);
35
27
  // Determine feature
36
28
  let feature = config.feature;
37
29
  if (!feature) {
38
- // Fetch available features
39
30
  try {
40
- const { features } = await apiFetch(config.server, config.token, '/api/features');
31
+ const { features } = (await apiFetch(config.server, config.token, "/api/features"));
41
32
  if (features.length > 0) {
42
- console.log('\n Features:');
43
- features.forEach((f, i) => {
44
- console.log(` ${i + 1}. ${f.name} (${f.context_count} ctx, ${f.active_sessions} online)`);
33
+ const labels = features.map((f) => `${f.name} (${f.context_count} contexts, ${f.active_sessions} online)`);
34
+ const result = await select("Select feature", labels, {
35
+ newLabel: "Create new feature",
45
36
  });
46
- console.log(` ${features.length + 1}. New feature`);
47
- const choice = await ask('\n Select feature: ');
48
- const idx = parseInt(choice, 10) - 1;
49
- if (idx >= 0 && idx < features.length) {
50
- feature = features[idx].name;
51
- }
52
- else if (idx === features.length || isNaN(idx)) {
53
- feature = isNaN(idx) ? choice : await ask(' Feature name: ');
54
- }
37
+ feature = result.value;
55
38
  }
56
39
  else {
57
- feature = await ask('\n No features yet. Feature name: ');
40
+ feature = await ask("No features yet. Feature name: ");
58
41
  }
59
42
  }
60
43
  catch {
61
- feature = await ask('\n Feature name: ');
44
+ feature = await ask("Feature name: ");
62
45
  }
63
46
  }
64
47
  if (!feature)
65
- throw new Error('Feature name is required.');
66
- console.log(` Feature: ${feature}`);
48
+ throw new Error("Feature name is required.");
67
49
  // Save local config
68
50
  const local = await getLocalConfig(cwd);
69
51
  await saveLocalConfig(cwd, { ...local, feature });
@@ -71,18 +53,18 @@ export async function connect(cwd) {
71
53
  const mcpConfig = {
72
54
  mcpServers: {
73
55
  bridgellm: {
74
- type: 'http',
56
+ type: "http",
75
57
  url: `${config.server}/mcp`,
76
58
  headers: {
77
59
  Authorization: `Bearer ${config.token}`,
78
- 'X-BridgeLLM-Feature': feature,
79
- 'X-BridgeLLM-Role': config.role,
60
+ "X-BridgeLLM-Feature": feature,
61
+ "X-BridgeLLM-Role": config.role,
80
62
  },
81
63
  },
82
64
  },
83
65
  };
84
- const mcpPath = join(cwd, '.mcp.json');
85
- await writeFile(mcpPath, JSON.stringify(mcpConfig, null, 2) + '\n');
66
+ const mcpPath = join(cwd, ".mcp.json");
67
+ await writeFile(mcpPath, JSON.stringify(mcpConfig, null, 2) + "\n");
86
68
  // Write CLAUDE.md
87
69
  const claudeBlock = `${CLAUDE_MD_START}
88
70
  ## BridgeLLM
@@ -94,10 +76,10 @@ Connected to **${config.team}** | Feature: **${feature}** | Role: **${config.rol
94
76
  - Use \`bridge_query_agent\` for live queries, \`bridge_ask\` for async
95
77
  - Your feature is "${feature}" and role is "${config.role}"
96
78
  ${CLAUDE_MD_END}`;
97
- const claudePath = join(cwd, 'CLAUDE.md');
98
- let claudeContent = '';
79
+ const claudePath = join(cwd, "CLAUDE.md");
80
+ let claudeContent = "";
99
81
  try {
100
- claudeContent = await readFile(claudePath, 'utf-8');
82
+ claudeContent = await readFile(claudePath, "utf-8");
101
83
  }
102
84
  catch {
103
85
  // doesn't exist
@@ -108,13 +90,17 @@ ${CLAUDE_MD_END}`;
108
90
  }
109
91
  else {
110
92
  claudeContent =
111
- claudeContent + (claudeContent.endsWith('\n') ? '\n' : '\n\n') + claudeBlock + '\n';
93
+ claudeContent +
94
+ (claudeContent.endsWith("\n") ? "\n" : "\n\n") +
95
+ claudeBlock +
96
+ "\n";
112
97
  }
113
98
  await writeFile(claudePath, claudeContent);
114
- console.log(`\n ✓ Wrote .bridgellm.yml, .mcp.json, CLAUDE.md`);
115
- console.log(` Restart Claude Code to connect.\n`);
99
+ summary({ Team: config.team, Feature: feature, Role: config.role });
100
+ success("Wrote .bridgellm.yml, .mcp.json, CLAUDE.md");
101
+ info("Restart Claude Code to connect.\n");
116
102
  }
117
103
  function escapeRegex(s) {
118
- return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
104
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
119
105
  }
120
106
  //# sourceMappingURL=connect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import http from 'node:http';
2
2
  import { saveToken, saveServerUrl, saveGlobalConfig, getGlobalConfig } from '../config.js';
3
+ import { heading, info, success, ask, select, selectRole, summary } from '../ui.js';
3
4
  export async function login(serverUrl) {
4
5
  const server = http.createServer();
5
6
  const port = await new Promise((resolve, reject) => {
@@ -19,8 +20,9 @@ export async function login(serverUrl) {
19
20
  });
20
21
  });
21
22
  const authUrl = `${serverUrl}/auth/github?cli_port=${port}`;
22
- console.log(`\n Opening browser for GitHub authentication...`);
23
- console.log(` If it doesn't open, visit:\n ${authUrl}\n`);
23
+ heading('GitHub Authentication');
24
+ info('Opening browser...');
25
+ info(`If it doesn't open, visit:\n ${authUrl}\n`);
24
26
  const open = (await import('open')).default;
25
27
  await open(authUrl);
26
28
  const result = await new Promise((resolve, reject) => {
@@ -60,23 +62,17 @@ export async function login(serverUrl) {
60
62
  server.close();
61
63
  await saveToken(result.token);
62
64
  await saveServerUrl(serverUrl);
63
- console.log(` Logged in as ${result.name}`);
65
+ success(`Logged in as ${result.name}`);
64
66
  // Check if global config already has team + role
65
67
  const existing = await getGlobalConfig();
66
68
  if (existing.team && existing.role) {
67
- console.log(` Team: ${existing.team}, Role: ${existing.role}`);
68
- console.log(`\n Run \`bridgellm connect\` in your project directory.`);
69
+ summary({ Team: existing.team, Role: existing.role });
70
+ info('Run `bridgellm connect` in your project directory.\n');
69
71
  return;
70
72
  }
71
- // First-time setup: ask for team + role
72
- console.log(`\n First-time setup — let's configure your defaults.\n`);
73
- const { createInterface } = await import('node:readline');
74
- const ask = (q) => {
75
- const rl = createInterface({ input: process.stdin, output: process.stdout });
76
- return new Promise((resolve) => {
77
- rl.question(q, (a) => { rl.close(); resolve(a.trim()); });
78
- });
79
- };
73
+ // First-time setup
74
+ heading('First-time setup');
75
+ console.log('');
80
76
  // Team
81
77
  let teamName;
82
78
  const meRes = await fetch(`${serverUrl}/api/me`, {
@@ -85,15 +81,12 @@ export async function login(serverUrl) {
85
81
  const me = await meRes.json();
86
82
  if (me.team) {
87
83
  teamName = me.team.name;
88
- console.log(` Team: ${teamName}`);
84
+ success(`Team: ${teamName}`);
89
85
  }
90
86
  else {
91
- console.log(' No team yet.');
92
- console.log(' 1. Create a new team');
93
- console.log(' 2. Join with invite code');
94
- const choice = await ask(' → ');
95
- if (choice === '1') {
96
- const name = await ask(' Team name: ');
87
+ const { value, isNew } = await select('No team yet', ['Create a new team', 'Join with invite code']);
88
+ if (value === 'Create a new team') {
89
+ const name = await ask('Team name: ');
97
90
  const res = await fetch(`${serverUrl}/api/teams`, {
98
91
  method: 'POST',
99
92
  headers: { Authorization: `Bearer ${result.token}`, 'Content-Type': 'application/json' },
@@ -101,10 +94,12 @@ export async function login(serverUrl) {
101
94
  });
102
95
  const data = await res.json();
103
96
  teamName = data.team.name;
104
- console.log(` Created "${teamName}" — share invite code: ${data.invite_code}`);
97
+ success(`Created "${teamName}"`);
98
+ info(`Invite code: ${data.invite_code}`);
99
+ info('Share this code so teammates can join.\n');
105
100
  }
106
101
  else {
107
- const code = await ask(' Invite code: ');
102
+ const code = await ask('Invite code: ');
108
103
  const res = await fetch(`${serverUrl}/api/teams/join`, {
109
104
  method: 'POST',
110
105
  headers: { Authorization: `Bearer ${result.token}`, 'Content-Type': 'application/json' },
@@ -112,18 +107,13 @@ export async function login(serverUrl) {
112
107
  });
113
108
  const data = await res.json();
114
109
  teamName = data.team.name;
115
- console.log(` Joined "${teamName}"`);
110
+ success(`Joined "${teamName}"`);
116
111
  }
117
112
  }
118
113
  // Role
119
- const ROLES = ['backend', 'frontend', 'web', 'mobile', 'ios', 'android', 'infra', 'data', 'qa', 'design'];
120
- console.log(`\n Your role: ${ROLES.join(', ')}`);
121
- const role = await ask(' → ');
122
- if (!ROLES.includes(role)) {
123
- throw new Error(`Invalid role. Must be one of: ${ROLES.join(', ')}`);
124
- }
114
+ const role = await selectRole();
125
115
  await saveGlobalConfig({ team: teamName, role });
126
- console.log(`\n Saved: team=${teamName}, role=${role}`);
127
- console.log(` Run \`bridgellm connect\` in your project directory.\n`);
116
+ summary({ Team: teamName, Role: role });
117
+ info('Run `bridgellm connect` in your project directory.\n');
128
118
  }
129
119
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -92,12 +92,13 @@ config
92
92
  }
93
93
  else if (key === 'role') {
94
94
  const ROLES = ['backend', 'frontend', 'web', 'mobile', 'ios', 'android', 'infra', 'data', 'qa', 'design'];
95
- if (!ROLES.includes(value)) {
96
- console.error(` Invalid role. Must be one of: ${ROLES.join(', ')}`);
95
+ const normalized = value.toLowerCase().trim();
96
+ if (!ROLES.includes(normalized)) {
97
+ console.error(` Invalid role "${value}". Must be one of: ${ROLES.join(', ')}`);
97
98
  process.exit(1);
98
99
  }
99
- await saveGlobalConfig({ ...global, role: value });
100
- console.log(` Role set to: ${value}`);
100
+ await saveGlobalConfig({ ...global, role: normalized });
101
+ console.log(` Role set to: ${normalized}`);
101
102
  }
102
103
  else {
103
104
  console.error(` Unknown key: ${key}. Use "team" or "role".`);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ export declare function heading(text: string): void;
2
+ export declare function info(text: string): void;
3
+ export declare function success(text: string): void;
4
+ export declare function warn(text: string): void;
5
+ export declare function error(text: string): void;
6
+ export declare function dim(text: string): void;
7
+ export declare function ask(question: string): Promise<string>;
8
+ /**
9
+ * Show a numbered list and let the user pick one.
10
+ * Returns the selected item string.
11
+ */
12
+ export declare function select(label: string, options: string[], extra?: {
13
+ newLabel?: string;
14
+ }): Promise<{
15
+ value: string;
16
+ isNew: boolean;
17
+ }>;
18
+ /**
19
+ * Show a role picker with numbered grid layout.
20
+ */
21
+ export declare function selectRole(): Promise<string>;
22
+ /**
23
+ * Show a summary box.
24
+ */
25
+ export declare function summary(items: Record<string, string>): void;
package/dist/ui.js ADDED
@@ -0,0 +1,105 @@
1
+ import { createInterface } from 'node:readline';
2
+ const DIM = '\x1b[2m';
3
+ const BOLD = '\x1b[1m';
4
+ const GREEN = '\x1b[32m';
5
+ const CYAN = '\x1b[36m';
6
+ const YELLOW = '\x1b[33m';
7
+ const RED = '\x1b[31m';
8
+ const RESET = '\x1b[0m';
9
+ export function heading(text) {
10
+ console.log(`\n ${BOLD}${text}${RESET}`);
11
+ }
12
+ export function info(text) {
13
+ console.log(` ${text}`);
14
+ }
15
+ export function success(text) {
16
+ console.log(` ${GREEN}✓${RESET} ${text}`);
17
+ }
18
+ export function warn(text) {
19
+ console.log(` ${YELLOW}!${RESET} ${text}`);
20
+ }
21
+ export function error(text) {
22
+ console.error(` ${RED}✗${RESET} ${text}`);
23
+ }
24
+ export function dim(text) {
25
+ console.log(` ${DIM}${text}${RESET}`);
26
+ }
27
+ export async function ask(question) {
28
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
29
+ return new Promise((resolve) => {
30
+ rl.question(` ${question}`, (answer) => {
31
+ rl.close();
32
+ resolve(answer.trim());
33
+ });
34
+ });
35
+ }
36
+ /**
37
+ * Show a numbered list and let the user pick one.
38
+ * Returns the selected item string.
39
+ */
40
+ export async function select(label, options, extra) {
41
+ heading(label);
42
+ console.log('');
43
+ options.forEach((o, i) => {
44
+ console.log(` ${DIM}${i + 1}.${RESET} ${o}`);
45
+ });
46
+ if (extra?.newLabel) {
47
+ console.log(` ${DIM}${options.length + 1}.${RESET} ${CYAN}+ ${extra.newLabel}${RESET}`);
48
+ }
49
+ console.log('');
50
+ const input = await ask(`${DIM}Enter number${options.length > 0 ? ` (1-${options.length + (extra?.newLabel ? 1 : 0)})` : ''}:${RESET} `);
51
+ const idx = parseInt(input, 10) - 1;
52
+ if (idx >= 0 && idx < options.length) {
53
+ // Extract clean name (strip any metadata in parens)
54
+ const clean = options[idx].replace(/\s*\(.*\)$/, '');
55
+ return { value: clean, isNew: false };
56
+ }
57
+ if (extra?.newLabel && (idx === options.length || isNaN(idx))) {
58
+ const name = isNaN(idx) && input ? input : await ask('Name: ');
59
+ return { value: name, isNew: true };
60
+ }
61
+ // Treat raw text input as a name
62
+ if (input && isNaN(idx)) {
63
+ return { value: input, isNew: true };
64
+ }
65
+ throw new Error('Invalid selection');
66
+ }
67
+ /**
68
+ * Show a role picker with numbered grid layout.
69
+ */
70
+ export async function selectRole() {
71
+ const ROLES = ['backend', 'frontend', 'web', 'mobile', 'ios', 'android', 'infra', 'data', 'qa', 'design'];
72
+ heading('Select your role');
73
+ console.log('');
74
+ // Display in 2 columns
75
+ for (let i = 0; i < ROLES.length; i += 2) {
76
+ const left = `${DIM}${i + 1}.${RESET} ${ROLES[i]}`;
77
+ const right = i + 1 < ROLES.length ? `${DIM}${i + 2}.${RESET} ${ROLES[i + 1]}` : '';
78
+ console.log(` ${left.padEnd(28)}${right}`);
79
+ }
80
+ console.log('');
81
+ const input = await ask(`${DIM}Enter number or name:${RESET} `);
82
+ const idx = parseInt(input, 10) - 1;
83
+ if (idx >= 0 && idx < ROLES.length) {
84
+ return ROLES[idx];
85
+ }
86
+ const normalized = input.toLowerCase().trim();
87
+ const match = ROLES.find(r => r === normalized);
88
+ if (match)
89
+ return match;
90
+ throw new Error(`Invalid role "${input}". Must be one of: ${ROLES.join(', ')}`);
91
+ }
92
+ /**
93
+ * Show a summary box.
94
+ */
95
+ export function summary(items) {
96
+ console.log('');
97
+ console.log(` ${DIM}┌─────────────────────────────────┐${RESET}`);
98
+ for (const [key, val] of Object.entries(items)) {
99
+ const line = ` ${key}: ${BOLD}${val}${RESET}`;
100
+ console.log(` ${DIM}│${RESET} ${line.padEnd(40)}${DIM}│${RESET}`);
101
+ }
102
+ console.log(` ${DIM}└─────────────────────────────────┘${RESET}`);
103
+ console.log('');
104
+ }
105
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "bridgellm",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "BridgeLLM CLI — let AI coding agents talk to each other across teams",
5
5
  "type": "module",
6
6
  "bin": {
7
- "bridgellm": "./dist/index.js"
7
+ "bridgellm": "dist/index.js"
8
8
  },
9
9
  "scripts": {
10
10
  "build": "tsc",
@@ -14,19 +14,36 @@
14
14
  },
15
15
  "keywords": [
16
16
  "mcp",
17
+ "mcp-server",
18
+ "mcp-client",
19
+ "model-context-protocol",
17
20
  "claude",
21
+ "claude-code",
22
+ "cursor",
23
+ "windsurf",
24
+ "codex",
18
25
  "ai",
19
- "bridge",
26
+ "ai-agents",
27
+ "ai-coding",
20
28
  "llm",
29
+ "bridge",
21
30
  "cross-team",
31
+ "cross-service",
22
32
  "context-sharing",
23
- "claude-code"
33
+ "api-contracts",
34
+ "developer-tools",
35
+ "devtools",
36
+ "collaboration"
24
37
  ],
25
38
  "author": "starvader",
39
+ "homepage": "https://github.com/starvader13/bridgellm#readme",
40
+ "bugs": {
41
+ "url": "https://github.com/starvader13/bridgellm/issues"
42
+ },
26
43
  "license": "MIT",
27
44
  "repository": {
28
45
  "type": "git",
29
- "url": "https://github.com/starvader13/bridgellm"
46
+ "url": "git+https://github.com/starvader13/bridgellm.git"
30
47
  },
31
48
  "files": [
32
49
  "dist"