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 +56 -38
- package/dist/commands/connect.js +35 -49
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/login.js +22 -32
- package/dist/commands/login.js.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/ui.d.ts +25 -0
- package/dist/ui.js +105 -0
- package/dist/ui.js.map +1 -0
- package/package.json +22 -5
package/README.md
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
# BridgeLLM
|
|
2
2
|
|
|
3
|
-
Let
|
|
3
|
+
**Let your coding agents talk to each other across services.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](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
|
-
|
|
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
|
|
27
|
+
# 2. Connect your project
|
|
28
|
+
cd your-project/
|
|
24
29
|
bridgellm connect
|
|
25
|
-
# → picks your
|
|
30
|
+
# → picks your feature
|
|
26
31
|
# → writes .mcp.json + CLAUDE.md
|
|
27
32
|
|
|
28
|
-
# 3. Restart
|
|
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
|
|
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
|
|
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
|
-
#
|
|
46
|
-
bridgellm login
|
|
50
|
+
# Authentication
|
|
51
|
+
bridgellm login # GitHub OAuth login
|
|
52
|
+
bridgellm login --server <url> # Custom server
|
|
47
53
|
|
|
48
54
|
# Project setup
|
|
49
|
-
bridgellm connect
|
|
55
|
+
bridgellm connect # Connect to a feature
|
|
50
56
|
|
|
51
57
|
# Team management
|
|
52
|
-
bridgellm team create <name>
|
|
53
|
-
bridgellm team join <invite-code>
|
|
58
|
+
bridgellm team create <name> # Create team, get invite code
|
|
59
|
+
bridgellm team join <invite-code> # Join with invite code
|
|
54
60
|
|
|
55
|
-
#
|
|
56
|
-
bridgellm config show
|
|
57
|
-
bridgellm config set role
|
|
58
|
-
bridgellm config set 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
|
-
|
|
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
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
74
|
+
Your Agent ── bridge_write ──▶ BridgeLLM ◀── bridge_read ── Their Agent
|
|
75
|
+
│
|
|
76
|
+
PostgreSQL
|
|
77
|
+
(shared context)
|
|
70
78
|
```
|
|
71
79
|
|
|
72
|
-
No
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
|
79
|
-
|
|
80
|
-
|
|
|
81
|
-
|
|
|
82
|
-
|
|
|
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
|
|
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
|
package/dist/commands/connect.js
CHANGED
|
@@ -1,24 +1,15 @@
|
|
|
1
|
-
import { readFile, writeFile } from
|
|
2
|
-
import { join } from
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
const CLAUDE_MD_START =
|
|
6
|
-
const CLAUDE_MD_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(
|
|
20
|
+
throw new Error("No team configured. Run `bridgellm login` first.");
|
|
30
21
|
}
|
|
31
22
|
if (!config.role) {
|
|
32
|
-
throw new Error(
|
|
23
|
+
throw new Error("No role configured. Run `bridgellm login` first.");
|
|
33
24
|
}
|
|
34
|
-
|
|
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,
|
|
31
|
+
const { features } = (await apiFetch(config.server, config.token, "/api/features"));
|
|
41
32
|
if (features.length > 0) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
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(
|
|
40
|
+
feature = await ask("No features yet. Feature name: ");
|
|
58
41
|
}
|
|
59
42
|
}
|
|
60
43
|
catch {
|
|
61
|
-
feature = await ask(
|
|
44
|
+
feature = await ask("Feature name: ");
|
|
62
45
|
}
|
|
63
46
|
}
|
|
64
47
|
if (!feature)
|
|
65
|
-
throw new Error(
|
|
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:
|
|
56
|
+
type: "http",
|
|
75
57
|
url: `${config.server}/mcp`,
|
|
76
58
|
headers: {
|
|
77
59
|
Authorization: `Bearer ${config.token}`,
|
|
78
|
-
|
|
79
|
-
|
|
60
|
+
"X-BridgeLLM-Feature": feature,
|
|
61
|
+
"X-BridgeLLM-Role": config.role,
|
|
80
62
|
},
|
|
81
63
|
},
|
|
82
64
|
},
|
|
83
65
|
};
|
|
84
|
-
const mcpPath = join(cwd,
|
|
85
|
-
await writeFile(mcpPath, JSON.stringify(mcpConfig, null, 2) +
|
|
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,
|
|
98
|
-
let claudeContent =
|
|
79
|
+
const claudePath = join(cwd, "CLAUDE.md");
|
|
80
|
+
let claudeContent = "";
|
|
99
81
|
try {
|
|
100
|
-
claudeContent = await readFile(claudePath,
|
|
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 +
|
|
93
|
+
claudeContent +
|
|
94
|
+
(claudeContent.endsWith("\n") ? "\n" : "\n\n") +
|
|
95
|
+
claudeBlock +
|
|
96
|
+
"\n";
|
|
112
97
|
}
|
|
113
98
|
await writeFile(claudePath, claudeContent);
|
|
114
|
-
|
|
115
|
-
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
84
|
+
success(`Team: ${teamName}`);
|
|
89
85
|
}
|
|
90
86
|
else {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
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('
|
|
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
|
-
|
|
110
|
+
success(`Joined "${teamName}"`);
|
|
116
111
|
}
|
|
117
112
|
}
|
|
118
113
|
// Role
|
|
119
|
-
const
|
|
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
|
-
|
|
127
|
-
|
|
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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
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
|
-
|
|
96
|
-
|
|
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:
|
|
100
|
-
console.log(` Role set to: ${
|
|
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":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9F,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,oBAAoB,EAAE,YAAY,EAAE,cAAc,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;IACzC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,IAAI,GAAG,OAAO;KACjB,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iBAAiB,CAAC,CAAC;AAElC,IAAI;KACD,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7B,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,IAAI;KACD,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,EAAE;IACnC,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,MAAM,GAAG,OAAO;KACnB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yBAAyB,CAAC,CAAC;AAE1C,MAAM;KACH,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QACvC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC1G,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,mBAAmB,KAAK,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,kBAAkB,GAAG,yBAAyB,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
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.
|
|
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": "
|
|
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
|
-
"
|
|
26
|
+
"ai-agents",
|
|
27
|
+
"ai-coding",
|
|
20
28
|
"llm",
|
|
29
|
+
"bridge",
|
|
21
30
|
"cross-team",
|
|
31
|
+
"cross-service",
|
|
22
32
|
"context-sharing",
|
|
23
|
-
"
|
|
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"
|