@posthog/wizard 2.10.3 → 2.11.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.
Files changed (81) hide show
  1. package/dist/{McpScreen-23GY1pWz.js → McpScreen-DvUncZBi.js} +153 -23
  2. package/dist/McpScreen-DvUncZBi.js.map +1 -0
  3. package/dist/{add-mcp-server-to-clients-B6baHy_h.js → add-mcp-server-to-clients-Br1hDRiB.js} +157 -125
  4. package/dist/add-mcp-server-to-clients-Br1hDRiB.js.map +1 -0
  5. package/dist/{agent-runner-CBPBefLt.js → agent-runner-fWYFO4H0.js} +11 -9
  6. package/dist/agent-runner-fWYFO4H0.js.map +1 -0
  7. package/dist/{agent-skill-BVjJqol6.js → agent-skill-DJOzDaQV.js} +1 -1
  8. package/dist/{agent-skill-BVjJqol6.js.map → agent-skill-DJOzDaQV.js.map} +1 -1
  9. package/dist/analytics-CfAUlt6-.js +2 -0
  10. package/dist/{analytics-xANpxdVL.js → analytics-D3rY3TaN.js} +7 -4
  11. package/dist/analytics-D3rY3TaN.js.map +1 -0
  12. package/dist/bin.js +234 -41
  13. package/dist/bin.js.map +1 -1
  14. package/dist/{debug-CIyf0ZGx.js → debug-D-0xueVl.js} +1 -1
  15. package/dist/{debug-CyJ_3dTP.js → debug-gWEjmYVV.js} +4 -2
  16. package/dist/{debug-CyJ_3dTP.js.map → debug-gWEjmYVV.js.map} +1 -1
  17. package/dist/{defaults-DoVkE0gW.js → defaults-CPH6eWhN.js} +8 -8
  18. package/dist/defaults-CPH6eWhN.js.map +1 -0
  19. package/dist/{detection-Drfq0l8n.js → detection-B7GNzve-.js} +103 -19
  20. package/dist/detection-B7GNzve-.js.map +1 -0
  21. package/dist/{env-api-key-K8TdTDII.js → env-api-key-DU8uIEvo.js} +1 -1
  22. package/dist/{env-api-key-K8TdTDII.js.map → env-api-key-DU8uIEvo.js.map} +1 -1
  23. package/dist/file-DhSBlq-x.js +16 -0
  24. package/dist/file-DhSBlq-x.js.map +1 -0
  25. package/dist/{file-utils-BWneZy6p.js → file-utils-Dy9JncCo.js} +1 -1
  26. package/dist/{file-utils-BWneZy6p.js.map → file-utils-Dy9JncCo.js.map} +1 -1
  27. package/dist/package-json-BzVey4Bd.js +2 -0
  28. package/dist/{package-json-Ctq6LSl8.js → package-json-F_7oktsp.js} +1 -1
  29. package/dist/{package-json-Ctq6LSl8.js.map → package-json-F_7oktsp.js.map} +1 -1
  30. package/dist/{package-manager-Ls_8r9Ot.js → package-manager-D3Lo6nXf.js} +2 -2
  31. package/dist/{package-manager-Ls_8r9Ot.js.map → package-manager-D3Lo6nXf.js.map} +1 -1
  32. package/dist/paths-BL-x2rFy.js +16 -0
  33. package/dist/paths-BL-x2rFy.js.map +1 -0
  34. package/dist/posthog-ByrpqEjN.js +11 -0
  35. package/dist/posthog-ByrpqEjN.js.map +1 -0
  36. package/dist/{posthog-integration-DUZpiyxg.js → posthog-integration-D4SRhJIQ.js} +10 -9
  37. package/dist/posthog-integration-D4SRhJIQ.js.map +1 -0
  38. package/dist/{readiness-BAgN8xAg.js → readiness-gQvQNCeL.js} +10 -10
  39. package/dist/readiness-gQvQNCeL.js.map +1 -0
  40. package/dist/{registry-qfhSxTjo.js → registry-DaPKstG3.js} +6 -6
  41. package/dist/{registry-qfhSxTjo.js.map → registry-DaPKstG3.js.map} +1 -1
  42. package/dist/{router-D5A1Sb4p.js → router-SgzmfLGi.js} +11 -18
  43. package/dist/router-SgzmfLGi.js.map +1 -0
  44. package/dist/setup-utils-_ONxN-TT.js +2 -0
  45. package/dist/{setup-utils-C1h1QDiG.js → setup-utils-y4s-3uKT.js} +13 -7
  46. package/dist/setup-utils-y4s-3uKT.js.map +1 -0
  47. package/dist/{start-playground-xOLMYzst.js → start-playground-g1TxpCZ5.js} +84 -7
  48. package/dist/start-playground-g1TxpCZ5.js.map +1 -0
  49. package/dist/{start-tui-Ddo4TI9T.js → start-tui-CQef69NR.js} +305 -23
  50. package/dist/start-tui-CQef69NR.js.map +1 -0
  51. package/dist/{steps-BjvFG--8.js → steps-D1zKDqAo.js} +6 -6
  52. package/dist/{steps-BjvFG--8.js.map → steps-D1zKDqAo.js.map} +1 -1
  53. package/dist/task-stream-DX_jKDQu.js +61 -0
  54. package/dist/task-stream-DX_jKDQu.js.map +1 -0
  55. package/dist/{telemetry-CC6zPKJg.js → telemetry-CyUUSAYy.js} +2 -2
  56. package/dist/{telemetry-CC6zPKJg.js.map → telemetry-CyUUSAYy.js.map} +1 -1
  57. package/dist/{wizard-abort-XhapT0Ly.js → wizard-abort-Buodno3f.js} +3 -3
  58. package/dist/{wizard-abort-XhapT0Ly.js.map → wizard-abort-Buodno3f.js.map} +1 -1
  59. package/dist/{wizard-abort-Bc3lWNLb.js → wizard-abort-DZmO_sIZ.js} +1 -1
  60. package/dist/wizard-session-COhklXAF.js +2 -0
  61. package/dist/{wizard-session-Db6R023m.js → wizard-session-D5bggSsu.js} +1 -1
  62. package/dist/{wizard-session-Db6R023m.js.map → wizard-session-D5bggSsu.js.map} +1 -1
  63. package/dist/wizard-ui-BExOjdjA.js +14 -0
  64. package/dist/wizard-ui-BExOjdjA.js.map +1 -0
  65. package/npm-shrinkwrap.json +2 -2
  66. package/package.json +1 -1
  67. package/dist/McpScreen-23GY1pWz.js.map +0 -1
  68. package/dist/add-mcp-server-to-clients-B6baHy_h.js.map +0 -1
  69. package/dist/agent-runner-CBPBefLt.js.map +0 -1
  70. package/dist/analytics-DdTDVjqs.js +0 -2
  71. package/dist/analytics-xANpxdVL.js.map +0 -1
  72. package/dist/defaults-DoVkE0gW.js.map +0 -1
  73. package/dist/detection-Drfq0l8n.js.map +0 -1
  74. package/dist/package-json-BQgl5C3Z.js +0 -2
  75. package/dist/posthog-integration-DUZpiyxg.js.map +0 -1
  76. package/dist/readiness-BAgN8xAg.js.map +0 -1
  77. package/dist/router-D5A1Sb4p.js.map +0 -1
  78. package/dist/setup-utils-C1h1QDiG.js.map +0 -1
  79. package/dist/start-playground-xOLMYzst.js.map +0 -1
  80. package/dist/start-tui-Ddo4TI9T.js.map +0 -1
  81. package/dist/wizard-session-y7nf6aKH.js +0 -2
