@posthog/wizard 2.17.0 → 2.19.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 (76) hide show
  1. package/dist/{add-mcp-server-to-clients-D4PK6ulR.js → add-mcp-server-to-clients-CjnvTVj0.js} +72 -13
  2. package/dist/add-mcp-server-to-clients-CjnvTVj0.js.map +1 -0
  3. package/dist/{agent-interface-7t5DBo2A.js → agent-interface-CQU6x4Hj.js} +112 -54
  4. package/dist/agent-interface-CQU6x4Hj.js.map +1 -0
  5. package/dist/{agent-runner-CTkKLVhp.js → agent-runner-Cj7saDkL.js} +17 -11
  6. package/dist/{agent-runner-CTkKLVhp.js.map → agent-runner-Cj7saDkL.js.map} +1 -1
  7. package/dist/{analytics-DN_Gy87F.js → analytics-Df-Xb81i.js} +26 -4
  8. package/dist/analytics-Df-Xb81i.js.map +1 -0
  9. package/dist/{api-serd0SMY.js → api-Dw6_orDE.js} +3 -3
  10. package/dist/{api-serd0SMY.js.map → api-Dw6_orDE.js.map} +1 -1
  11. package/dist/bin.js +236 -79
  12. package/dist/bin.js.map +1 -1
  13. package/dist/{ci-install-BbJ7c3WK.js → ci-install-BKAvFfK6.js} +4 -4
  14. package/dist/{ci-install-BbJ7c3WK.js.map → ci-install-BKAvFfK6.js.map} +1 -1
  15. package/dist/{debug-BI-Js0PB.js → debug-Cp_wNn8i.js} +1 -1
  16. package/dist/{debug-Bx7nvCWW.js → debug-DnMO6O8O.js} +36 -21
  17. package/dist/debug-DnMO6O8O.js.map +1 -0
  18. package/dist/{defaults-CPH6eWhN.js → defaults-BNWIWzjc.js} +34 -8
  19. package/dist/defaults-BNWIWzjc.js.map +1 -0
  20. package/dist/{env-api-key-B3gE9Un0.js → env-api-key-MlzJYAvt.js} +1 -1
  21. package/dist/{env-api-key-B3gE9Un0.js.map → env-api-key-MlzJYAvt.js.map} +1 -1
  22. package/dist/{environment-CiZVSSYt.js → environment-Ls0H9ljT.js} +3 -3
  23. package/dist/{environment-CiZVSSYt.js.map → environment-Ls0H9ljT.js.map} +1 -1
  24. package/dist/{file-utils-Dy9JncCo.js → file-utils-VAXoyXVA.js} +1 -1
  25. package/dist/{file-utils-Dy9JncCo.js.map → file-utils-VAXoyXVA.js.map} +1 -1
  26. package/dist/{interactive-BwIzklw0.js → interactive-D15byhpc.js} +2 -2
  27. package/dist/{interactive-BwIzklw0.js.map → interactive-D15byhpc.js.map} +1 -1
  28. package/dist/{mcp-prompt-streaming-8U9Qs9EV.js → mcp-prompt-streaming-DQOTQfW1.js} +4 -4
  29. package/dist/{mcp-prompt-streaming-8U9Qs9EV.js.map → mcp-prompt-streaming-DQOTQfW1.js.map} +1 -1
  30. package/dist/{non-interactive-DTaZnVq_.js → non-interactive-DcFLJtl_.js} +2 -2
  31. package/dist/{non-interactive-DTaZnVq_.js.map → non-interactive-DcFLJtl_.js.map} +1 -1
  32. package/dist/{package-manager-CKQLR20D.js → package-manager-DUPgLGpQ.js} +2 -2
  33. package/dist/{package-manager-CKQLR20D.js.map → package-manager-DUPgLGpQ.js.map} +1 -1
  34. package/dist/{playground-CR81Mwe3.js → playground-BZ0hGjbL.js} +12 -4
  35. package/dist/playground-BZ0hGjbL.js.map +1 -0
  36. package/dist/{posthog-BrLFkaji.js → posthog-Cr37rnla.js} +1 -1
  37. package/dist/{posthog-BrLFkaji.js.map → posthog-Cr37rnla.js.map} +1 -1
  38. package/dist/{posthog-integration-Bv7987YJ.js → posthog-integration-C8qhJnI3.js} +282 -13
  39. package/dist/posthog-integration-C8qhJnI3.js.map +1 -0
  40. package/dist/{provisioning-C96Kw-9D.js → provisioning-C-2ExcqY.js} +3 -3
  41. package/dist/{provisioning-C96Kw-9D.js.map → provisioning-C-2ExcqY.js.map} +1 -1
  42. package/dist/{registry-B9k73FKR.js → registry-hBUgaWFx.js} +4 -4
  43. package/dist/{registry-B9k73FKR.js.map → registry-hBUgaWFx.js.map} +1 -1
  44. package/dist/{setup-utils-Bpfsap9L.js → setup-utils-DetnhXo0.js} +65 -44
  45. package/dist/setup-utils-DetnhXo0.js.map +1 -0
  46. package/dist/{slides-DRbBgsdd.js → slides-mT2s9wM_.js} +180 -71
  47. package/dist/slides-mT2s9wM_.js.map +1 -0
  48. package/dist/{start-tui-BZ7rEf3e.js → start-tui-BfXoErKg.js} +16 -16
  49. package/dist/start-tui-BfXoErKg.js.map +1 -0
  50. package/dist/{steps-DDx35170.js → steps-SoDXSUxe.js} +6 -6
  51. package/dist/{steps-DDx35170.js.map → steps-SoDXSUxe.js.map} +1 -1
  52. package/dist/{task-stream-BI8rJg9H.js → task-stream-CZRj6auI.js} +2 -2
  53. package/dist/{task-stream-BI8rJg9H.js.map → task-stream-CZRj6auI.js.map} +1 -1
  54. package/dist/{telemetry-ByYtIfW0.js → telemetry-CPcMFxcO.js} +2 -2
  55. package/dist/{telemetry-ByYtIfW0.js.map → telemetry-CPcMFxcO.js.map} +1 -1
  56. package/dist/{urls-CTCJIxbR.js → urls-BO7doNJG.js} +2 -2
  57. package/dist/{urls-CTCJIxbR.js.map → urls-BO7doNJG.js.map} +1 -1
  58. package/dist/{wizard-abort-CY0ibdq1.js → wizard-abort-CDXufkqJ.js} +5 -3
  59. package/dist/wizard-abort-CDXufkqJ.js.map +1 -0
  60. package/dist/{wizard-abort-QdRxGQp_.js → wizard-abort-CtMY57ZE.js} +1 -1
  61. package/package.json +1 -1
  62. package/dist/TextBlock-D0Ep3zC9.js +0 -275
  63. package/dist/TextBlock-D0Ep3zC9.js.map +0 -1
  64. package/dist/add-mcp-server-to-clients-D4PK6ulR.js.map +0 -1
  65. package/dist/agent-interface-7t5DBo2A.js.map +0 -1
  66. package/dist/analytics-DN_Gy87F.js.map +0 -1
  67. package/dist/debug-Bx7nvCWW.js.map +0 -1
  68. package/dist/defaults-CPH6eWhN.js.map +0 -1
  69. package/dist/playground-CR81Mwe3.js.map +0 -1
  70. package/dist/posthog-integration-Bv7987YJ.js.map +0 -1
  71. package/dist/setup-utils-Bpfsap9L.js.map +0 -1
  72. package/dist/skill-CPqcV8zp.js +0 -29
  73. package/dist/skill-CPqcV8zp.js.map +0 -1
  74. package/dist/slides-DRbBgsdd.js.map +0 -1
  75. package/dist/start-tui-BZ7rEf3e.js.map +0 -1
  76. package/dist/wizard-abort-CY0ibdq1.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B_-DWIq7.js";
