@zivis/cli 0.1.0-alpha.20 → 0.1.0-alpha.22
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/commands/auth/login.js +10 -4
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/mcp/index.js +17 -13
- package/dist/commands/mcp/index.js.map +1 -1
- package/dist/internal/ide-setup.d.ts +14 -7
- package/dist/internal/ide-setup.js +64 -41
- package/dist/internal/ide-setup.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ import { detectProjectBinding } from "@zivis/mcp/project-binding";
|
|
|
5
5
|
import { DEFAULT_CONFIG } from "@zivis/mcp/types";
|
|
6
6
|
import { extractEmail } from "../../internal/orgs.js";
|
|
7
7
|
import { ensureProjectBinding } from "../../internal/project-binding.js";
|
|
8
|
-
import { setupVsCodeClaude, setupVsCodeCopilot, setupClaudeCodeCli, } from "../../internal/ide-setup.js";
|
|
8
|
+
import { setupCursorWorkspace, setupVsCodeClaude, setupVsCodeCopilot, setupClaudeCodeCli, } from "../../internal/ide-setup.js";
|
|
9
9
|
export async function loginCommand(opts) {
|
|
10
10
|
const config = DEFAULT_CONFIG;
|
|
11
11
|
const detected = detectProjectBinding(process.cwd());
|
|
@@ -34,14 +34,20 @@ export async function loginCommand(opts) {
|
|
|
34
34
|
console.log(`✓ JWT scoped to organization: ${organizationId}`);
|
|
35
35
|
}
|
|
36
36
|
try {
|
|
37
|
-
await
|
|
38
|
-
|
|
37
|
+
await setupCursorWorkspace();
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.log(` WARNING: Failed to update .cursor/mcp.json: ${err instanceof Error ? err.message : err}`);
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
await setupVsCodeClaude();
|
|
44
|
+
await setupVsCodeCopilot();
|
|
39
45
|
}
|
|
40
46
|
catch (err) {
|
|
41
47
|
console.log(` WARNING: Failed to update .vscode/mcp.json: ${err instanceof Error ? err.message : err}`);
|
|
42
48
|
}
|
|
43
49
|
try {
|
|
44
|
-
await setupClaudeCodeCli(
|
|
50
|
+
await setupClaudeCodeCli();
|
|
45
51
|
}
|
|
46
52
|
catch (err) {
|
|
47
53
|
console.log(` WARNING: Failed to update Claude Code CLI config: ${err instanceof Error ? err.message : err}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAUrC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAkB;IACnD,MAAM,MAAM,GAAG,cAAc,CAAC;IAC9B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IAE5E,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC;IAC9B,IAAI,CAAC,cAAc,IAAI,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;QACrD,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAC9C,OAAO,CAAC,GAAG,CACT,mCAAmC,cAAc,GAC/C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAChE,EAAE,CACH,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE;YAC1D,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO;YAClC,WAAW,EAAE,IAAI,CAAC,GAAG,KAAK,IAAI;SAC/B,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE5C,MAAM,WAAW,GAAG,OAAO,IAAI,SAAS,CAAC;QACzC,MAAM,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAE3C,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG,YAAY,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,2BAA2B,WAAW,EAAE,CAAC,CAAC;QACtD,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,iCAAiC,cAAc,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
1
2
|
import { startServer } from "@zivis/mcp/server";
|
|
2
3
|
import { DEFAULT_CONFIG } from "@zivis/mcp/types";
|
|
3
|
-
import {
|
|
4
|
+
import { setupCursorWorkspace, setupVsCodeCopilot, setupVsCodeClaude, setupClaudeCodeCli, setupCline, setupWindsurf, printClaudeCodeManual, } from "../../internal/ide-setup.js";
|
|
4
5
|
const KNOWN_CLIENTS = [
|
|
5
6
|
"cursor",
|
|
6
7
|
"claude-code",
|
|
@@ -15,17 +16,20 @@ export function registerMcpCommands(program) {
|
|
|
15
16
|
mcp
|
|
16
17
|
.command("serve")
|
|
17
18
|
.description("start the stdio MCP server (called by your IDE, not directly)")
|
|
18
|
-
.
|
|
19
|
-
|
|
19
|
+
.option("-w, --workspace <path>", "workspace root for project binding detection (auto-set by IDE config, do not pass manually)")
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
const config = { ...DEFAULT_CONFIG };
|
|
22
|
+
if (opts.workspace) {
|
|
23
|
+
config.workspacePath = path.resolve(opts.workspace);
|
|
24
|
+
}
|
|
25
|
+
await startServer(config);
|
|
20
26
|
});
|
|
21
27
|
mcp
|
|
22
28
|
.command("install")
|
|
23
|
-
.description("write MCP config for a supported IDE client")
|
|
29
|
+
.description("write MCP config for a supported IDE client (run from your project root)")
|
|
24
30
|
.option("--client <name>", `target client (${KNOWN_CLIENTS.join(" | ")})`)
|
|
25
|
-
.option("-s, --session <name>", "include ZIVIS_SESSION env var")
|
|
26
31
|
.action(async (opts) => {
|
|
27
32
|
const client = opts.client?.toLowerCase();
|
|
28
|
-
const session = opts.session;
|
|
29
33
|
if (!client) {
|
|
30
34
|
console.error("Specify a client with --client <name>:");
|
|
31
35
|
for (const c of KNOWN_CLIENTS)
|
|
@@ -35,25 +39,25 @@ export function registerMcpCommands(program) {
|
|
|
35
39
|
try {
|
|
36
40
|
switch (client) {
|
|
37
41
|
case "cursor":
|
|
38
|
-
await
|
|
42
|
+
await setupCursorWorkspace();
|
|
39
43
|
break;
|
|
40
44
|
case "claude-code":
|
|
41
|
-
printClaudeCodeManual(
|
|
45
|
+
printClaudeCodeManual();
|
|
42
46
|
break;
|
|
43
47
|
case "claude-code-cli":
|
|
44
|
-
await setupClaudeCodeCli(
|
|
48
|
+
await setupClaudeCodeCli();
|
|
45
49
|
break;
|
|
46
50
|
case "cline":
|
|
47
|
-
await setupCline(
|
|
51
|
+
await setupCline();
|
|
48
52
|
break;
|
|
49
53
|
case "windsurf":
|
|
50
|
-
await setupWindsurf(
|
|
54
|
+
await setupWindsurf();
|
|
51
55
|
break;
|
|
52
56
|
case "vscode-copilot":
|
|
53
|
-
await setupVsCodeCopilot(
|
|
57
|
+
await setupVsCodeCopilot();
|
|
54
58
|
break;
|
|
55
59
|
case "vscode-claude":
|
|
56
|
-
await setupVsCodeClaude(
|
|
60
|
+
await setupVsCodeClaude();
|
|
57
61
|
break;
|
|
58
62
|
default:
|
|
59
63
|
console.error(`Unknown client: ${client}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/mcp/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AAErC,MAAM,aAAa,GAAG;IACpB,QAAQ;IACR,aAAa;IACb,iBAAiB;IACjB,OAAO;IACP,UAAU;IACV,gBAAgB;IAChB,eAAe;CACP,CAAC;AAEX,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAEjF,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CACL,wBAAwB,EACxB,6FAA6F,CAC9F;SACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0EAA0E,CAAC;SACvF,MAAM,CACL,iBAAiB,EACjB,kBAAkB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAC/C;SACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,MAAM,GAAI,IAAI,CAAC,MAA6B,EAAE,WAAW,EAAE,CAAC;QAElE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,aAAa;gBAAE,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;YAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,QAAQ;oBACX,MAAM,oBAAoB,EAAE,CAAC;oBAC7B,MAAM;gBACR,KAAK,aAAa;oBAChB,qBAAqB,EAAE,CAAC;oBACxB,MAAM;gBACR,KAAK,iBAAiB;oBACpB,MAAM,kBAAkB,EAAE,CAAC;oBAC3B,MAAM;gBACR,KAAK,OAAO;oBACV,MAAM,UAAU,EAAE,CAAC;oBACnB,MAAM;gBACR,KAAK,UAAU;oBACb,MAAM,aAAa,EAAE,CAAC;oBACtB,MAAM;gBACR,KAAK,gBAAgB;oBACnB,MAAM,kBAAkB,EAAE,CAAC;oBAC3B,MAAM;gBACR,KAAK,eAAe;oBAClB,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM;gBACR;oBACE,OAAO,CAAC,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;oBAC3C,OAAO,CAAC,KAAK,CAAC,cAAc,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
export declare function setupCursor(
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
export declare function setupCursor(): Promise<void>;
|
|
2
|
+
/**
|
|
3
|
+
* Write a workspace-level .cursor/mcp.json with `--workspace <cwd>` so Cursor
|
|
4
|
+
* starts an isolated MCP process bound to this specific repo.
|
|
5
|
+
* One process = one org = zero cross-tenant risk, regardless of what other
|
|
6
|
+
* repos are open in Cursor.
|
|
7
|
+
*/
|
|
8
|
+
export declare function setupCursorWorkspace(): Promise<void>;
|
|
9
|
+
export declare function setupVsCodeCopilot(): Promise<void>;
|
|
10
|
+
export declare function setupVsCodeClaude(): Promise<void>;
|
|
11
|
+
export declare function setupClaudeCodeCli(): Promise<void>;
|
|
12
|
+
export declare function setupCline(): Promise<void>;
|
|
13
|
+
export declare function setupWindsurf(): Promise<void>;
|
|
14
|
+
export declare function printClaudeCodeManual(): void;
|
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
const SERVER_NAME = "zivis";
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Build the MCP server config for an IDE config file.
|
|
6
|
+
*
|
|
7
|
+
* When workspacePath is provided, we pass it as `--workspace <path>` so the
|
|
8
|
+
* MCP server process resolves its session from `.zivis/project.json` at that
|
|
9
|
+
* path — not from an env var that can drift or be accidentally reused across
|
|
10
|
+
* tenants. This gives us one-process-per-org isolation at the IDE level.
|
|
11
|
+
*
|
|
12
|
+
* ZIVIS_SESSION is intentionally NOT used here. The workspace path is the
|
|
13
|
+
* canonical, immutable tenant binding for an MCP process.
|
|
14
|
+
*/
|
|
15
|
+
function buildServerConfig(workspacePath, extra) {
|
|
16
|
+
const args = ["mcp", "serve"];
|
|
17
|
+
if (workspacePath) {
|
|
18
|
+
args.push("--workspace", workspacePath);
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
6
21
|
...extra,
|
|
7
22
|
command: "zivis",
|
|
8
|
-
args
|
|
23
|
+
args,
|
|
9
24
|
};
|
|
10
|
-
if (session) {
|
|
11
|
-
config.env = { ZIVIS_SESSION: session };
|
|
12
|
-
}
|
|
13
|
-
return config;
|
|
14
25
|
}
|
|
15
26
|
async function updateMcpConfig(configPath, serverName, serverConfig, rootKey) {
|
|
16
27
|
const configDir = path.dirname(configPath);
|
|
@@ -33,41 +44,54 @@ async function updateMcpConfig(configPath, serverName, serverConfig, rootKey) {
|
|
|
33
44
|
servers[serverName] = serverConfig;
|
|
34
45
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
35
46
|
}
|
|
36
|
-
export async function setupCursor(
|
|
47
|
+
export async function setupCursor() {
|
|
37
48
|
const homeDir = process.env.HOME || "";
|
|
38
49
|
const configPath = path.join(homeDir, ".cursor", "mcp.json");
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
console.log(` Session: ${session}`);
|
|
50
|
+
// Global config has no workspace path — serves repos without .zivis/project.json
|
|
51
|
+
await updateMcpConfig(configPath, SERVER_NAME, buildServerConfig(), "mcpServers");
|
|
52
|
+
console.log(`✓ Cursor global MCP config updated: ${configPath}`);
|
|
43
53
|
console.log(" Restart Cursor for changes to take effect");
|
|
44
54
|
}
|
|
45
|
-
|
|
46
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Write a workspace-level .cursor/mcp.json with `--workspace <cwd>` so Cursor
|
|
57
|
+
* starts an isolated MCP process bound to this specific repo.
|
|
58
|
+
* One process = one org = zero cross-tenant risk, regardless of what other
|
|
59
|
+
* repos are open in Cursor.
|
|
60
|
+
*/
|
|
61
|
+
export async function setupCursorWorkspace() {
|
|
62
|
+
const workspacePath = process.cwd();
|
|
63
|
+
const configPath = path.join(workspacePath, ".cursor", "mcp.json");
|
|
64
|
+
await updateMcpConfig(configPath, SERVER_NAME, buildServerConfig(workspacePath), "mcpServers");
|
|
65
|
+
console.log(`✓ Cursor workspace MCP config updated: ${configPath}`);
|
|
66
|
+
console.log(` Workspace: ${workspacePath}`);
|
|
67
|
+
console.log(" Reload Cursor for changes to take effect");
|
|
68
|
+
}
|
|
69
|
+
export async function setupVsCodeCopilot() {
|
|
70
|
+
const workspacePath = process.cwd();
|
|
71
|
+
const localConfigPath = path.join(workspacePath, ".vscode", "mcp.json");
|
|
47
72
|
const globalConfigPath = path.join(process.env.HOME || "", ".vscode", "mcp.json");
|
|
48
73
|
let configPath = localConfigPath;
|
|
49
74
|
const exists = fs.existsSync(localConfigPath);
|
|
50
75
|
if (!exists && fs.existsSync(globalConfigPath)) {
|
|
51
76
|
configPath = globalConfigPath;
|
|
52
77
|
}
|
|
53
|
-
await updateMcpConfig(configPath, SERVER_NAME, buildServerConfig(
|
|
78
|
+
await updateMcpConfig(configPath, SERVER_NAME, buildServerConfig(workspacePath, { type: "stdio" }), "servers");
|
|
54
79
|
console.log(`✓ VS Code (GitHub Copilot) MCP config updated: ${configPath}`);
|
|
55
|
-
|
|
56
|
-
console.log(` Session: ${session}`);
|
|
80
|
+
console.log(` Workspace: ${workspacePath}`);
|
|
57
81
|
console.log(" Restart VS Code for changes to take effect");
|
|
58
82
|
}
|
|
59
|
-
export async function setupVsCodeClaude(
|
|
60
|
-
const
|
|
61
|
-
|
|
83
|
+
export async function setupVsCodeClaude() {
|
|
84
|
+
const workspacePath = process.cwd();
|
|
85
|
+
const configPath = path.join(workspacePath, ".vscode", "mcp.json");
|
|
86
|
+
await updateMcpConfig(configPath, SERVER_NAME, buildServerConfig(workspacePath), "mcpServers");
|
|
62
87
|
console.log(`✓ VS Code (Claude Code) MCP config updated: ${configPath}`);
|
|
63
|
-
|
|
64
|
-
console.log(` Session: ${session}`);
|
|
88
|
+
console.log(` Workspace: ${workspacePath}`);
|
|
65
89
|
console.log(" Restart VS Code for changes to take effect");
|
|
66
90
|
}
|
|
67
|
-
export async function setupClaudeCodeCli(
|
|
91
|
+
export async function setupClaudeCodeCli() {
|
|
68
92
|
const homeDir = process.env.HOME || "";
|
|
69
93
|
const configPath = path.join(homeDir, ".claude.json");
|
|
70
|
-
const
|
|
94
|
+
const workspacePath = process.cwd();
|
|
71
95
|
if (!fs.existsSync(configPath)) {
|
|
72
96
|
console.log(" Skipping Claude Code CLI (no ~/.claude.json found)");
|
|
73
97
|
return;
|
|
@@ -75,48 +99,47 @@ export async function setupClaudeCodeCli(session) {
|
|
|
75
99
|
try {
|
|
76
100
|
const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
77
101
|
config.projects ??= {};
|
|
78
|
-
config.projects[
|
|
79
|
-
config.projects[
|
|
80
|
-
config.projects[
|
|
102
|
+
config.projects[workspacePath] ??= {};
|
|
103
|
+
config.projects[workspacePath].mcpServers ??= {};
|
|
104
|
+
config.projects[workspacePath].mcpServers[SERVER_NAME] = {
|
|
81
105
|
type: "stdio",
|
|
82
106
|
command: "zivis",
|
|
83
|
-
args: ["mcp", "serve"],
|
|
84
|
-
env: session ? { ZIVIS_SESSION: session } : {},
|
|
107
|
+
args: ["mcp", "serve", "--workspace", workspacePath],
|
|
85
108
|
};
|
|
86
109
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
87
110
|
console.log("✓ Claude Code CLI MCP config updated: ~/.claude.json");
|
|
88
|
-
|
|
89
|
-
console.log(` Session: ${session}`);
|
|
111
|
+
console.log(` Workspace: ${workspacePath}`);
|
|
90
112
|
console.log(" Restart Claude Code for changes to take effect");
|
|
91
113
|
}
|
|
92
114
|
catch (err) {
|
|
93
115
|
console.log(` WARNING: Failed to update ~/.claude.json: ${err instanceof Error ? err.message : err}`);
|
|
94
116
|
}
|
|
95
117
|
}
|
|
96
|
-
export async function setupCline(
|
|
118
|
+
export async function setupCline() {
|
|
119
|
+
const workspacePath = process.cwd();
|
|
97
120
|
const homeDir = process.env.HOME || "";
|
|
98
121
|
const configPath = process.platform === "darwin"
|
|
99
122
|
? path.join(homeDir, "Library", "Application Support", "Code", "User", "globalStorage", "saoudrizwan.claude-dev", "settings", "cline_mcp_settings.json")
|
|
100
123
|
: path.join(homeDir, ".config", "Code", "User", "globalStorage", "saoudrizwan.claude-dev", "settings", "cline_mcp_settings.json");
|
|
101
|
-
await updateMcpConfig(configPath, SERVER_NAME, buildServerConfig(
|
|
124
|
+
await updateMcpConfig(configPath, SERVER_NAME, buildServerConfig(workspacePath), "mcpServers");
|
|
102
125
|
console.log(`✓ Cline MCP config updated: ${configPath}`);
|
|
103
|
-
|
|
104
|
-
console.log(` Session: ${session}`);
|
|
126
|
+
console.log(` Workspace: ${workspacePath}`);
|
|
105
127
|
console.log(" Restart VS Code for changes to take effect");
|
|
106
128
|
}
|
|
107
|
-
export async function setupWindsurf(
|
|
129
|
+
export async function setupWindsurf() {
|
|
130
|
+
const workspacePath = process.cwd();
|
|
108
131
|
const homeDir = process.env.HOME || "";
|
|
109
132
|
const configPath = path.join(homeDir, ".codeium", "windsurf", "mcp_config.json");
|
|
110
|
-
await updateMcpConfig(configPath, SERVER_NAME, buildServerConfig(
|
|
133
|
+
await updateMcpConfig(configPath, SERVER_NAME, buildServerConfig(workspacePath), "mcpServers");
|
|
111
134
|
console.log(`✓ Windsurf MCP config updated: ${configPath}`);
|
|
112
|
-
|
|
113
|
-
console.log(` Session: ${session}`);
|
|
135
|
+
console.log(` Workspace: ${workspacePath}`);
|
|
114
136
|
console.log(" Restart Windsurf for changes to take effect");
|
|
115
137
|
}
|
|
116
|
-
export function printClaudeCodeManual(
|
|
138
|
+
export function printClaudeCodeManual() {
|
|
139
|
+
const workspacePath = process.cwd();
|
|
117
140
|
const serverConfig = {
|
|
118
141
|
mcpServers: {
|
|
119
|
-
[SERVER_NAME]: buildServerConfig(
|
|
142
|
+
[SERVER_NAME]: buildServerConfig(workspacePath),
|
|
120
143
|
},
|
|
121
144
|
};
|
|
122
145
|
console.log("");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ide-setup.js","sourceRoot":"","sources":["../../src/internal/ide-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,WAAW,GAAG,OAAO,CAAC;AAE5B,SAAS,iBAAiB,CACxB,
|
|
1
|
+
{"version":3,"file":"ide-setup.js","sourceRoot":"","sources":["../../src/internal/ide-setup.ts"],"names":[],"mappings":"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"}
|