@@ -1,15 +1,18 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B_-DWIq7.js";
2
- import { c as getUI, f as runtimeEnv, r as debug } from "./debug-CyJ_3dTP.js";
3
- import { n as analytics } from "./analytics-xANpxdVL.js";
4
- import { t as traceStep } from "./telemetry-CC6zPKJg.js";
5
- import { a as getNativeHTTPServerConfig, i as getDefaultServerConfig, r as buildMCPUrl, t as ALL_FEATURE_VALUES } from "./defaults-DoVkE0gW.js";
2
+ import { c as getUI, f as runtimeEnv, r as debug } from "./debug-gWEjmYVV.js";
3
+ import { n as analytics } from "./analytics-D3rY3TaN.js";
4
+ import { t as traceStep } from "./telemetry-CyUUSAYy.js";
5
+ import { i as getNativeHTTPServerConfig, r as getDefaultServerConfig, t as ALL_FEATURE_VALUES } from "./defaults-CPH6eWhN.js";
6
6
  import { execSync, spawnSync } from "node:child_process";
7
- import * as fs$1 from "fs";
8
- import * as path$1 from "path";
7
+ import * as fs$1 from "node:fs";
8
+ import * as os from "node:os";
9
+ import * as path$1 from "node:path";
10
+ import * as fs$2 from "fs";
11
+ import * as path$2 from "path";
9
12
  import z$1 from "zod";
10
13
  import { execSync as execSync$1 } from "child_process";
11
14
  import * as jsonc from "jsonc-parser";
12
- import * as os from "os";
15
+ import * as os$1 from "os";
13
16
  //#region src/steps/add-mcp-server-to-clients/MCPClient.ts
