bridge-workspace 0.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/.bridgeignore ADDED
@@ -0,0 +1,46 @@
1
+ # Dependency and build output
2
+ node_modules/
3
+ dist/
4
+ build/
5
+ target/
6
+ out/
7
+ coverage/
8
+ .next/
9
+ .nuxt/
10
+ .output/
11
+ .turbo/
12
+ .cache/
13
+ tmp/
14
+ temp/
15
+
16
+ # VCS and editor metadata
17
+ .git/
18
+ .idea/
19
+ .vscode/
20
+
21
+ # Logs, archives, generated files
22
+ *.log
23
+ logs/
24
+ *.map
25
+ *.min.js
26
+ *.generated.*
27
+ generated/
28
+ *.zip
29
+ *.tar
30
+ *.gz
31
+
32
+ # Binary/media assets
33
+ *.png
34
+ *.jpg
35
+ *.jpeg
36
+ *.gif
37
+ *.webp
38
+ *.pdf
39
+ *.class
40
+ *.jar
41
+ *.war
42
+ *.ear
43
+ *.exe
44
+ *.dll
45
+ *.so
46
+ *.dylib
package/README.md ADDED
@@ -0,0 +1,302 @@
1
+ # Bridge Workspace
2
+
3
+ Bridge Workspace 是一个轻量级、去中心化的研发协同工具。它让前端侧 AI 工具通过 MCP SSE 网关读取多个固定 IP 后端的接口层代码,并以“补丁提案 + 后端人工确认”的方式安全发起跨端修改。
4
+
5
+ ## 安装与运行方式
6
+
7
+ Bridge Workspace 是一个标准 npm 二进制 CLI 包,发布后前后端同学不需要下载源码。
8
+
9
+ 远程按需运行:
10
+
11
+ ```bash
12
+ npx bridge-workspace host
13
+ npx bridge-workspace gateway
14
+ ```
15
+
16
+ 包名为 `bridge-workspace`。
17
+
18
+ 前端项目也可以安装到 `devDependencies`:
19
+
20
+ ```bash
21
+ npm install -D bridge-workspace
22
+ ```
23
+
24
+ 然后在 `package.json` 中配置:
25
+
26
+ ```json
27
+ {
28
+ "scripts": {
29
+ "bridge:gateway": "bridge gateway"
30
+ }
31
+ }
32
+ ```
33
+
34
+ ## 后端:启动 Bridge Host
35
+
36
+ 在后端项目根目录运行:
37
+
38
+ ```bash
39
+ npx bridge-workspace host
40
+ ```
41
+
42
+ 启动时必须输入本次允许前端 AI 访问的 include,直接回车则不启动:
43
+
44
+ ```text
45
+ 请输入本次允许前端 AI 访问的 include(逗号分隔;为空则不启动)
46
+ 示例:src/main/java/**/dto/**,src/main/java/**/controller/**,README.md,AGENTS.md
47
+ include >
48
+ src/main/java/com/company/order/dto/**,src/main/java/com/company/order/controller/**,README.md,AGENTS.md
49
+ ```
50
+
51
+ 默认监听 `3001` 端口。可通过参数覆盖:
52
+
53
+ ```bash
54
+ npx bridge-workspace host --port 3001
55
+ ```
56
+
57
+ 停止服务:在前台运行的终端中,直接按下 `Ctrl + C` 即可优雅退出并释放监听。
58
+
59
+ 若因终端异常关闭导致 `3001` 端口被残留占用,可运行以下命令强制一键清理:
60
+
61
+ ```bash
62
+ npx bridge-workspace stop
63
+ ```
64
+
65
+ 也可以清理指定端口:
66
+
67
+ ```bash
68
+ npx bridge-workspace stop --port 3001
69
+ ```
70
+
71
+ 如果要写进脚本,也可以使用参数:
72
+
73
+ ```bash
74
+ npx bridge-workspace host --include "src/main/java/com/company/order/dto/**" --include "README.md"
75
+ ```
76
+
77
+ 后端 Host 提供:
78
+
79
+ - `GET /file-tree`:返回 `.bridgeignore` 过滤后的轻量文件清单,只包含 `path`、`size`、`mtimeMs`,不返回全文。
80
+ - `GET /file-content?path=<filePath>`:按需返回单个文件全文,供 MCP `read_backend_file` 懒加载使用。
81
+ - `WebSocket /`:当允许范围内的文件变化时推送 `{ type, path, content }` 增量事件。
82
+ - `POST /api/propose-change`:接收前端 AI 的修改提案,但不会直接覆盖源文件。
83
+
84
+ ### 文件过滤规则
85
+
86
+ 如果后端仓库很大,推荐每次启动 `bridge host` 时只开放本次对接需要 AI 阅读和修改的目录或文件。日常直接在提示中粘贴一行逗号分隔内容即可:
87
+
88
+ ```text
89
+ src/main/java/com/company/order/api/**,src/main/java/com/company/order/dto/**,src/main/java/com/company/order/controller/**,README.md,AGENTS.md,.cursor/rules/**
90
+ ```
91
+
92
+ 设置 host include 后,`/file-tree`、`/file-content`、WebSocket 增量同步、`modify_backend_file` 都只允许这些范围内的文件。这样既减少 MCP 上下文,也能限制前端 AI 的跨端读取和修改权限。
93
+
94
+ Host 会索引两类纯文本文件。
95
+
96
+ 接口代码扩展:
97
+
98
+ - `.java`
99
+ - `.ts`
100
+ - `.js`
101
+ - `.go`
102
+ - `.py`
103
+
104
+ 后端协作指导文件:
105
+
106
+ - `README.md`
107
+ - `AGENTS.md`
108
+ - `CLAUDE.md`
109
+ - `GEMINI.md`
110
+ - `SKILL.md`
111
+ - `.cursor/rules/**/*.md`
112
+ - `.claude/skills/**/*.md`
113
+ - `skills/**/*.md`
114
+
115
+ 这些指导文件会出现在 `list_backend_files` 中,方便 AI 在读取和修改接口代码前先理解后端仓库约束;全文仍然通过 `read_backend_file` 按需懒加载。
116
+
117
+ 为避免大仓库请求过慢,Host 启动时会先构建一次内存索引;后续 `GET /file-tree` 直接返回轻量元数据快照,不再每次递归扫盘,也不一次性传输所有文件内容。文件全文只在 Cursor 调用 `read_backend_file` 时通过 `/file-content` 懒加载。
118
+
119
+ 建议在后端项目根目录维护 `.bridgeignore`。Bridge Host 的读取顺序是:
120
+
121
+ 1. 优先读取后端项目根目录的 `.bridgeignore`。
122
+ 2. 如果没有 `.bridgeignore`,读取后端项目根目录的 `.gitignore`。
123
+ 3. 如果两者都没有,使用 npm 包内置的 `.bridgeignore`。
124
+
125
+ 推荐 `.bridgeignore`:
126
+
127
+ ```gitignore
128
+ # Dependency and build output
129
+ node_modules/
130
+ dist/
131
+ build/
132
+ target/
133
+ out/
134
+ coverage/
135
+ .next/
136
+ .nuxt/
137
+ .output/
138
+ .turbo/
139
+ .cache/
140
+ tmp/
141
+ temp/
142
+
143
+ # VCS and editor metadata
144
+ .git/
145
+ .idea/
146
+ .vscode/
147
+
148
+ # Logs, archives, generated files
149
+ *.log
150
+ logs/
151
+ *.map
152
+ *.min.js
153
+ *.generated.*
154
+ generated/
155
+ *.zip
156
+ *.tar
157
+ *.gz
158
+
159
+ # Binary/media assets
160
+ *.png
161
+ *.jpg
162
+ *.jpeg
163
+ *.gif
164
+ *.webp
165
+ *.pdf
166
+ *.class
167
+ *.jar
168
+ *.war
169
+ *.ear
170
+ *.exe
171
+ *.dll
172
+ *.so
173
+ *.dylib
174
+ ```
175
+
176
+ 如果后端仓库很大,建议进一步在项目 `.bridgeignore` 中排除非接口目录,例如:
177
+
178
+ ```gitignore
179
+ docs/
180
+ scripts/
181
+ test/
182
+ tests/
183
+ __tests__/
184
+ fixtures/
185
+ examples/
186
+ mock/
187
+ logs/
188
+ ```
189
+
190
+ ## 前端:启动 Gateway
191
+
192
+ 在前端项目根目录创建 `bridge.config.json`:
193
+
194
+ ```json
195
+ {
196
+ "project": "my-frontend-app",
197
+ "all_backends": {
198
+ "li-si-order": "192.168.1.50:3001",
199
+ "wang-wu-pay": "192.168.1.62:3001"
200
+ }
201
+ }
202
+ ```
203
+
204
+ 启动网关:
205
+
206
+ ```bash
207
+ npx bridge-workspace gateway
208
+ ```
209
+
210
+ 启动后会在终端展示 `all_backends`,支持输入编号或名称多选:
211
+
212
+ ```text
213
+ 请选择要连接的后端服务(可多选,逗号分隔;直接回车则不启动):
214
+
215
+ [1] li-si-order 192.168.1.50:3001
216
+ [2] wang-wu-pay 192.168.1.62:3001
217
+
218
+ 输入编号或名称,例如:1,2 或 li-si-order,wang-wu-pay >
219
+ ```
220
+
221
+ 如果直接回车,不会启动 Gateway;这样可以避免误连默认后端。
222
+
223
+ 选择后端后,Gateway 会允许前端再输入本次会话 include;为空表示使用后端已经开放的范围。如果填写,则最终范围是“后端 host include ∩ 前端 gateway include”。
224
+
225
+ ```text
226
+ local 本次会话 include(可为空,表示使用后端开放范围;逗号分隔)
227
+ 示例:src/main/java/**/dto/**,src/main/java/**/controller/**,README.md
228
+ include >
229
+ ```
230
+
231
+ 默认从 `9999` 端口启动;如果本机端口已被占用,会自动递增寻找下一个可用端口,例如 `10000`、`10001`。也可以通过参数指定起始端口:
232
+
233
+ ```bash
234
+ npx bridge-workspace gateway --port 9999
235
+ ```
236
+
237
+ Gateway 会读取 `bridge.config.json`,根据终端多选结果并发请求后端的 `/file-tree` 轻量清单,在内存中聚合出“全栈虚拟工作区”。文件内容不会在启动时全量下载,而是在 AI 调用 `read_backend_file` 时按需读取。
238
+
239
+ 辅助 HTTP 接口:
240
+
241
+ - `GET /health`:网关健康检查。
242
+ - `GET /backends`:查看当前聚合的后端文件。
243
+ - `GET /backends/:backend/files/*`:读取单个聚合文件。
244
+
245
+ ## Cursor / MCP SSE 配置
246
+
247
+ Gateway 内嵌 MCP SSE Server:
248
+
249
+ - SSE endpoint:`http://127.0.0.1:9999/mcp/sse`
250
+ - Message endpoint:`http://127.0.0.1:9999/mcp/messages`
251
+
252
+ 如果终端提示已自动切换端口,请以终端实际输出的 MCP SSE 地址为准。
253
+
254
+ 向 Cursor 暴露的能力:
255
+
256
+ - Resource:`bridge_backend_context`,提供当前聚合的全栈上下文。
257
+ - Tool:`list_backend_files`,列出已同步的后端文件。
258
+ - Tool:`read_backend_file(backendName, filePath)`,读取指定后端的指定文件。
259
+ - Tool:`search_backend_code(query, backendName?, limit?)`,在已授权范围内搜索关键词并返回轻量片段。
260
+ - Tool:`modify_backend_file(backendName, filePath, newContent)`,向指定后端发起修改提案。
261
+
262
+ ## 多前端 / 多后端协作
263
+
264
+ - 多个前端同学可以同时连接同一个后端 Host;后端的 `bridge host` 会维护多个 WebSocket 连接,并向所有连接的 Gateway 推送增量更新。
265
+ - 多个前端同学都启动 `bridge gateway` 且都使用 `9999` 端口不会互相冲突,因为 `9999` 是各自电脑上的 `127.0.0.1:9999`。
266
+ - 同一台电脑上如果要同时启动多个 Gateway,不需要手动改端口;后启动的进程会从 `9999` 开始自动递增到下一个可用端口,并在终端打印实际 MCP SSE 地址。
267
+ - 同一个后端收到多个前端 AI 的修改提案时,仍然只在后端终端逐个打印 diff 并等待后端人类确认,源文件不会被自动覆盖。
268
+
269
+ ## 跨端修改安全流程
270
+
271
+ 当前端 AI 调用:
272
+
273
+ ```text
274
+ modify_backend_file("li-si-order", "src/api/OrderDTO.java", "...")
275
+ ```
276
+
277
+ 实际流程是:
278
+
279
+ 1. Gateway 将 `{ filePath, newContent }` POST 到 `http://<后端固定IP>:3001/api/propose-change`。
280
+ 2. 后端 Host 校验文件路径和 `.bridgeignore` 白名单。
281
+ 3. 后端 Host 读取本地旧文件,和新文本生成 `.bridge/patches/*.patch` 临时补丁。
282
+ 4. 后端终端高亮打印 Diff 预览,并提示:`[Bridge] 前端 AI 申请修改 <filePath>,确认应用此改动吗?(Y/N)`。
283
+ 5. 只有后端人类输入 `Y` 后,Host 才会用 `fs.writeFile` 写入源文件。
284
+ 6. 写入后的内容只表现为后端本地 Git 工作区的 `Uncommitted Changes`,Review 和提交权仍在后端人类手里。
285
+
286
+ 如果输入不是 `Y`,源文件不会被修改,补丁文件仍保留在 `.bridge/patches/` 方便审计。
287
+
288
+ ## 覆盖确认
289
+
290
+ 当前核心逻辑覆盖如下:
291
+
292
+ - 后端瘦身过滤、轻量 `/file-tree`、按需 `/file-content`、WebSocket 增量同步:已实现。
293
+ - Gateway 默认 `9999` 端口、读取配置、聚合默认后端:已实现。
294
+ - MCP SSE Server、`list_backend_files`、`read_backend_file`、`search_backend_code`、`modify_backend_file`:已实现。
295
+ - `modify_backend_file` 到后端 `/api/propose-change` 推送:已实现。
296
+ - 后端禁止直接覆盖、生成 patch、终端确认后写入:已实现。
297
+
298
+ ## 验证
299
+
300
+ ```bash
301
+ npm test
302
+ ```
package/bin/index.js ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { runBackendHost } = require('../src/backend');
4
+ const { runGateway } = require('../src/gateway');
5
+ const { runStop } = require('../src/stop');
6
+
7
+ function printHelp(output = process.stdout) {
8
+ output.write(`Bridge Workspace\n\n`);
9
+ output.write(`Usage:\n`);
10
+ output.write(` bridge host [--port 3001] [--include <glob>]\n`);
11
+ output.write(` bridge gateway [--port 9999]\n\n`);
12
+ output.write(` bridge stop [--port 3001]\n\n`);
13
+ output.write(`Commands:\n`);
14
+ output.write(` host Start backend source-of-truth host service\n`);
15
+ output.write(` gateway Start frontend aggregation gateway and MCP SSE server\n`);
16
+ output.write(` stop Stop process listening on a Bridge port\n`);
17
+ }
18
+
19
+ async function main(argv = process.argv.slice(2)) {
20
+ const command = argv[0];
21
+
22
+ if (!command || command === '--help' || command === '-h') {
23
+ printHelp();
24
+ return null;
25
+ }
26
+
27
+ if (command === 'host') {
28
+ return runBackendHost(argv.slice(1));
29
+ }
30
+
31
+ if (command === 'gateway') {
32
+ return runGateway(argv.slice(1));
33
+ }
34
+
35
+ if (command === 'stop') {
36
+ return runStop(argv.slice(1));
37
+ }
38
+
39
+ process.stderr.write(`Unknown command: ${command}\n\n`);
40
+ printHelp(process.stderr);
41
+ process.exitCode = 1;
42
+ return null;
43
+ }
44
+
45
+ if (require.main === module) {
46
+ main().catch((error) => {
47
+ console.error(error);
48
+ process.exitCode = 1;
49
+ });
50
+ }
51
+
52
+ module.exports = { main, printHelp };
@@ -0,0 +1,7 @@
1
+ {
2
+ "project": "my-frontend-app",
3
+ "all_backends": {
4
+ "li-si-order": "192.168.1.50:3001",
5
+ "wang-wu-pay": "192.168.1.62:3001"
6
+ }
7
+ }
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "bridge-workspace",
3
+ "version": "0.1.0",
4
+ "description": "Lightweight decentralized MCP bridge for frontend/backend collaboration.",
5
+ "type": "commonjs",
6
+ "bin": {
7
+ "bridge": "./bin/index.js"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "src/",
12
+ ".bridgeignore",
13
+ "README.md",
14
+ "bridge.config.json.example"
15
+ ],
16
+ "scripts": {
17
+ "test": "node --test"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.17.5",
24
+ "chokidar": "^3.6.0",
25
+ "express": "^4.19.2",
26
+ "ignore": "^5.3.2",
27
+ "ws": "^8.18.0"
28
+ },
29
+ "devDependencies": {}
30
+ }