yo-bug 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/dist/src/install/detect-ai-tool.d.ts.map +1 -1
- package/dist/src/install/detect-ai-tool.js +3 -4
- package/dist/src/install/detect-ai-tool.js.map +1 -1
- package/dist/src/install/write-mcp-config.d.ts.map +1 -1
- package/dist/src/install/write-mcp-config.js +6 -19
- package/dist/src/install/write-mcp-config.js.map +1 -1
- package/dist/src/server/html-injector.d.ts +1 -0
- package/dist/src/server/html-injector.d.ts.map +1 -1
- package/dist/src/server/html-injector.js +8 -4
- package/dist/src/server/html-injector.js.map +1 -1
- package/dist/src/server/proxy-server.d.ts.map +1 -1
- package/dist/src/server/proxy-server.js +2 -1
- package/dist/src/server/proxy-server.js.map +1 -1
- package/package.json +1 -1
- package/src/install/detect-ai-tool.ts +3 -4
- package/src/install/write-mcp-config.ts +7 -18
- package/src/server/html-injector.ts +10 -5
- package/src/server/proxy-server.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-ai-tool.d.ts","sourceRoot":"","sources":["../../../src/install/detect-ai-tool.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"detect-ai-tool.d.ts","sourceRoot":"","sources":["../../../src/install/detect-ai-tool.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BvD"}
|
|
@@ -3,12 +3,11 @@ import path from 'path';
|
|
|
3
3
|
const HOME = process.env.HOME || process.env.USERPROFILE || '';
|
|
4
4
|
export async function detectAITools() {
|
|
5
5
|
const tools = [];
|
|
6
|
-
// Claude Code
|
|
7
|
-
const claudeDir = path.join(HOME, '.claude');
|
|
6
|
+
// Claude Code — MCP config goes in ~/.claude.json (NOT ~/.claude/settings.json)
|
|
8
7
|
tools.push({
|
|
9
8
|
name: 'Claude Code',
|
|
10
|
-
configPath: path.join(
|
|
11
|
-
detected: await dirExists(
|
|
9
|
+
configPath: path.join(HOME, '.claude.json'),
|
|
10
|
+
detected: await dirExists(path.join(HOME, '.claude')),
|
|
12
11
|
});
|
|
13
12
|
// Cursor
|
|
14
13
|
const cursorDir = path.join(HOME, '.cursor');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-ai-tool.js","sourceRoot":"","sources":["../../../src/install/detect-ai-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,
|
|
1
|
+
{"version":3,"file":"detect-ai-tool.js","sourceRoot":"","sources":["../../../src/install/detect-ai-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,gFAAgF;IAChF,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;QAC3C,QAAQ,EAAE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;KACtD,CAAC,CAAC;IAEH,SAAS;IACT,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;QAC5C,QAAQ,EAAE,MAAM,SAAS,CAAC,SAAS,CAAC;KACrC,CAAC,CAAC;IAEH,WAAW;IACX,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC;QAC9C,QAAQ,EAAE,MAAM,SAAS,CAAC,WAAW,CAAC;KACvC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-mcp-config.d.ts","sourceRoot":"","sources":["../../../src/install/write-mcp-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAQlD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"write-mcp-config.d.ts","sourceRoot":"","sources":["../../../src/install/write-mcp-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAQlD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BjG"}
|
|
@@ -18,25 +18,12 @@ export async function writeMcpConfig(tool) {
|
|
|
18
18
|
catch {
|
|
19
19
|
// File doesn't exist or invalid JSON — start fresh
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
config.mcpServers['yo-bug'] = {
|
|
28
|
-
type: 'stdio',
|
|
29
|
-
...MCP_SERVER_CONFIG,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
// Cursor / Windsurf format
|
|
34
|
-
config.mcpServers = config.mcpServers || {};
|
|
35
|
-
if (config.mcpServers['yo-bug']) {
|
|
36
|
-
return { success: true, message: `${tool.name}: Already configured, skipped.` };
|
|
37
|
-
}
|
|
38
|
-
config.mcpServers['yo-bug'] = MCP_SERVER_CONFIG;
|
|
39
|
-
}
|
|
21
|
+
config.mcpServers = config.mcpServers || {};
|
|
22
|
+
// Always overwrite — don't skip, in case config was wrong before
|
|
23
|
+
config.mcpServers['yo-bug'] = {
|
|
24
|
+
...MCP_SERVER_CONFIG,
|
|
25
|
+
...(tool.name === 'Claude Code' ? { type: 'stdio' } : {}),
|
|
26
|
+
};
|
|
40
27
|
// Write config
|
|
41
28
|
await fs.writeFile(tool.configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
42
29
|
return { success: true, message: `${tool.name}: MCP config written to ${tool.configPath}` };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-mcp-config.js","sourceRoot":"","sources":["../../../src/install/write-mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,qDAAqD;AACrD,MAAM,iBAAiB,GAAG;IACxB,OAAO,EAAE,QAAQ;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC;CACd,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnE,uBAAuB;QACvB,IAAI,MAAM,GAAQ,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"write-mcp-config.js","sourceRoot":"","sources":["../../../src/install/write-mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,qDAAqD;AACrD,MAAM,iBAAiB,GAAG;IACxB,OAAO,EAAE,QAAQ;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC;CACd,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnE,uBAAuB;QACvB,IAAI,MAAM,GAAQ,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;QAED,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAE5C,iEAAiE;QACjE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG;YAC5B,GAAG,iBAAiB;YACpB,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D,CAAC;QAEF,eAAe;QACf,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,2BAA2B,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;IAC9F,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,oBAAoB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IACpF,CAAC;AACH,CAAC"}
|
|
@@ -2,6 +2,7 @@ import type { IncomingMessage, ServerResponse } from 'http';
|
|
|
2
2
|
/**
|
|
3
3
|
* Middleware that intercepts HTML responses from the proxy
|
|
4
4
|
* and injects the vibe-feedback SDK script before </body>.
|
|
5
|
+
* Only intercepts 2xx HTML responses — redirects and errors pass through.
|
|
5
6
|
*/
|
|
6
7
|
export declare function createHtmlInjector(proxyRes: IncomingMessage, res: ServerResponse): {
|
|
7
8
|
onData(chunk: Buffer): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-injector.d.ts","sourceRoot":"","sources":["../../../src/server/html-injector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAI5D
|
|
1
|
+
{"version":3,"file":"html-injector.d.ts","sourceRoot":"","sources":["../../../src/server/html-injector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAI5D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc;kBAmB/D,MAAM;;SAiBvB"}
|
|
@@ -2,14 +2,19 @@ const INJECT_SCRIPT = `<script src="/vibe-feedback.js"></script>`;
|
|
|
2
2
|
/**
|
|
3
3
|
* Middleware that intercepts HTML responses from the proxy
|
|
4
4
|
* and injects the vibe-feedback SDK script before </body>.
|
|
5
|
+
* Only intercepts 2xx HTML responses — redirects and errors pass through.
|
|
5
6
|
*/
|
|
6
7
|
export function createHtmlInjector(proxyRes, res) {
|
|
8
|
+
const statusCode = proxyRes.statusCode || 200;
|
|
7
9
|
const contentType = proxyRes.headers['content-type'] || '';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
// Only inject into 2xx HTML responses
|
|
11
|
+
// Don't touch redirects (3xx), errors (4xx/5xx), or non-HTML
|
|
12
|
+
if (statusCode < 200 || statusCode >= 300 || !contentType.includes('text/html')) {
|
|
13
|
+
return null;
|
|
10
14
|
}
|
|
11
15
|
// Copy all response headers except content-length (we'll modify the body)
|
|
12
|
-
|
|
16
|
+
const headers = Object.fromEntries(Object.entries(proxyRes.headers).filter(([key]) => key !== 'content-length'));
|
|
17
|
+
res.writeHead(statusCode, headers);
|
|
13
18
|
const chunks = [];
|
|
14
19
|
return {
|
|
15
20
|
onData(chunk) {
|
|
@@ -17,7 +22,6 @@ export function createHtmlInjector(proxyRes, res) {
|
|
|
17
22
|
},
|
|
18
23
|
onEnd() {
|
|
19
24
|
let html = Buffer.concat(chunks).toString('utf-8');
|
|
20
|
-
// Inject before </body> or at end if no </body>
|
|
21
25
|
if (html.includes('</body>')) {
|
|
22
26
|
html = html.replace('</body>', `${INJECT_SCRIPT}\n</body>`);
|
|
23
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-injector.js","sourceRoot":"","sources":["../../../src/server/html-injector.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,2CAA2C,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"html-injector.js","sourceRoot":"","sources":["../../../src/server/html-injector.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,2CAA2C,CAAC;AAElE;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAyB,EAAE,GAAmB;IAC/E,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC;IAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAE3D,sCAAsC;IACtC,6DAA6D;IAC7D,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0EAA0E;IAC1E,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAChC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAC7E,CAAC;IACF,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,OAAO;QACL,MAAM,CAAC,KAAa;YAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,KAAK;YACH,IAAI,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEnD,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,aAAa,WAAW,CAAC,CAAC;YAC9D,CAAC;iBAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,aAAa,WAAW,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC/B,CAAC;YAED,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-server.d.ts","sourceRoot":"","sources":["../../../src/server/proxy-server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUpD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"proxy-server.d.ts","sourceRoot":"","sources":["../../../src/server/proxy-server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUpD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA2ElD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAStC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC"}
|
|
@@ -43,7 +43,8 @@ export async function startProxyServer(targetPort, store) {
|
|
|
43
43
|
proxyRes.on('end', () => injector.onEnd());
|
|
44
44
|
}
|
|
45
45
|
else {
|
|
46
|
-
// Non-HTML — pipe through
|
|
46
|
+
// Non-HTML or redirect — pipe through with original status + headers
|
|
47
|
+
res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);
|
|
47
48
|
proxyRes.pipe(res);
|
|
48
49
|
}
|
|
49
50
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-server.js","sourceRoot":"","sources":["../../../src/server/proxy-server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,SAAS,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,IAAI,MAAM,GAAkB,IAAI,CAAC;AACjC,IAAI,KAAK,GAAqB,IAAI,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,KAAoB;IAEpB,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,SAAS,GAAG,oBAAoB,UAAU,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAG,oBAAoB,UAAU,EAAE,CAAC;IAElD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,kCAAkC;IAClC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAEhB,8BAA8B;IAC9B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzC,oBAAoB;IACpB,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC;IAE3B,sBAAsB;IACtB,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;IAErC,eAAe;IACf,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC;QAClC,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,IAAI,EAAE,4BAA4B;QACtC,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACpC,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;YAC7B,GAAW,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;YAC/D,GAAW,CAAC,GAAG,EAAE,CAAC,2BAA2B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,oDAAoD;IACpD,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,EAAE,GAAU,CAAC,CAAC;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,oCAAoC;YACpC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,
|
|
1
|
+
{"version":3,"file":"proxy-server.js","sourceRoot":"","sources":["../../../src/server/proxy-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -12,12 +12,11 @@ const HOME = process.env.HOME || process.env.USERPROFILE || '';
|
|
|
12
12
|
export async function detectAITools(): Promise<AITool[]> {
|
|
13
13
|
const tools: AITool[] = [];
|
|
14
14
|
|
|
15
|
-
// Claude Code
|
|
16
|
-
const claudeDir = path.join(HOME, '.claude');
|
|
15
|
+
// Claude Code — MCP config goes in ~/.claude.json (NOT ~/.claude/settings.json)
|
|
17
16
|
tools.push({
|
|
18
17
|
name: 'Claude Code',
|
|
19
|
-
configPath: path.join(
|
|
20
|
-
detected: await dirExists(
|
|
18
|
+
configPath: path.join(HOME, '.claude.json'),
|
|
19
|
+
detected: await dirExists(path.join(HOME, '.claude')),
|
|
21
20
|
});
|
|
22
21
|
|
|
23
22
|
// Cursor
|
|
@@ -22,24 +22,13 @@ export async function writeMcpConfig(tool: AITool): Promise<{ success: boolean;
|
|
|
22
22
|
// File doesn't exist or invalid JSON — start fresh
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
type: 'stdio',
|
|
33
|
-
...MCP_SERVER_CONFIG,
|
|
34
|
-
};
|
|
35
|
-
} else {
|
|
36
|
-
// Cursor / Windsurf format
|
|
37
|
-
config.mcpServers = config.mcpServers || {};
|
|
38
|
-
if (config.mcpServers['yo-bug']) {
|
|
39
|
-
return { success: true, message: `${tool.name}: Already configured, skipped.` };
|
|
40
|
-
}
|
|
41
|
-
config.mcpServers['yo-bug'] = MCP_SERVER_CONFIG;
|
|
42
|
-
}
|
|
25
|
+
config.mcpServers = config.mcpServers || {};
|
|
26
|
+
|
|
27
|
+
// Always overwrite — don't skip, in case config was wrong before
|
|
28
|
+
config.mcpServers['yo-bug'] = {
|
|
29
|
+
...MCP_SERVER_CONFIG,
|
|
30
|
+
...(tool.name === 'Claude Code' ? { type: 'stdio' } : {}),
|
|
31
|
+
};
|
|
43
32
|
|
|
44
33
|
// Write config
|
|
45
34
|
await fs.writeFile(tool.configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
@@ -5,17 +5,23 @@ const INJECT_SCRIPT = `<script src="/vibe-feedback.js"></script>`;
|
|
|
5
5
|
/**
|
|
6
6
|
* Middleware that intercepts HTML responses from the proxy
|
|
7
7
|
* and injects the vibe-feedback SDK script before </body>.
|
|
8
|
+
* Only intercepts 2xx HTML responses — redirects and errors pass through.
|
|
8
9
|
*/
|
|
9
10
|
export function createHtmlInjector(proxyRes: IncomingMessage, res: ServerResponse) {
|
|
11
|
+
const statusCode = proxyRes.statusCode || 200;
|
|
10
12
|
const contentType = proxyRes.headers['content-type'] || '';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
|
|
14
|
+
// Only inject into 2xx HTML responses
|
|
15
|
+
// Don't touch redirects (3xx), errors (4xx/5xx), or non-HTML
|
|
16
|
+
if (statusCode < 200 || statusCode >= 300 || !contentType.includes('text/html')) {
|
|
17
|
+
return null;
|
|
13
18
|
}
|
|
14
19
|
|
|
15
20
|
// Copy all response headers except content-length (we'll modify the body)
|
|
16
|
-
|
|
21
|
+
const headers = Object.fromEntries(
|
|
17
22
|
Object.entries(proxyRes.headers).filter(([key]) => key !== 'content-length')
|
|
18
|
-
)
|
|
23
|
+
);
|
|
24
|
+
res.writeHead(statusCode, headers);
|
|
19
25
|
|
|
20
26
|
const chunks: Buffer[] = [];
|
|
21
27
|
|
|
@@ -26,7 +32,6 @@ export function createHtmlInjector(proxyRes: IncomingMessage, res: ServerRespons
|
|
|
26
32
|
onEnd() {
|
|
27
33
|
let html = Buffer.concat(chunks).toString('utf-8');
|
|
28
34
|
|
|
29
|
-
// Inject before </body> or at end if no </body>
|
|
30
35
|
if (html.includes('</body>')) {
|
|
31
36
|
html = html.replace('</body>', `${INJECT_SCRIPT}\n</body>`);
|
|
32
37
|
} else if (html.includes('</html>')) {
|
|
@@ -59,7 +59,8 @@ export async function startProxyServer(
|
|
|
59
59
|
proxyRes.on('data', (chunk) => injector.onData(chunk));
|
|
60
60
|
proxyRes.on('end', () => injector.onEnd());
|
|
61
61
|
} else {
|
|
62
|
-
// Non-HTML — pipe through
|
|
62
|
+
// Non-HTML or redirect — pipe through with original status + headers
|
|
63
|
+
res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);
|
|
63
64
|
proxyRes.pipe(res as any);
|
|
64
65
|
}
|
|
65
66
|
});
|