2
- import { X as runtimeEnv, p as getUI, r as debug } from "./debug-Bx7nvCWW.js";
3
- import { t as analytics } from "./analytics-DN_Gy87F.js";
4
- import { t as withProgress } from "./telemetry-ByYtIfW0.js";
5
- import { i as getNativeHTTPServerConfig, r as getDefaultServerConfig, t as ALL_FEATURE_VALUES } from "./defaults-CPH6eWhN.js";
2
+ import { X as runtimeEnv, p as getUI, r as debug } from "./debug-DnMO6O8O.js";
3
+ import { t as analytics } from "./analytics-Df-Xb81i.js";
4
+ import { t as withProgress } from "./telemetry-CPcMFxcO.js";
5
+ import { a as getNativeHTTPServerConfig, i as getDefaultServerConfig, r as buildMCPUrl, t as ALL_FEATURE_VALUES } from "./defaults-BNWIWzjc.js";
6
6
  import { execSync, spawnSync } from "node:child_process";
7
7
  import * as fs$1 from "node:fs";
8
8
  import * as os from "node:os";
@@ -155,14 +155,43 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
155
155
  return Promise.resolve(false);
156
156
  }
157
157
  }
158
- isServerInstalled() {
159
- return this.isPluginInstalled();
158
+ isServerInstalled(local) {
159
+ const binary = this.findClaudeBinary();
160
+ if (!binary) return Promise.resolve(false);
161
+ const serverName = local ? "posthog-local" : "posthog";
162
+ try {
163
+ const output = execSync$1(`${binary} mcp list`, { stdio: "pipe" }).toString().toLowerCase();
164
+ return Promise.resolve(output.includes(serverName));
165
+ } catch {
166
+ return Promise.resolve(false);
167
+ }
160
168
  }
161
169
  getConfigPath() {
162
170
  throw new Error("Not implemented");
163
171
  }
164
- async addServer() {
165
- return { success: (await this.installPlugin()).success };
172
+ addServer(apiKey, selectedFeatures, local) {
173
+ const binary = this.findClaudeBinary();
174
+ if (!binary) return Promise.resolve({ success: false });
175
+ const args = [
176
+ "mcp",
177
+ "add",
178
+ "--transport",
179
+ "http",
180
+ "--scope",
181
+ "user",
182
+ local ? "posthog-local" : "posthog",
183
+ buildMCPUrl(selectedFeatures, local)
184
+ ];
185
+ if (apiKey) args.push("--header", `Authorization: Bearer ${apiKey}`);
186
+ try {
187
+ execSync$1(`${binary} ${args.map((a) => JSON.stringify(a)).join(" ")}`, { stdio: "pipe" });
188
+ return Promise.resolve({ success: true });
189
+ } catch (error) {
190
+ const msg = error instanceof Error ? error.message : String(error);
191
+ if (msg.includes("already exists")) return Promise.resolve({ success: true });
192
+ analytics.captureException(/* @__PURE__ */ new Error(`Claude Code MCP add failed: ${msg}`));
193
+ return Promise.resolve({ success: false });
194
+ }
166
195
  }
167
196
  removeServer(local) {
168
197
  const claudeBinary = this.findClaudeBinary();
@@ -334,11 +363,41 @@ var CodexMCPClient = class extends DefaultMCPClient {
334
363
  getConfigPath() {
335
364
  throw new Error("Not implemented");
336
365
  }
337
- isServerInstalled() {
338
- return this.isPluginInstalled();
366
+ isServerInstalled(local) {
367
+ const binary = this.findCodexBinary();
368
+ if (!binary) return Promise.resolve(false);
369
+ const serverName = local ? "posthog-local" : "posthog";
370
+ const result = spawnSync(binary, ["mcp", "list"], { encoding: "utf-8" });
371
+ if (result.status !== 0) return Promise.resolve(false);
372
+ return Promise.resolve((result.stdout ?? "").toLowerCase().includes(serverName));
339
373
  }
340
- async addServer() {
341
- return { success: (await this.installPlugin()).success };
374
+ addServer(apiKey, selectedFeatures, local) {
375
+ const binary = this.findCodexBinary();
376
+ if (!binary) return Promise.resolve({ success: false });
377
+ const args = [
378
+ "mcp",
379
+ "add",
380
+ local ? "posthog-local" : "posthog",
381
+ "--url",
382
+ buildMCPUrl(selectedFeatures, local)
383
+ ];
384
+ const env = { ...process.env };
385
+ if (apiKey) {
386
+ const tokenVar = "POSTHOG_AUTH_HEADER";
387
+ env[tokenVar] = `Bearer ${apiKey}`;
388
+ args.push("--bearer-token-env-var", tokenVar);
389
+ }
390
+ const result = spawnSync(binary, args, {
391
+ encoding: "utf-8",
392
+ env
393
+ });
394
+ if (result.status !== 0) {
395
+ const stderr = result.stderr ?? "";
396
+ if (stderr.toLowerCase().includes("already")) return Promise.resolve({ success: true });
397
+ analytics.captureException(/* @__PURE__ */ new Error(`Codex MCP add failed: ${stderr}`));
398
+ return Promise.resolve({ success: false });
399
+ }
400
+ return Promise.resolve({ success: true });
342
401
  }
343
402
  removeServer() {
344
403
  const binary = this.findCodexBinary();
@@ -498,4 +557,4 @@ const removeMCPServer = async (clients, local) => {
498
557
  //#endregion
499
558
  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 };
500
559
 
501
- //# sourceMappingURL=add-mcp-server-to-clients-D4PK6ulR.js.map
560
+ //# sourceMappingURL=add-mcp-server-to-clients-CjnvTVj0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp-server-to-clients-CjnvTVj0.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/claude-web.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 {\n DefaultMCPClient,\n MCPServerConfig,\n} from '@steps/add-mcp-server-to-clients/MCPClient';\nimport * as path from 'path';\nimport * as os from 'os';\nimport {\n DefaultMCPClientConfig,\n getNativeHTTPServerConfig,\n} from '@steps/add-mcp-server-to-clients/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 '@steps/add-mcp-server-to-clients/MCPClient';\nimport {\n DefaultMCPClientConfig,\n buildMCPUrl,\n} from '@steps/add-mcp-server-to-clients/defaults';\nimport {\n PluginCapable,\n PluginInstallResult,\n} from '@steps/add-mcp-server-to-clients/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(local?: boolean): Promise<boolean> {\n const binary = this.findClaudeBinary();\n if (!binary) return Promise.resolve(false);\n const serverName = local ? 'posthog-local' : 'posthog';\n try {\n const output = execSync(`${binary} mcp list`, { stdio: 'pipe' })\n .toString()\n .toLowerCase();\n return Promise.resolve(output.includes(serverName));\n } catch {\n return Promise.resolve(false);\n }\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<{ success: boolean }> {\n const binary = this.findClaudeBinary();\n if (!binary) return Promise.resolve({ success: false });\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const url = buildMCPUrl(selectedFeatures, local);\n const args = [\n 'mcp',\n 'add',\n '--transport',\n 'http',\n '--scope',\n 'user',\n serverName,\n url,\n ];\n if (apiKey) {\n args.push('--header', `Authorization: Bearer ${apiKey}`);\n }\n\n try {\n execSync(`${binary} ${args.map((a) => JSON.stringify(a)).join(' ')}`, {\n stdio: 'pipe',\n });\n return Promise.resolve({ success: true });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes('already exists')) {\n return Promise.resolve({ success: true });\n }\n analytics.captureException(\n new Error(`Claude Code MCP add failed: ${msg}`),\n );\n return Promise.resolve({ success: false });\n }\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 opn from 'opn';\nimport { MCPClient } from '@steps/add-mcp-server-to-clients/MCPClient';\nimport { BrowserFinishable } from '@steps/add-mcp-server-to-clients/browser-client';\n\n/**\n * Claude Desktop / Claude.ai (web). PostHog ships here as a hosted connector,\n * not a local config — so instead of writing files we open the connector\n * directory page and let the user sign in and click \"Connect\".\n */\nexport class ClaudeWebMCPClient extends MCPClient implements BrowserFinishable {\n name = 'Claude Desktop/Web';\n connectorUrl = 'https://claude.ai/directory/connectors/posthog';\n finishInstruction = 'Sign in and click \"Connect\" to finish.';\n\n isClientSupported(): Promise<boolean> {\n // Browser-based — available on every platform.\n return Promise.resolve(true);\n }\n\n isServerInstalled(): Promise<boolean> {\n // The connector lives in the user's Claude account; nothing local to\n // inspect. Returning false also keeps it out of `mcp remove`.\n return Promise.resolve(false);\n }\n\n addServer(): Promise<{ success: boolean }> {\n void opn(this.connectorUrl, { wait: false }).catch(() => {\n // opn throws in environments without a browser (e.g. CI) — swallow it;\n // the URL is still surfaced to the user on the Done screen.\n });\n return Promise.resolve({ success: true });\n }\n\n removeServer(): Promise<{ success: boolean }> {\n return Promise.resolve({ success: false });\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n getServerPropertyName(): string {\n throw new Error('Not implemented');\n }\n}\n\nexport default ClaudeWebMCPClient;\n","import z from 'zod';\nimport * as path from 'path';\nimport * as os from 'os';\nimport {\n DefaultMCPClient,\n MCPServerConfig,\n} from '@steps/add-mcp-server-to-clients/MCPClient';\nimport { getNativeHTTPServerConfig } from '@steps/add-mcp-server-to-clients/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 {\n DefaultMCPClient,\n MCPServerConfig,\n} from '@steps/add-mcp-server-to-clients/MCPClient';\nimport { getNativeHTTPServerConfig } from '@steps/add-mcp-server-to-clients/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 '@steps/add-mcp-server-to-clients/MCPClient';\nimport {\n DefaultMCPClientConfig,\n buildMCPUrl,\n} from '@steps/add-mcp-server-to-clients/defaults';\nimport {\n PluginCapable,\n PluginInstallResult,\n} from '@steps/add-mcp-server-to-clients/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(local?: boolean): Promise<boolean> {\n const binary = this.findCodexBinary();\n if (!binary) return Promise.resolve(false);\n const serverName = local ? 'posthog-local' : 'posthog';\n const result = spawnSync(binary, ['mcp', 'list'], { encoding: 'utf-8' });\n if (result.status !== 0) return Promise.resolve(false);\n return Promise.resolve(\n (result.stdout ?? '').toLowerCase().includes(serverName),\n );\n }\n\n addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<{ success: boolean }> {\n const binary = this.findCodexBinary();\n if (!binary) return Promise.resolve({ success: false });\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const url = buildMCPUrl(selectedFeatures, local);\n const args = ['mcp', 'add', serverName, '--url', url];\n const env = { ...process.env };\n if (apiKey) {\n const tokenVar = 'POSTHOG_AUTH_HEADER';\n env[tokenVar] = `Bearer ${apiKey}`;\n args.push('--bearer-token-env-var', tokenVar);\n }\n\n const result = spawnSync(binary, args, { encoding: 'utf-8', env });\n if (result.status !== 0) {\n const stderr = result.stderr ?? '';\n if (stderr.toLowerCase().includes('already')) {\n return Promise.resolve({ success: true });\n }\n analytics.captureException(new Error(`Codex MCP add failed: ${stderr}`));\n return Promise.resolve({ success: false });\n }\n return Promise.resolve({ success: true });\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 { withProgress } 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 { ClaudeWebMCPClient } from './clients/claude-web';\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 ClaudeWebMCPClient(),\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 withProgress('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 withProgress('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
1
  import { n as __require } from "./rolldown-runtime-B_-DWIq7.js";
2
- import { F as POSTHOG_PROPERTY_HEADER_PREFIX, G as WIZARD_VARIANTS, H as WIZARD_REMARK_EVENT_NAME, K as WIZARD_VARIANT_FLAG_KEY, N as POSTHOG_FLAG_HEADER_PREFIX, W as WIZARD_USER_AGENT, a as getLogFilePath, f as skillTmpPath, o as initLogFile, p as getUI, r as debug, s as logToFile, u as WIZARD_YARA_REPORT_FILE } from "./debug-Bx7nvCWW.js";
3
- import { t as analytics } from "./analytics-DN_Gy87F.js";
4
- import { i as getLlmGatewayUrlFromHost } from "./urls-CTCJIxbR.js";
2
+ import { F as POSTHOG_PROPERTY_HEADER_PREFIX, G as WIZARD_VARIANTS, H as WIZARD_REMARK_EVENT_NAME, K as WIZARD_VARIANT_FLAG_KEY, N as POSTHOG_FLAG_HEADER_PREFIX, W as WIZARD_USER_AGENT, a as getLogFilePath, f as skillTmpPath, o as initLogFile, p as getUI, r as debug, s as logToFile, u as WIZARD_YARA_REPORT_FILE } from "./debug-DnMO6O8O.js";
3
+ import { t as analytics } from "./analytics-Df-Xb81i.js";
4
+ import { i as getLlmGatewayUrlFromHost } from "./urls-BO7doNJG.js";
5
5
  import { n as ADDITIONAL_FEATURE_PROMPTS } from "./wizard-session-d27JGRGi.js";
6
- import { n as registerCleanup, r as wizardAbort, t as WizardError } from "./wizard-abort-CY0ibdq1.js";
6
+ import { n as registerCleanup, r as wizardAbort, t as WizardError } from "./wizard-abort-CDXufkqJ.js";
7
+ import { createRequire } from "node:module";
7
8
  import * as fs$1 from "fs";
8
9
  import fs from "fs";
9
10
  import path from "path";
@@ -1452,6 +1453,83 @@ function getWizardCommandments() {
1452
1453
  return WIZARD_COMMANDMENTS;
1453
1454
  }
1454
1455
  //#endregion
1456
+ //#region src/lib/agent/signals.ts
1457
+ /**
1458
+ * Agent signal vocabulary — the marker strings the agent emits and the error
1459
+ * taxonomy the runner returns. Kept as a dependency-free leaf module so both
1460
+ * `agent-interface.ts` and `output-signals.ts` can import it without a cycle.
1461
+ */
1462
+ const AgentSignals = {
1463
+ STATUS: "[STATUS]",
1464
+ ERROR_MCP_MISSING: "[ERROR-MCP-MISSING]",
1465
+ ERROR_RESOURCE_MISSING: "[ERROR-RESOURCE-MISSING]",
1466
+ ABORT: "[ABORT]",
1467
+ WIZARD_REMARK: "[WIZARD-REMARK]",
1468
+ BENCHMARK: "[BENCHMARK]",
1469
+ DASHBOARD_URL: "[DASHBOARD_URL]",
1470
+ NOTEBOOK_URL: "[NOTEBOOK_URL]"
1471
+ };
1472
+ //#endregion
1473
+ //#region src/lib/agent/output-signals.ts
1474
+ /**
1475
+ * Parses the signal-bearing lines out of agent output and discards the rest.
1476
+ *
1477
+ * The agent and SDK communicate non-content events (auth/API errors, YARA
1478
+ * violations, missing MCP/resource, the end-of-run remark) by emitting marker
1479
+ * strings inside their prose. `AgentOutputSignals` keeps only the lines that
1480
+ * carry such a marker, so the buffer stays bounded regardless of run length.
1481
+ */
1482
+ /**
1483
+ * Single source of truth for the substrings runAgent scans agent output for.
1484
+ * `push()` retains a line iff it contains one of these values; every query
1485
+ * reads the same table, so retention and consumers cannot drift. API-error
1486
+ * status codes are not separate entries — `API_ERROR` is the one needle and
1487
+ * the code is a parameter to `hasApiErrorStatus`.
1488
+ */
1489
+ const OUTPUT_SIGNALS = {
1490
+ API_ERROR: "API Error:",
1491
+ YARA_CRITICAL: "[YARA CRITICAL]",
1492
+ YARA_SCANNER_ERROR: "[YARA] Scanner error",
1493
+ MCP_MISSING: AgentSignals.ERROR_MCP_MISSING,
1494
+ RESOURCE_MISSING: AgentSignals.ERROR_RESOURCE_MISSING,
1495
+ WIZARD_REMARK: AgentSignals.WIZARD_REMARK
1496
+ };
1497
+ const SIGNAL_NEEDLES = Object.values(OUTPUT_SIGNALS);
1498
+ var AgentOutputSignals = class {
1499
+ lines = [];
1500
+ /** Parse step: keep the line only if it carries a known signal; drop prose. */
1501
+ push(text) {
1502
+ if (SIGNAL_NEEDLES.some((n) => text.includes(n))) this.lines.push(text);
1503
+ }
1504
+ get text() {
1505
+ return this.lines.join("\n");
1506
+ }
1507
+ /** True if any retained line contains the given signal's marker. */
1508
+ has(signal) {
1509
+ return this.text.includes(OUTPUT_SIGNALS[signal]);
1510
+ }
1511
+ hasApiError() {
1512
+ return this.has("API_ERROR");
1513
+ }
1514
+ /** True for a specific HTTP status, e.g. 401 (auth) or 429 (rate limit). */
1515
+ hasApiErrorStatus(code) {
1516
+ return this.text.includes(`${OUTPUT_SIGNALS.API_ERROR} ${code}`);
1517
+ }
1518
+ hasYaraViolation() {
1519
+ return this.has("YARA_CRITICAL") || this.has("YARA_SCANNER_ERROR");
1520
+ }
1521
+ /** Joined `API Error: …` lines for the user-facing message, or undefined. */
1522
+ apiErrorMessage() {
1523
+ const m = this.text.match(new RegExp(`${OUTPUT_SIGNALS.API_ERROR} [^\\n]+`, "g"));
1524
+ return m ? m.join("\n") : void 0;
1525
+ }
1526
+ /** Text after the single `[WIZARD-REMARK]` marker, trimmed, or undefined. */
1527
+ remark() {
1528
+ const re = new RegExp(`${OUTPUT_SIGNALS.WIZARD_REMARK.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*(.+?)(?:\\n|$)`, "s");
1529
+ return this.text.match(re)?.[1]?.trim() || void 0;
1530
+ }
1531
+ };
1532
+ //#endregion
1455
1533
  //#region src/lib/agent/agent-interface.ts
1456
1534
  /**
1457
1535
  * Shared agent interface for PostHog wizards
@@ -1467,19 +1545,9 @@ async function getSDKModule() {
1467
1545
  * This ensures we use the SDK's bundled version rather than the user's installed Claude Code.
1468
1546
  */
1469
1547
  function getClaudeCodeExecutablePath() {
1470
- const sdkPackagePath = __require.resolve("@anthropic-ai/claude-agent-sdk");
1548
+ const sdkPackagePath = (typeof __require !== "undefined" ? __require : createRequire(process.argv[1] ?? `${process.cwd()}/`)).resolve("@anthropic-ai/claude-agent-sdk");
1471
1549
  return path.join(path.dirname(sdkPackagePath), "cli.js");
1472
1550
  }
1473
- const AgentSignals = {
1474
- STATUS: "[STATUS]",
1475
- ERROR_MCP_MISSING: "[ERROR-MCP-MISSING]",
1476
- ERROR_RESOURCE_MISSING: "[ERROR-RESOURCE-MISSING]",
1477
- ABORT: "[ABORT]",
1478
- WIZARD_REMARK: "[WIZARD-REMARK]",
1479
- BENCHMARK: "[BENCHMARK]",
1480
- DASHBOARD_URL: "[DASHBOARD_URL]",
1481
- NOTEBOOK_URL: "[NOTEBOOK_URL]"
1482
- };
1483
1551
  const BLOCKING_ENV_KEYS = [
1484
1552
  "ANTHROPIC_API_KEY",
1485
1553
  "ANTHROPIC_BASE_URL",
@@ -1585,7 +1653,7 @@ function restoreClaudeSettings(workingDirectory) {
1585
1653
  * Phase 2 — collect remark (once): block with remark prompt
1586
1654
  * Phase 3 — allow stop: return {}
1587
1655
  */
1588
- function createStopHook(featureQueue, collectedText) {
1656
+ function createStopHook(featureQueue, signals) {
1589
1657
  let featureIndex = 0;
1590
1658
  let remarkRequested = false;
1591
1659
  return (input) => {
@@ -1595,11 +1663,9 @@ function createStopHook(featureQueue, collectedText) {
1595
1663
  remarkRequested,
1596
1664
  queueLength: featureQueue.length
1597
1665
  });
1598
- if (collectedText) {
1599
- if (collectedText.join("\n").includes("API Error:")) {
1600
- logToFile("Stop hook: API error detected, allowing immediate stop");
1601
- return {};
1602
- }
1666
+ if (signals?.hasApiError()) {
1667
+ logToFile("Stop hook: API error detected, allowing immediate stop");
1668
+ return {};
1603
1669
  }
1604
1670
  if (featureIndex < featureQueue.length) {
1605
1671
  const feature = featureQueue[featureIndex++];
@@ -1903,8 +1969,8 @@ async function initializeAgent(config, options) {
1903
1969
  * Check agent output for YARA scanner violations.
1904
1970
  * Used in both the success and catch paths of runAgent.
1905
1971
  */
1906
- function checkYaraViolation(outputText, spinner) {
1907
- if (outputText.includes("[YARA CRITICAL]") || outputText.includes("[YARA] Scanner error")) {
1972
+ function checkYaraViolation(signals, spinner) {
1973
+ if (signals.hasYaraViolation()) {
1908
1974
  logToFile("Agent error: YARA_VIOLATION");
1909
1975
  spinner.stop("Security violation detected");
1910
1976
  return { error: "WIZARD_YARA_VIOLATION" };
@@ -1919,6 +1985,7 @@ function checkYaraViolation(outputText, spinner) {
1919
1985
  */
1920
1986
  async function runAgent(agentConfig, prompt, options, spinner, config, middleware) {
1921
1987
  const { spinnerMessage = "Customizing your PostHog setup...", successMessage = "PostHog integration complete", errorMessage = "Integration failed", abortCases = [] } = config ?? {};
1988
+ logToFile("Starting agent run");
1922
1989
  const { query } = await getSDKModule();
1923
1990
  spinner.start(spinnerMessage);
1924
1991
  const cliPath = getClaudeCodeExecutablePath();
@@ -1926,7 +1993,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
1926
1993
  logToFile("Claude Code executable:", cliPath);
1927
1994
  logToFile("Prompt:", prompt);
1928
1995
  const startTime = Date.now();
1929
- const collectedText = [];
1996
+ const signals = new AgentOutputSignals();
1930
1997
  let receivedSuccessResult = false;
1931
1998
  let loggedInitialContext = false;
1932
1999
  let lastResultMessage = null;
@@ -1954,13 +2021,8 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
1954
2021
  logToFile(`Ignoring post-completion error, agent completed successfully in ${durationSeconds}s`);
1955
2022
  logToFile("Suppressed error:", suppressedError.message);
1956
2023
  } else logToFile(`Agent run completed in ${durationSeconds}s`);
1957
- const outputText = collectedText.join("\n");
1958
- const remarkRegex = new RegExp(`${AgentSignals.WIZARD_REMARK.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*(.+?)(?:\\n|$)`, "s");
1959
- const remarkMatch = outputText.match(remarkRegex);
1960
- if (remarkMatch && remarkMatch[1]) {
1961
- const remark = remarkMatch[1].trim();
1962
- if (remark) analytics.capture(WIZARD_REMARK_EVENT_NAME, { remark });
1963
- }
2024
+ const remark = signals.remark();
2025
+ if (remark) analytics.capture(WIZARD_REMARK_EVENT_NAME, { remark });
1964
2026
  analytics.wizardCapture("agent completed", {
1965
2027
  duration_ms: durationMs,
1966
2028
  duration_seconds: durationSeconds
@@ -2070,7 +2132,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
2070
2132
  PreToolUse: createPreToolUseYaraHooks(),
2071
2133
  PostToolUse: createPostToolUseYaraHooks(),
2072
2134
  Stop: [{
2073
- hooks: [createStopHook(config?.additionalFeatureQueue ?? [], collectedText)],
2135
+ hooks: [createStopHook(config?.additionalFeatureQueue ?? [], signals)],
2074
2136
  timeout: 30
2075
2137
  }]
2076
2138
  }
@@ -2094,7 +2156,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
2094
2156
  }
2095
2157
  loggedInitialContext = true;
2096
2158
  }
2097
- handleSDKMessage(message, options, spinner, collectedText, receivedSuccessResult, tasks);
2159
+ handleSDKMessage(message, options, spinner, signals, receivedSuccessResult, tasks);
2098
2160
  if (abortCases.length > 0 && !abortReason && message.type === "assistant") {
2099
2161
  const content = message.message?.content;
2100
2162
  if (Array.isArray(content)) {
@@ -2110,7 +2172,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
2110
2172
  }
2111
2173
  }
2112
2174
  }
2113
- if (message.type === "assistant" && collectedText.join("\n").includes("API Error: 401")) {
2175
+ if (message.type === "assistant" && signals.hasApiErrorStatus(401)) {
2114
2176
  signalDone();
2115
2177
  spinner.stop("Authentication failed");
2116
2178
  const conflicts = checkAllSettingsConflicts(options.installDir);
@@ -2148,22 +2210,20 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
2148
2210
  message: abortReason
2149
2211
  };
2150
2212
  }
2151
- const outputText = collectedText.join("\n");
2152
- const yaraResult = checkYaraViolation(outputText, spinner);
2213
+ const yaraResult = checkYaraViolation(signals, spinner);
2153
2214
  if (yaraResult) return yaraResult;
2154
- if (outputText.includes(AgentSignals.ERROR_MCP_MISSING)) {
2215
+ if (signals.has("MCP_MISSING")) {
2155
2216
  logToFile("Agent error: MCP_MISSING");
2156
2217
  spinner.stop("Agent could not access PostHog MCP");
2157
2218
  return { error: "WIZARD_MCP_MISSING" };
2158
2219
  }
2159
- if (outputText.includes(AgentSignals.ERROR_RESOURCE_MISSING)) {
2220
+ if (signals.has("RESOURCE_MISSING")) {
2160
2221
  logToFile("Agent error: RESOURCE_MISSING");
2161
2222
  spinner.stop("Agent could not access setup resource");
2162
2223
  return { error: "WIZARD_RESOURCE_MISSING" };
2163
2224
  }
2164
- const apiErrorMatch = outputText.match(/API Error: [^\n]+/g);
2165
- const apiErrorMessage = apiErrorMatch ? apiErrorMatch.join("\n") : "Unknown API error";
2166
- if (outputText.includes("API Error: 429")) {
2225
+ const apiErrorMessage = signals.apiErrorMessage() ?? "Unknown API error";
2226
+ if (signals.hasApiErrorStatus(429)) {
2167
2227
  logToFile("Agent error: RATE_LIMIT");
2168
2228
  spinner.stop("Rate limit exceeded");
2169
2229
  return {
@@ -2171,7 +2231,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
2171
2231
  message: apiErrorMessage
2172
2232
  };
2173
2233
  }
2174
- if (outputText.includes("API Error:")) {
2234
+ if (signals.hasApiError()) {
2175
2235
  logToFile("Agent error: API_ERROR");
2176
2236
  spinner.stop("API error occurred");
2177
2237
  return {
@@ -2190,12 +2250,10 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
2190
2250
  };
2191
2251
  }
2192
2252
  if (receivedSuccessResult) return completeWithSuccess(error);
2193
- const outputText = collectedText.join("\n");
2194
- const yaraResult = checkYaraViolation(outputText, spinner);
2253
+ const yaraResult = checkYaraViolation(signals, spinner);
2195
2254
  if (yaraResult) return yaraResult;
2196
- const apiErrorMatch = outputText.match(/API Error: [^\n]+/g);
2197
- const apiErrorMessage = apiErrorMatch ? apiErrorMatch.join("\n") : "Unknown API error";
2198
- if (outputText.includes("API Error: 429")) {
2255
+ const apiErrorMessage = signals.apiErrorMessage() ?? "Unknown API error";
2256
+ if (signals.hasApiErrorStatus(429)) {
2199
2257
  logToFile("Agent error (caught): RATE_LIMIT");
2200
2258
  spinner.stop("Rate limit exceeded");
2201
2259
  return {
@@ -2203,7 +2261,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
2203
2261
  message: apiErrorMessage
2204
2262
  };
2205
2263
  }
2206
- if (outputText.includes("API Error:")) {
2264
+ if (signals.hasApiError()) {
2207
2265
  logToFile("Agent error (caught): API_ERROR");
2208
2266
  spinner.stop("API error occurred");
2209
2267
  return {
@@ -2331,7 +2389,7 @@ function extractTaskIdFromResult(content) {
2331
2389
  }
2332
2390
  }
2333
2391
  }
2334
- function handleSDKMessage(message, options, spinner, collectedText, receivedSuccessResult = false, tasks) {
2392
+ function handleSDKMessage(message, options, spinner, signals, receivedSuccessResult = false, tasks) {
2335
2393
  const STATUS_RANK = {
2336
2394
  completed: 0,
2337
2395
  in_progress: 1
@@ -2349,7 +2407,7 @@ function handleSDKMessage(message, options, spinner, collectedText, receivedSucc
2349
2407
  const content = message.message?.content;
2350
2408
  if (Array.isArray(content)) for (const block of content) {
2351
2409
  if (block.type === "text" && typeof block.text === "string") {
2352
- collectedText.push(block.text);
2410
+ signals.push(block.text);
2353
2411
  const statusRegex = new RegExp(`^.*${AgentSignals.STATUS.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*(.+?)$`, "m");
2354
2412
  const statusMatch = block.text.match(statusRegex);
2355
2413
  if (statusMatch) {
@@ -2388,14 +2446,14 @@ function handleSDKMessage(message, options, spinner, collectedText, receivedSucc
2388
2446
  case "result":
2389
2447
  if (message.is_error) {
2390
2448
  logToFile("Agent result with error:", message.result);
2391
- if (typeof message.result === "string") collectedText.push(message.result);
2449
+ if (typeof message.result === "string") signals.push(message.result);
2392
2450
  if (message.errors && !receivedSuccessResult) for (const err of message.errors) {
2393
2451
  getUI().log.error(`Error: ${err}`);
2394
2452
  logToFile("ERROR:", err);
2395
2453
  }
2396
2454
  } else if (message.subtype === "success") {
2397
2455
  logToFile("Agent completed successfully");
2398
- if (typeof message.result === "string") collectedText.push(message.result);
2456
+ if (typeof message.result === "string") signals.push(message.result);
2399
2457
  } else {
2400
2458
  logToFile("Agent result with error:", message.result);
2401
2459
  if (message.errors && !receivedSuccessResult) for (const err of message.errors) {
@@ -2417,6 +2475,6 @@ function handleSDKMessage(message, options, spinner, collectedText, receivedSucc
2417
2475
  }
2418
2476
  }
2419
2477
  //#endregion
2420
- export { AUDIT_REPORT_FILE as _, checkAllSettingsConflicts as a, getAuditChecks as b, runAgent as c, WIZARD_TOOL_NAMES as d, downloadSkill as f, AUDIT_CHECKS_KEY as g, AUDIT_CHECKS_FILE as h, buildWizardMetadata as i, formatScanReport as l, installSkillById as m, backupAndFixClaudeSettings as n, initializeAgent as o, fetchSkillMenu as p, buildAgentEnv as r, restoreClaudeSettings as s, AgentSignals as t, writeScanReport as u, AUDIT_SEVERITY_STYLE as v, coerceAuditChecks as y };
2478
+ export { AUDIT_REPORT_FILE as _, initializeAgent as a, getAuditChecks as b, AgentSignals as c, WIZARD_TOOL_NAMES as d, downloadSkill as f, AUDIT_CHECKS_KEY as g, AUDIT_CHECKS_FILE as h, checkAllSettingsConflicts as i, formatScanReport as l, installSkillById as m, buildAgentEnv as n, restoreClaudeSettings as o, fetchSkillMenu as p, buildWizardMetadata as r, runAgent as s, backupAndFixClaudeSettings as t, writeScanReport as u, AUDIT_SEVERITY_STYLE as v, coerceAuditChecks as y };
2421
2479
 
2422
- //# sourceMappingURL=agent-interface-7t5DBo2A.js.map
2480
+ //# sourceMappingURL=agent-interface-CQU6x4Hj.js.map