14
17
  var MCPClient = class {
15
18
  name;
@@ -22,14 +25,14 @@ var DefaultMCPClient = class extends MCPClient {
22
25
  getServerPropertyName() {
23
26
  return "mcpServers";
24
27
  }
25
- getServerConfig(apiKey, type, selectedFeatures, local) {
26
- return getDefaultServerConfig(apiKey, type, selectedFeatures, local);
28
+ getServerConfig(apiKey, selectedFeatures, local) {
29
+ return getDefaultServerConfig(apiKey, selectedFeatures, local);
27
30
  }
28
31
  async isServerInstalled(local) {
29
32
  try {
30
33
  const configPath = await this.getConfigPath();
31
- if (!fs$1.existsSync(configPath)) return false;
32
- const configContent = await fs$1.promises.readFile(configPath, "utf8");
34
+ if (!fs$2.existsSync(configPath)) return false;
35
+ const configContent = await fs$2.promises.readFile(configPath, "utf8");
33
36
  const config = jsonc.parse(configContent);
34
37
  const serverPropertyName = this.getServerPropertyName();
35
38
  const serverName = local ? "posthog-local" : "posthog";
@@ -39,21 +42,18 @@ var DefaultMCPClient = class extends MCPClient {
39
42
  }
40
43
  }
41
44
  async addServer(apiKey, selectedFeatures, local) {
42
- return this._addServerType(apiKey, "sse", selectedFeatures, local);
43
- }
44
- async _addServerType(apiKey, type, selectedFeatures, local) {
45
45
  try {
46
46
  const configPath = await this.getConfigPath();
47
- const configDir = path$1.dirname(configPath);
48
- await fs$1.promises.mkdir(configDir, { recursive: true });
47
+ const configDir = path$2.dirname(configPath);
48
+ await fs$2.promises.mkdir(configDir, { recursive: true });
49
49
  const serverPropertyName = this.getServerPropertyName();
50
50
  let configContent = "";
51
51
  let existingConfig = {};
52
- if (fs$1.existsSync(configPath)) {
53
- configContent = await fs$1.promises.readFile(configPath, "utf8");
52
+ if (fs$2.existsSync(configPath)) {
53
+ configContent = await fs$2.promises.readFile(configPath, "utf8");
54
54
  existingConfig = jsonc.parse(configContent) || {};
55
55
  }
56
- const newServerConfig = this.getServerConfig(apiKey, type, selectedFeatures, local);
56
+ const newServerConfig = this.getServerConfig(apiKey, selectedFeatures, local);
57
57
  const typedConfig = existingConfig;
58
58
  if (!typedConfig[serverPropertyName]) typedConfig[serverPropertyName] = {};
59
59
  const serverName = local ? "posthog-local" : "posthog";
@@ -63,7 +63,7 @@ var DefaultMCPClient = class extends MCPClient {
63
63
  insertSpaces: true
64
64
  } });
65
65
  const modifiedContent = jsonc.applyEdits(configContent, edits);
66
- await fs$1.promises.writeFile(configPath, modifiedContent, "utf8");
66
+ await fs$2.promises.writeFile(configPath, modifiedContent, "utf8");
67
67
  return { success: true };
68
68
  } catch {
69
69
  return { success: false };
@@ -72,8 +72,8 @@ var DefaultMCPClient = class extends MCPClient {
72
72
  async removeServer(local) {
73
73
  try {
74
74
  const configPath = await this.getConfigPath();
75
- if (!fs$1.existsSync(configPath)) return { success: false };
76
- const configContent = await fs$1.promises.readFile(configPath, "utf8");
75
+ if (!fs$2.existsSync(configPath)) return { success: false };
76
+ const configContent = await fs$2.promises.readFile(configPath, "utf8");
77
77
  const config = jsonc.parse(configContent);
78
78
  const serverPropertyName = this.getServerPropertyName();
79
79
  const serverName = local ? "posthog-local" : "posthog";
@@ -83,7 +83,7 @@ var DefaultMCPClient = class extends MCPClient {
83
83
  insertSpaces: true
84
84
  } });
85
85
  const modifiedContent = jsonc.applyEdits(configContent, edits);
86
- await fs$1.promises.writeFile(configPath, modifiedContent, "utf8");
86
+ await fs$2.promises.writeFile(configPath, modifiedContent, "utf8");
87
87
  return { success: true };
88
88
  }
89
89
  } catch {}
@@ -101,13 +101,10 @@ var CursorMCPClient = class extends DefaultMCPClient {
101
101
  return Promise.resolve(process.platform === "darwin" || process.platform === "win32");
102
102
  }
103
103
  async getConfigPath() {
104
- return Promise.resolve(path$1.join(os.homedir(), ".cursor", "mcp.json"));
105
- }
106
- getServerConfig(apiKey, type, selectedFeatures, local) {
107
- return getNativeHTTPServerConfig(apiKey, type, selectedFeatures, local);
104
+ return Promise.resolve(path$2.join(os$1.homedir(), ".cursor", "mcp.json"));
108
105
  }
109
- async addServer(apiKey, selectedFeatures, local) {
110
- return this._addServerType(apiKey, "streamable-http", selectedFeatures, local);
106
+ getServerConfig(apiKey, selectedFeatures, local) {
107
+ return getNativeHTTPServerConfig(apiKey, selectedFeatures, local);
111
108
  }
112
109
  };
113
110
  //#endregion
@@ -121,11 +118,11 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
121
118
  findClaudeBinary() {
122
119
  if (this.claudeBinaryPath) return this.claudeBinaryPath;
123
120
  const possiblePaths = [
124
- path$1.join(os.homedir(), ".claude", "local", "claude"),
121
+ path$2.join(os$1.homedir(), ".claude", "local", "claude"),
125
122
  "/usr/local/bin/claude",
126
123
  "/opt/homebrew/bin/claude"
127
124
  ];
128
- for (const claudePath of possiblePaths) if (fs$1.existsSync(claudePath)) {
125
+ for (const claudePath of possiblePaths) if (fs$2.existsSync(claudePath)) {
129
126
  debug(` Found claude binary at: ${claudePath}`);
130
127
  this.claudeBinaryPath = claudePath;
131
128
  return claudePath;
@@ -144,7 +141,7 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
144
141
  const claudeBinary = this.findClaudeBinary();
145
142
  if (!claudeBinary) {
146
143
  debug(" Claude Code not found. Installation paths checked:");
147
- debug(` - ${path$1.join(os.homedir(), ".claude", "local", "claude")}`);
144
+ debug(` - ${path$2.join(os$1.homedir(), ".claude", "local", "claude")}`);
148
145
  debug(` - /usr/local/bin/claude`);
149
146
  debug(` - /opt/homebrew/bin/claude`);
150
147
  debug(` - PATH`);
@@ -157,44 +154,55 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
157
154
  return Promise.resolve(false);
158
155
  }
159
156
  }
160
- isServerInstalled(local) {
161
- try {
162
- const claudeBinary = this.findClaudeBinary();
163
- if (!claudeBinary) return Promise.resolve(false);
164
- const outputStr = execSync$1(`${claudeBinary} mcp list`, { stdio: "pipe" }).toString();
165
- const serverName = local ? "posthog-local" : "posthog";
166
- if (outputStr.includes(serverName)) return Promise.resolve(true);
167
- } catch {}
168
- return Promise.resolve(false);
157
+ isServerInstalled() {
158
+ return this.isPluginInstalled();
169
159
  }
170
160
  getConfigPath() {
171
161
  throw new Error("Not implemented");
172
162
  }
173
- addServer(apiKey, selectedFeatures, local) {
163
+ async addServer() {
164
+ return { success: (await this.installPlugin()).success };
165
+ }
166
+ removeServer(local) {
174
167
  const claudeBinary = this.findClaudeBinary();
175
168
  if (!claudeBinary) return Promise.resolve({ success: false });
176
- const command = `${claudeBinary} mcp add --transport http ${local ? "posthog-local" : "posthog"} ${buildMCPUrl("streamable-http", selectedFeatures, local)} ${apiKey ? `--header "Authorization: Bearer ${apiKey}"` : ""} -s user`.trim();
169
+ const command = `${claudeBinary} mcp remove --scope user ${local ? "posthog-local" : "posthog"}`;
177
170
  try {
178
171
  execSync$1(command);
179
172
  } catch (error) {
180
- const msg = error instanceof Error ? error.message : String(error);
181
- if (msg.includes("already exists")) return Promise.resolve({ success: true });
182
- analytics.captureException(/* @__PURE__ */ new Error(`Failed to add server to Claude Code: ${msg}`));
173
+ analytics.captureException(/* @__PURE__ */ new Error(`Failed to remove server from Claude Code: ${error instanceof Error ? error.message : String(error)}`));
183
174
  return Promise.resolve({ success: false });
184
175
  }
185
176
  return Promise.resolve({ success: true });
186
177
  }
187
- removeServer(local) {
188
- const claudeBinary = this.findClaudeBinary();
189
- if (!claudeBinary) return Promise.resolve({ success: false });
190
- const command = `${claudeBinary} mcp remove --scope user ${local ? "posthog-local" : "posthog"}`;
178
+ supportsPlugin() {
179
+ return this.findClaudeBinary() !== null;
180
+ }
181
+ isPluginInstalled() {
182
+ const binary = this.findClaudeBinary();
183
+ if (!binary) return Promise.resolve(false);
191
184
  try {
192
- execSync$1(command);
185
+ const output = execSync$1(`${binary} plugin list`, { stdio: "pipe" }).toString();
186
+ return Promise.resolve(output.toLowerCase().includes("posthog"));
187
+ } catch {
188
+ return Promise.resolve(false);
189
+ }
190
+ }
191
+ installPlugin() {
192
+ const binary = this.findClaudeBinary();
193
+ if (!binary) return Promise.resolve({ success: false });
194
+ try {
195
+ execSync$1(`${binary} plugin install posthog`, { stdio: "pipe" });
196
+ return Promise.resolve({ success: true });
193
197
  } catch (error) {
194
- analytics.captureException(/* @__PURE__ */ new Error(`Failed to remove server from Claude Code: ${error instanceof Error ? error.message : String(error)}`));
198
+ const msg = error instanceof Error ? error.message : String(error);
199
+ if (msg.includes("already installed") || msg.includes("already exists")) return Promise.resolve({
200
+ success: true,
201
+ alreadyInstalled: true
202
+ });
203
+ analytics.captureException(/* @__PURE__ */ new Error(`Claude Code plugin install failed: ${msg}`));
195
204
  return Promise.resolve({ success: false });
196
205
  }
197
- return Promise.resolve({ success: true });
198
206
  }
199
207
  };
200
208
  z$1.object({ servers: z$1.record(z$1.string(), z$1.union([z$1.object({
@@ -215,25 +223,21 @@ var VisualStudioCodeClient = class extends DefaultMCPClient {
215
223
  return Promise.resolve(process.platform === "darwin" || process.platform === "win32" || process.platform === "linux");
216
224
  }
217
225
  async getConfigPath() {
218
- const homeDir = os.homedir();
226
+ const homeDir = os$1.homedir();
219
227
  const isWindows = process.platform === "win32";
220
228
  const isMac = process.platform === "darwin";
221
229
  const isLinux = process.platform === "linux";
222
- if (isMac) return Promise.resolve(path$1.join(homeDir, "Library", "Application Support", "Code", "User", "mcp.json"));
223
- if (isWindows) return Promise.resolve(path$1.join(runtimeEnv("APPDATA") || "", "Code", "User", "mcp.json"));
224
- if (isLinux) return Promise.resolve(path$1.join(homeDir, ".config", "Code", "User", "mcp.json"));
230
+ if (isMac) return Promise.resolve(path$2.join(homeDir, "Library", "Application Support", "Code", "User", "mcp.json"));
231
+ if (isWindows) return Promise.resolve(path$2.join(runtimeEnv("APPDATA") || "", "Code", "User", "mcp.json"));
232
+ if (isLinux) return Promise.resolve(path$2.join(homeDir, ".config", "Code", "User", "mcp.json"));
225
233
  throw new Error(`Unsupported platform: ${process.platform}`);
226
234
  }
227
- getServerConfig(apiKey, type, selectedFeatures, local) {
235
+ getServerConfig(apiKey, selectedFeatures, local) {
228
236
  return {
229
237
  type: "http",
230
- url: buildMCPUrl(type, selectedFeatures, local),
231
- headers: { Authorization: `Bearer ${apiKey}` }
238
+ ...getNativeHTTPServerConfig(apiKey, selectedFeatures, local)
232
239
  };
233
240
  }
234
- async addServer(apiKey, selectedFeatures, local) {
235
- return this._addServerType(apiKey, "streamable-http", selectedFeatures, local);
236
- }
237
241
  };
238
242
  z$1.object({ context_servers: z$1.record(z$1.string(), z$1.union([z$1.object({
239
243
  enabled: z$1.boolean().optional(),
@@ -255,91 +259,62 @@ var ZedClient = class extends DefaultMCPClient {
255
259
  return Promise.resolve(process.platform === "darwin" || process.platform === "linux");
256
260
  }
257
261
  async getConfigPath() {
258
- const homeDir = os.homedir();
262
+ const homeDir = os$1.homedir();
259
263
  const isMac = process.platform === "darwin";
260
264
  const isLinux = process.platform === "linux";
261
- if (isMac) return Promise.resolve(path$1.join(homeDir, ".config", "zed", "settings.json"));
265
+ if (isMac) return Promise.resolve(path$2.join(homeDir, ".config", "zed", "settings.json"));
262
266
  if (isLinux) {
263
267
  const xdgConfigHome = runtimeEnv("XDG_CONFIG_HOME");
264
- if (xdgConfigHome) return Promise.resolve(path$1.join(xdgConfigHome, "zed", "settings.json"));
265
- return Promise.resolve(path$1.join(homeDir, ".config", "zed", "settings.json"));
268
+ if (xdgConfigHome) return Promise.resolve(path$2.join(xdgConfigHome, "zed", "settings.json"));
269
+ return Promise.resolve(path$2.join(homeDir, ".config", "zed", "settings.json"));
266
270
  }
267
271
  throw new Error(`Unsupported platform: ${process.platform}`);
268
272
  }
269
- getServerConfig(apiKey, type, selectedFeatures, local) {
273
+ getServerConfig(apiKey, selectedFeatures, local) {
270
274
  return {
271
275
  enabled: true,
272
- url: buildMCPUrl(type, selectedFeatures, local),
273
- headers: { Authorization: `Bearer ${apiKey}` }
276
+ ...getNativeHTTPServerConfig(apiKey, selectedFeatures, local)
274
277
  };
275
278
  }
276
- async addServer(apiKey, selectedFeatures, local) {
277
- return this._addServerType(apiKey, "streamable-http", selectedFeatures, local);
278
- }
279
279
  };
280
280
  //#endregion
281
281
  //#region src/steps/add-mcp-server-to-clients/clients/codex.ts
282
282
  var CodexMCPClient = class extends DefaultMCPClient {
283
283
  name = "Codex";
284
+ codexBinaryPath = null;
284
285
  constructor() {
285
286
  super();
286
287
  }
287
- isClientSupported() {
288
+ findCodexBinary() {
289
+ if (this.codexBinaryPath) return this.codexBinaryPath;
288
290
  try {
289
- execSync("codex --version", { stdio: "ignore" });
290
- return Promise.resolve(true);
291
- } catch {
292
- return Promise.resolve(false);
293
- }
291
+ const resolved = execSync("command -v codex", { stdio: "pipe" }).toString().trim();
292
+ if (resolved) {
293
+ this.codexBinaryPath = resolved;
294
+ return resolved;
295
+ }
296
+ } catch {}
297
+ return null;
298
+ }
299
+ isClientSupported() {
300
+ return Promise.resolve(this.findCodexBinary() !== null);
294
301
  }
295
302
  getConfigPath() {
296
303
  throw new Error("Not implemented");
297
304
  }
298
- isServerInstalled(local) {
299
- const serverName = local ? "posthog-local" : "posthog";
300
- try {
301
- const result = spawnSync("codex", [
302
- "mcp",
303
- "list",
304
- "--json"
305
- ], { encoding: "utf-8" });
306
- if (result.error || result.status !== 0) return Promise.resolve(false);
307
- const stdout = result.stdout?.trim();
308
- if (!stdout) return Promise.resolve(false);
309
- const servers = JSON.parse(stdout);
310
- return Promise.resolve(servers.some((server) => server.name === serverName));
311
- } catch {
312
- return Promise.resolve(false);
313
- }
305
+ isServerInstalled() {
306
+ return this.isPluginInstalled();
314
307
  }
315
- addServer(apiKey, selectedFeatures, local) {
316
- const args = [
317
- "mcp",
318
- "add",
319
- local ? "posthog-local" : "posthog",
320
- "--url",
321
- buildMCPUrl("streamable-http", selectedFeatures, local)
322
- ];
323
- const env = { ...process.env };
324
- if (apiKey) {
325
- env.POSTHOG_API_KEY = apiKey;
326
- args.push("--bearer-token-env-var", "POSTHOG_API_KEY");
327
- }
328
- const result = spawnSync("codex", args, {
329
- stdio: "ignore",
330
- env
331
- });
332
- if (result.error || result.status !== 0) {
333
- analytics.captureException(/* @__PURE__ */ new Error("Failed to add server to Codex CLI."));
334
- return Promise.resolve({ success: false });
335
- }
336
- return Promise.resolve({ success: true });
308
+ async addServer() {
309
+ return { success: (await this.installPlugin()).success };
337
310
  }
338
- removeServer(local) {
339
- const result = spawnSync("codex", [
311
+ removeServer() {
312
+ const binary = this.findCodexBinary();
313
+ if (!binary) return Promise.resolve({ success: false });
314
+ const result = spawnSync(binary, [
340
315
  "mcp",
341
316
  "remove",
342
- local ? "posthog-local" : "posthog"
317
+ "posthog"
343
318
  ], { stdio: "ignore" });
344
319
  if (result.error || result.status !== 0) {
345
320
  analytics.captureException(/* @__PURE__ */ new Error("Failed to remove server from Codex CLI."));
@@ -347,24 +322,69 @@ var CodexMCPClient = class extends DefaultMCPClient {
347
322
  }
348
323
  return Promise.resolve({ success: true });
349
324
  }
325
+ supportsPlugin() {
326
+ return this.findCodexBinary() !== null;
327
+ }
328
+ isPluginInstalled() {
329
+ const configPath = path$1.join(os.homedir(), ".codex", "config.toml");
330
+ try {
331
+ const contents = fs$1.readFileSync(configPath, "utf-8");
332
+ return Promise.resolve(contents.toLowerCase().includes("[marketplaces.posthog]"));
333
+ } catch {
334
+ return Promise.resolve(false);
335
+ }
336
+ }
337
+ installPlugin() {
338
+ const binary = this.findCodexBinary();
339
+ if (!binary) return Promise.resolve({ success: false });
340
+ const run = () => spawnSync(binary, [
341
+ "plugin",
342
+ "marketplace",
343
+ "add",
344
+ "PostHog/ai-plugin"
345
+ ], { encoding: "utf-8" });
346
+ let result = run();
347
+ if (result.status !== 0 && (result.stderr ?? "").includes("already added from a different source")) {
348
+ const staleDir = path$1.join(os.homedir(), ".codex", ".tmp", "marketplaces", "posthog");
349
+ try {
350
+ fs$1.rmSync(staleDir, {
351
+ recursive: true,
352
+ force: true
353
+ });
354
+ } catch {}
355
+ result = run();
356
+ }
357
+ if (result.status !== 0) {
358
+ analytics.captureException(/* @__PURE__ */ new Error(`Codex plugin install failed: ${result.stderr ?? ""}`));
359
+ return Promise.resolve({ success: false });
360
+ }
361
+ return Promise.resolve({ success: true });
362
+ }
350
363
  };
351
364
  //#endregion
365
+ //#region src/steps/add-mcp-server-to-clients/plugin-client.ts
366
+ function isPluginCapable(client) {
367
+ return typeof client === "object" && client !== null && "supportsPlugin" in client && "installPlugin" in client;
368
+ }
369
+ //#endregion
352
370
  //#region src/steps/add-mcp-server-to-clients/index.ts
353
371
  var add_mcp_server_to_clients_exports = /* @__PURE__ */ __exportAll({
354
372
  addMCPServer: () => addMCPServer,
355
373
  addMCPServerToClientsStep: () => addMCPServerToClientsStep,
356
374
  getInstalledClients: () => getInstalledClients,
357
375
  getSupportedClients: () => getSupportedClients,
376
+ getSupportedPluginClients: () => getSupportedPluginClients,
377
+ installPlugins: () => installPlugins,
358
378
  removeMCPServer: () => removeMCPServer,
359
379
  removeMCPServerFromClientsStep: () => removeMCPServerFromClientsStep
360
380
  });
361
381
  const getSupportedClients = async () => {
362
382
  const allClients = [
363
- new CursorMCPClient(),
364
383
  new ClaudeCodeMCPClient(),
384
+ new CodexMCPClient(),
385
+ new CursorMCPClient(),
365
386
  new VisualStudioCodeClient(),
366
- new ZedClient(),
367
- new CodexMCPClient()
387
+ new ZedClient()
368
388
  ];
369
389
  const supportedClients = [];
370
390
  debug("Checking for supported MCP clients...");
@@ -427,10 +447,22 @@ const getInstalledClients = async (local) => {
427
447
  const addMCPServer = async (clients, personalApiKey, selectedFeatures, local) => {
428
448
  for (const client of clients) await client.addServer(personalApiKey, selectedFeatures, local);
429
449
  };
450
+ const getSupportedPluginClients = (clients) => {
451
+ return clients.filter(isPluginCapable).filter((c) => c.supportsPlugin());
452
+ };
453
+ const installPlugins = async (clients) => {
454
+ const installed = [];
455
+ for (const client of clients) try {
456
+ if ((await client.installPlugin()).success) installed.push(client.name);
457
+ } catch (err) {
458
+ debug(`[installPlugins] installPlugin threw for ${client.name}: ${err}`);
459
+ }
460
+ return installed;
461
+ };
430
462
  const removeMCPServer = async (clients, local) => {
431
463
  for (const client of clients) await client.removeServer(local);
432
464
  };
433
465
  //#endregion
434
- export { getSupportedClients as a, getInstalledClients as i, addMCPServerToClientsStep as n, removeMCPServer as o, add_mcp_server_to_clients_exports as r, removeMCPServerFromClientsStep as s, addMCPServer as t };
466
+ export { getSupportedClients as a, removeMCPServer as c, getInstalledClients as i, removeMCPServerFromClientsStep as l, addMCPServerToClientsStep as n, getSupportedPluginClients as o, add_mcp_server_to_clients_exports as r, installPlugins as s, addMCPServer as t, isPluginCapable as u };
435
467
 
436
- //# sourceMappingURL=add-mcp-server-to-clients-B6baHy_h.js.map
468
+ //# sourceMappingURL=add-mcp-server-to-clients-Br1hDRiB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp-server-to-clients-Br1hDRiB.js","names":["fs","path","path","os","path","os","fs","execSync","z","os","path","z","os","path","path","fs"],"sources":["../src/steps/add-mcp-server-to-clients/MCPClient.ts","../src/steps/add-mcp-server-to-clients/clients/cursor.ts","../src/steps/add-mcp-server-to-clients/clients/claude-code.ts","../src/steps/add-mcp-server-to-clients/clients/visual-studio-code.ts","../src/steps/add-mcp-server-to-clients/clients/zed.ts","../src/steps/add-mcp-server-to-clients/clients/codex.ts","../src/steps/add-mcp-server-to-clients/plugin-client.ts","../src/steps/add-mcp-server-to-clients/index.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as jsonc from 'jsonc-parser';\nimport { getDefaultServerConfig } from './defaults';\n\nexport type MCPServerConfig = Record<string, unknown>;\n\nexport abstract class MCPClient {\n name: string;\n abstract getConfigPath(): Promise<string>;\n abstract getServerPropertyName(): string;\n abstract isServerInstalled(local?: boolean): Promise<boolean>;\n abstract addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<{ success: boolean }>;\n abstract removeServer(local?: boolean): Promise<{ success: boolean }>;\n abstract isClientSupported(): Promise<boolean>;\n}\n\nexport abstract class DefaultMCPClient extends MCPClient {\n name = 'Default';\n\n constructor() {\n super();\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return getDefaultServerConfig(apiKey, selectedFeatures, local);\n }\n\n async isServerInstalled(local?: boolean): Promise<boolean> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return false;\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = jsonc.parse(configContent) as Record<string, any>;\n const serverPropertyName = this.getServerPropertyName();\n const serverName = local ? 'posthog-local' : 'posthog';\n\n return (\n serverPropertyName in config && serverName in config[serverPropertyName]\n );\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<{ success: boolean }> {\n try {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n await fs.promises.mkdir(configDir, { recursive: true });\n\n const serverPropertyName = this.getServerPropertyName();\n let configContent = '';\n let existingConfig = {};\n\n if (fs.existsSync(configPath)) {\n configContent = await fs.promises.readFile(configPath, 'utf8');\n existingConfig = jsonc.parse(configContent) || {};\n }\n\n const newServerConfig = this.getServerConfig(\n apiKey,\n selectedFeatures,\n local,\n );\n const typedConfig = existingConfig as Record<string, any>;\n if (!typedConfig[serverPropertyName]) {\n typedConfig[serverPropertyName] = {};\n }\n const serverName = local ? 'posthog-local' : 'posthog';\n typedConfig[serverPropertyName][serverName] = newServerConfig;\n\n const edits = jsonc.modify(\n configContent,\n [serverPropertyName, serverName],\n newServerConfig,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n return { success: true };\n } catch {\n return { success: false };\n }\n }\n\n async removeServer(local?: boolean): Promise<{ success: boolean }> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { success: false };\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = jsonc.parse(configContent) as Record<string, any>;\n const serverPropertyName = this.getServerPropertyName();\n\n const serverName = local ? 'posthog-local' : 'posthog';\n\n if (\n serverPropertyName in config &&\n serverName in config[serverPropertyName]\n ) {\n const edits = jsonc.modify(\n configContent,\n [serverPropertyName, serverName],\n undefined,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n return { success: true };\n }\n } catch {\n //\n }\n\n return { success: false };\n }\n}\n","import { DefaultMCPClient, MCPServerConfig } from '../MCPClient';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DefaultMCPClientConfig, getNativeHTTPServerConfig } from '../defaults';\nimport { z } from 'zod';\n\nexport const CursorMCPConfig = DefaultMCPClientConfig;\n\nexport type CursorMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CursorMCPClient extends DefaultMCPClient {\n name = 'Cursor';\n\n constructor() {\n super();\n }\n\n async isClientSupported(): Promise<boolean> {\n return Promise.resolve(\n process.platform === 'darwin' || process.platform === 'win32',\n );\n }\n\n async getConfigPath(): Promise<string> {\n return Promise.resolve(path.join(os.homedir(), '.cursor', 'mcp.json'));\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return getNativeHTTPServerConfig(apiKey, selectedFeatures, local);\n }\n}\n","import { DefaultMCPClient } from '../MCPClient';\nimport { DefaultMCPClientConfig } from '../defaults';\nimport { PluginCapable, PluginInstallResult } from '../plugin-client';\nimport { z } from 'zod';\nimport { execSync } from 'child_process';\nimport { analytics } from '../../../utils/analytics';\nimport { debug } from '../../../utils/debug';\nimport * as os from 'os';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nexport const ClaudeCodeMCPConfig = DefaultMCPClientConfig;\n\nexport type ClaudeCodeMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class ClaudeCodeMCPClient\n extends DefaultMCPClient\n implements PluginCapable\n{\n name = 'Claude Code';\n private claudeBinaryPath: string | null = null;\n\n constructor() {\n super();\n }\n\n private findClaudeBinary(): string | null {\n if (this.claudeBinaryPath) {\n return this.claudeBinaryPath;\n }\n\n // Common installation paths for Claude Code CLI\n const possiblePaths = [\n path.join(os.homedir(), '.claude', 'local', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ];\n\n for (const claudePath of possiblePaths) {\n if (fs.existsSync(claudePath)) {\n debug(` Found claude binary at: ${claudePath}`);\n this.claudeBinaryPath = claudePath;\n return claudePath;\n }\n }\n\n // Try PATH as fallback\n try {\n execSync('command -v claude', { stdio: 'pipe' });\n debug(' Found claude in PATH');\n this.claudeBinaryPath = 'claude';\n return 'claude';\n } catch {\n // Not in PATH\n }\n\n return null;\n }\n\n isClientSupported(): Promise<boolean> {\n try {\n debug(' Checking for Claude Code...');\n const claudeBinary = this.findClaudeBinary();\n\n if (!claudeBinary) {\n debug(' Claude Code not found. Installation paths checked:');\n debug(` - ${path.join(os.homedir(), '.claude', 'local', 'claude')}`);\n debug(` - /usr/local/bin/claude`);\n debug(` - /opt/homebrew/bin/claude`);\n debug(` - PATH`);\n return Promise.resolve(false);\n }\n\n const output = execSync(`${claudeBinary} --version`, { stdio: 'pipe' });\n const version = output.toString().trim();\n debug(` Claude Code detected: ${version}`);\n return Promise.resolve(true);\n } catch (error) {\n debug(\n ` Claude Code check failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n return Promise.resolve(false);\n }\n }\n\n isServerInstalled(): Promise<boolean> {\n return this.isPluginInstalled();\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n async addServer(): Promise<{ success: boolean }> {\n const result = await this.installPlugin();\n return { success: result.success };\n }\n\n removeServer(local?: boolean): Promise<{ success: boolean }> {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve({ success: false });\n }\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const command = `${claudeBinary} mcp remove --scope user ${serverName}`;\n\n try {\n execSync(command);\n } catch (error) {\n analytics.captureException(\n new Error(\n `Failed to remove server from Claude Code: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n\n supportsPlugin(): boolean {\n return this.findClaudeBinary() !== null;\n }\n\n isPluginInstalled(): Promise<boolean> {\n const binary = this.findClaudeBinary();\n if (!binary) return Promise.resolve(false);\n try {\n const output = execSync(`${binary} plugin list`, {\n stdio: 'pipe',\n }).toString();\n return Promise.resolve(output.toLowerCase().includes('posthog'));\n } catch {\n return Promise.resolve(false);\n }\n }\n\n installPlugin(): Promise<PluginInstallResult> {\n const binary = this.findClaudeBinary();\n if (!binary) return Promise.resolve({ success: false });\n try {\n execSync(`${binary} plugin install posthog`, { stdio: 'pipe' });\n return Promise.resolve({ success: true });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes('already installed') || msg.includes('already exists')) {\n return Promise.resolve({ success: true, alreadyInstalled: true });\n }\n analytics.captureException(\n new Error(`Claude Code plugin install failed: ${msg}`),\n );\n return Promise.resolve({ success: false });\n }\n }\n}\n","import z from 'zod';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DefaultMCPClient, MCPServerConfig } from '../MCPClient';\nimport { getNativeHTTPServerConfig } from '../defaults';\nimport { runtimeEnv } from '@env';\n\nexport const VisualStudioCodeMCPConfig = z\n .object({\n servers: z.record(\n z.string(),\n z.union([\n z.object({\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n z.object({\n type: z.enum(['http', 'sse']),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n ]),\n ),\n })\n .passthrough();\n\nexport type VisualStudioCodeMCPConfig = z.infer<\n typeof VisualStudioCodeMCPConfig\n>;\n\nexport class VisualStudioCodeClient extends DefaultMCPClient {\n name = 'Visual Studio Code';\n\n getServerPropertyName(): string {\n return 'servers';\n }\n\n async isClientSupported(): Promise<boolean> {\n return Promise.resolve(\n process.platform === 'darwin' ||\n process.platform === 'win32' ||\n process.platform === 'linux',\n );\n }\n\n async getConfigPath(): Promise<string> {\n const homeDir = os.homedir();\n const isWindows = process.platform === 'win32';\n const isMac = process.platform === 'darwin';\n const isLinux = process.platform === 'linux';\n\n if (isMac) {\n return Promise.resolve(\n path.join(\n homeDir,\n 'Library',\n 'Application Support',\n 'Code',\n 'User',\n 'mcp.json',\n ),\n );\n }\n\n if (isWindows) {\n return Promise.resolve(\n path.join(runtimeEnv('APPDATA') || '', 'Code', 'User', 'mcp.json'),\n );\n }\n\n if (isLinux) {\n return Promise.resolve(\n path.join(homeDir, '.config', 'Code', 'User', 'mcp.json'),\n );\n }\n\n throw new Error(`Unsupported platform: ${process.platform}`);\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return {\n type: 'http',\n ...getNativeHTTPServerConfig(apiKey, selectedFeatures, local),\n };\n }\n}\n","import z from 'zod';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DefaultMCPClient, MCPServerConfig } from '../MCPClient';\nimport { getNativeHTTPServerConfig } from '../defaults';\nimport { runtimeEnv } from '@env';\n\nexport const ZedMCPConfig = z\n .object({\n context_servers: z.record(\n z.string(),\n z.union([\n z.object({\n enabled: z.boolean().optional(),\n source: z.string().optional(),\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n z.object({\n enabled: z.boolean().optional(),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n ]),\n ),\n })\n .passthrough();\n\nexport type ZedMCPConfig = z.infer<typeof ZedMCPConfig>;\n\nexport class ZedClient extends DefaultMCPClient {\n name = 'Zed';\n\n getServerPropertyName(): string {\n return 'context_servers';\n }\n\n async isClientSupported(): Promise<boolean> {\n return Promise.resolve(\n process.platform === 'darwin' || process.platform === 'linux',\n );\n }\n\n async getConfigPath(): Promise<string> {\n const homeDir = os.homedir();\n const isMac = process.platform === 'darwin';\n const isLinux = process.platform === 'linux';\n\n if (isMac) {\n return Promise.resolve(\n path.join(homeDir, '.config', 'zed', 'settings.json'),\n );\n }\n\n if (isLinux) {\n // https://zed.dev/docs/configuring-zed#settings-files\n const xdgConfigHome = runtimeEnv('XDG_CONFIG_HOME');\n if (xdgConfigHome) {\n return Promise.resolve(\n path.join(xdgConfigHome, 'zed', 'settings.json'),\n );\n }\n return Promise.resolve(\n path.join(homeDir, '.config', 'zed', 'settings.json'),\n );\n }\n\n throw new Error(`Unsupported platform: ${process.platform}`);\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return {\n enabled: true,\n ...getNativeHTTPServerConfig(apiKey, selectedFeatures, local),\n };\n }\n}\n","import { z } from 'zod';\nimport { execSync, spawnSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nimport { DefaultMCPClient } from '../MCPClient';\nimport { DefaultMCPClientConfig } from '../defaults';\nimport { PluginCapable, PluginInstallResult } from '../plugin-client';\n\nimport { analytics } from '../../../utils/analytics';\n\nexport const CodexMCPConfig = DefaultMCPClientConfig;\n\nexport type CodexMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CodexMCPClient extends DefaultMCPClient implements PluginCapable {\n name = 'Codex';\n private codexBinaryPath: string | null = null;\n\n constructor() {\n super();\n }\n\n private findCodexBinary(): string | null {\n if (this.codexBinaryPath) return this.codexBinaryPath;\n try {\n const resolved = execSync('command -v codex', { stdio: 'pipe' })\n .toString()\n .trim();\n if (resolved) {\n this.codexBinaryPath = resolved;\n return resolved;\n }\n } catch {\n // not in PATH\n }\n return null;\n }\n\n isClientSupported(): Promise<boolean> {\n return Promise.resolve(this.findCodexBinary() !== null);\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n isServerInstalled(): Promise<boolean> {\n return this.isPluginInstalled();\n }\n\n async addServer(): Promise<{ success: boolean }> {\n const result = await this.installPlugin();\n return { success: result.success };\n }\n\n removeServer(): Promise<{ success: boolean }> {\n const binary = this.findCodexBinary();\n if (!binary) return Promise.resolve({ success: false });\n\n const result = spawnSync(binary, ['mcp', 'remove', 'posthog'], {\n stdio: 'ignore',\n });\n\n if (result.error || result.status !== 0) {\n analytics.captureException(\n new Error('Failed to remove server from Codex CLI.'),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n\n supportsPlugin(): boolean {\n return this.findCodexBinary() !== null;\n }\n\n isPluginInstalled(): Promise<boolean> {\n const configPath = path.join(os.homedir(), '.codex', 'config.toml');\n try {\n const contents = fs.readFileSync(configPath, 'utf-8');\n // Marketplace installs appear as [marketplaces.posthog] in config.toml\n return Promise.resolve(\n contents.toLowerCase().includes('[marketplaces.posthog]'),\n );\n } catch {\n return Promise.resolve(false);\n }\n }\n\n installPlugin(): Promise<PluginInstallResult> {\n const binary = this.findCodexBinary();\n if (!binary) return Promise.resolve({ success: false });\n\n const run = () =>\n spawnSync(binary, ['plugin', 'marketplace', 'add', 'PostHog/ai-plugin'], {\n encoding: 'utf-8',\n });\n\n let result = run();\n\n // Stale cache directory with no config.toml entry — clear it and retry\n if (\n result.status !== 0 &&\n (result.stderr ?? '').includes('already added from a different source')\n ) {\n const staleDir = path.join(\n os.homedir(),\n '.codex',\n '.tmp',\n 'marketplaces',\n 'posthog',\n );\n try {\n fs.rmSync(staleDir, { recursive: true, force: true });\n } catch {\n // ignore — retry anyway\n }\n result = run();\n }\n\n if (result.status !== 0) {\n analytics.captureException(\n new Error(`Codex plugin install failed: ${result.stderr ?? ''}`),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n}\n\nexport default CodexMCPClient;\n","export interface PluginInstallResult {\n success: boolean;\n alreadyInstalled?: boolean;\n}\n\nexport interface PluginCapable {\n supportsPlugin(): boolean;\n isPluginInstalled(): Promise<boolean>;\n installPlugin(): Promise<PluginInstallResult>;\n}\n\nexport function isPluginCapable<T>(client: T): client is T & PluginCapable {\n return (\n typeof client === 'object' &&\n client !== null &&\n 'supportsPlugin' in client &&\n 'installPlugin' in client\n );\n}\n","import type { Integration } from '../../lib/constants';\nimport type { CloudRegion } from '../../utils/types';\nimport { traceStep } from '../../telemetry';\nimport { analytics } from '../../utils/analytics';\nimport { getUI } from '../../ui';\nimport { MCPClient } from './MCPClient';\nimport { CursorMCPClient } from './clients/cursor';\nimport { ClaudeCodeMCPClient } from './clients/claude-code';\nimport { VisualStudioCodeClient } from './clients/visual-studio-code';\nimport { ZedClient } from './clients/zed';\nimport { CodexMCPClient } from './clients/codex';\nimport { ALL_FEATURE_VALUES } from './defaults';\nimport { debug } from '../../utils/debug';\nimport { isPluginCapable, PluginCapable } from './plugin-client';\n\nexport const getSupportedClients = async (): Promise<MCPClient[]> => {\n const allClients = [\n new ClaudeCodeMCPClient(),\n new CodexMCPClient(),\n new CursorMCPClient(),\n new VisualStudioCodeClient(),\n new ZedClient(),\n ];\n const supportedClients: MCPClient[] = [];\n\n debug('Checking for supported MCP clients...');\n for (const client of allClients) {\n const isSupported = await client.isClientSupported();\n debug(`${client.name}: ${isSupported ? '✓ supported' : '✗ not supported'}`);\n if (isSupported) {\n supportedClients.push(client);\n }\n }\n debug(\n `Found ${supportedClients.length} supported client(s): ${supportedClients\n .map((c) => c.name)\n .join(', ')}`,\n );\n\n return supportedClients;\n};\n\n/**\n * Add MCP server to clients. No prompts — pure orchestration.\n * Prompts are handled by McpScreen (TUI) or auto-accepted (CI).\n */\nexport const addMCPServerToClientsStep = async ({\n integration,\n local = false,\n ci = false,\n cloudRegion: _cloudRegion,\n features,\n apiKey,\n}: {\n integration?: Integration;\n local?: boolean;\n ci?: boolean;\n cloudRegion?: CloudRegion;\n features?: string[];\n apiKey?: string;\n}): Promise<string[]> => {\n const ui = getUI();\n\n // CI mode: skip MCP installation entirely\n if (ci) {\n ui.log.info('Skipping MCP installation (CI mode)');\n return [];\n }\n\n const supportedClients = await getSupportedClients();\n\n if (supportedClients.length === 0) {\n ui.log.info(\n 'No supported MCP clients detected. Skipping MCP installation.',\n );\n return [];\n }\n\n // Auto-install to all supported clients\n await traceStep('adding mcp servers', async () => {\n await addMCPServer(\n supportedClients,\n apiKey,\n features ?? [...ALL_FEATURE_VALUES],\n local,\n );\n });\n\n ui.log.success(\n `Added the MCP server to:\n ${supportedClients.map((c) => `- ${c.name}`).join('\\n ')} `,\n );\n\n analytics.wizardCapture('mcp servers added', {\n clients: supportedClients.map((c) => c.name),\n integration,\n });\n\n return supportedClients.map((c) => c.name);\n};\n\nexport const removeMCPServerFromClientsStep = async ({\n integration,\n local = false,\n}: {\n integration?: Integration;\n local?: boolean;\n}): Promise<string[]> => {\n const installedClients = await getInstalledClients(local);\n if (installedClients.length === 0) {\n analytics.wizardCapture('mcp no servers to remove', {\n integration,\n });\n return [];\n }\n\n // Auto-remove from all installed clients\n const results = await traceStep('removing mcp servers', async () => {\n await removeMCPServer(installedClients, local);\n return installedClients.map((c) => c.name);\n });\n\n analytics.wizardCapture('mcp servers removed', {\n clients: results,\n integration,\n });\n\n return results;\n};\n\nexport const getInstalledClients = async (\n local?: boolean,\n): Promise<MCPClient[]> => {\n const clients = await getSupportedClients();\n const installedClients: MCPClient[] = [];\n\n for (const client of clients) {\n if (await client.isServerInstalled(local)) {\n installedClients.push(client);\n }\n }\n\n return installedClients;\n};\n\nexport const addMCPServer = async (\n clients: MCPClient[],\n personalApiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.addServer(personalApiKey, selectedFeatures, local);\n }\n};\n\nexport const getSupportedPluginClients = (\n clients: MCPClient[],\n): Array<MCPClient & PluginCapable> => {\n return clients.filter(isPluginCapable).filter((c) => c.supportsPlugin());\n};\n\nexport const installPlugins = async (\n clients: Array<MCPClient & PluginCapable>,\n): Promise<string[]> => {\n const installed: string[] = [];\n for (const client of clients) {\n try {\n const result = await client.installPlugin();\n if (result.success) installed.push(client.name);\n } catch (err) {\n debug(`[installPlugins] installPlugin threw for ${client.name}: ${err}`);\n }\n }\n return installed;\n};\n\nexport const removeMCPServer = async (\n clients: MCPClient[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.removeServer(local);\n }\n};\n"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
- import { a as getLogFilePath, c as getUI, f as runtimeEnv, i as enableDebugLogs, o as initLogFile, s as logToFile, t as configureLogFile } from "./debug-CyJ_3dTP.js";
2
- import { n as analytics, w as getSkillsBaseUrl } from "./analytics-xANpxdVL.js";
3
- import { a as getCloudUrlFromRegion, t as getOrAskForProjectData } from "./setup-utils-C1h1QDiG.js";
4
- import { n as registerCleanup, r as wizardAbort, t as WizardError } from "./wizard-abort-XhapT0Ly.js";
5
- import { a as backupAndFixClaudeSettings, c as initializeAgent, d as formatScanReport, f as writeScanReport, h as installSkillById, i as AgentSignals, l as restoreClaudeSettings, n as evaluateWizardReadiness, o as buildWizardMetadata, s as checkAllSettingsConflicts, u as runAgent$1 } from "./readiness-BAgN8xAg.js";
6
- import { r as detectNodePackageManagers } from "./package-manager-Ls_8r9Ot.js";
1
+ import { a as getLogFilePath, c as getUI, f as runtimeEnv, i as enableDebugLogs, o as initLogFile, s as logToFile, t as configureLogFile } from "./debug-gWEjmYVV.js";
2
+ import { E as getSkillsBaseUrl, n as analytics } from "./analytics-D3rY3TaN.js";
3
+ import { n as WIZARD_LOG_FILE, t as WIZARD_BENCHMARK_FILE } from "./paths-BL-x2rFy.js";
4
+ import { d as getCloudUrlFromRegion, r as getOrAskForProjectData } from "./setup-utils-y4s-3uKT.js";
5
+ import { n as registerCleanup, r as wizardAbort, t as WizardError } from "./wizard-abort-Buodno3f.js";
6
+ import { a as backupAndFixClaudeSettings, c as initializeAgent, d as formatScanReport, f as writeScanReport, h as installSkillById, i as AgentSignals, l as restoreClaudeSettings, n as evaluateWizardReadiness, o as buildWizardMetadata, s as checkAllSettingsConflicts, u as runAgent$1 } from "./readiness-gQvQNCeL.js";
7
+ import { r as detectNodePackageManagers } from "./package-manager-D3Lo6nXf.js";
7
8
  import fs, { existsSync } from "fs";
8
9
  import path, { join } from "path";
9
10
  //#region src/lib/middleware/phase-detector.ts
@@ -144,9 +145,9 @@ const DEFAULT_CONFIG = {
144
145
  jsonWriter: true
145
146
  },
146
147
  output: {
147
- benchmarkPath: "/tmp/posthog-wizard-benchmark.json",
148
+ benchmarkPath: WIZARD_BENCHMARK_FILE,
148
149
  benchmarkEnabled: true,
149
- logPath: "/tmp/posthog-wizard.log",
150
+ logPath: WIZARD_LOG_FILE,
150
151
  logEnabled: true,
151
152
  suppressWizardLogs: false
152
153
  }
@@ -898,6 +899,7 @@ async function runAgent(workflowConfig, session) {
898
899
  */
899
900
  async function runWorkflow(session, config) {
900
901
  initLogFile();
902
+ session.skillId = config.skillId ?? config.integrationLabel;
901
903
  logToFile(`[agent-runner] START ${config.integrationLabel}`);
902
904
  if (session.debug) enableDebugLogs();
903
905
  const skillsBaseUrl = getSkillsBaseUrl(session.localMcp);
@@ -1111,4 +1113,4 @@ async function abortOnInstallFailure(integrationLabel, result) {
1111
1113
  //#endregion
1112
1114
  export { runAgent };
1113
1115
 
1114
- //# sourceMappingURL=agent-runner-CBPBefLt.js.map
1116
+ //# sourceMappingURL=agent-runner-fWYFO4H0.js.map