@posthog/wizard 1.20.0 → 1.21.1

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 (38) hide show
  1. package/README.md +8 -18
  2. package/dist/bin.js +6 -0
  3. package/dist/bin.js.map +1 -1
  4. package/dist/src/lib/agent-interface.d.ts +22 -11
  5. package/dist/src/lib/agent-interface.js +292 -162
  6. package/dist/src/lib/agent-interface.js.map +1 -1
  7. package/dist/src/lib/agent-runner.js +14 -8
  8. package/dist/src/lib/agent-runner.js.map +1 -1
  9. package/dist/src/run.d.ts +1 -0
  10. package/dist/src/run.js +1 -0
  11. package/dist/src/run.js.map +1 -1
  12. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +2 -7
  13. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js.map +1 -1
  14. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +33 -7
  15. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js +2 -47
  16. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js.map +1 -1
  17. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +33 -6
  18. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +33 -6
  19. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +35 -7
  20. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +4 -1
  21. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js.map +1 -1
  22. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +47 -7
  23. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js +25 -5
  24. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js.map +1 -1
  25. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +47 -16
  26. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js +22 -11
  27. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js.map +1 -1
  28. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +40 -6
  29. package/dist/src/steps/add-mcp-server-to-clients/defaults.js +29 -8
  30. package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -1
  31. package/dist/src/utils/clack-utils.js +1 -1
  32. package/dist/src/utils/clack-utils.js.map +1 -1
  33. package/dist/src/utils/debug.d.ts +11 -0
  34. package/dist/src/utils/debug.js +22 -0
  35. package/dist/src/utils/debug.js.map +1 -1
  36. package/dist/src/utils/types.d.ts +4 -0
  37. package/dist/src/utils/types.js.map +1 -1
  38. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"agent-interface.js","sourceRoot":"","sources":["../../../src/lib/agent-interface.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAwFH,4CAkCC;AAKD,0CAoCC;AA6GD,4BAyDC;AAvUD,2DAAmC;AACnC,0CAAuC;AAEvC,kDAA+C;AAC/C,2CAA4D;AAE5D,IAAI,YAAY,GAAQ,IAAI,CAAC;AAC7B,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAOD,sEAAsE;AACtE,MAAM,SAAS,GAAG;IAChB,aAAa,EAAE,eAAe;IAC9B,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,aAAa;IAC1B,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;CACJ,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;CACd,CAAC;AAEE,QAAA,YAAY,GAAG;IAC1B,iEAAiE;IACjE,MAAM,EAAE,UAAU;IAClB,yEAAyE;IACzE,iBAAiB,EAAE,qBAAqB;IACxC,qEAAqE;IACrE,sBAAsB,EAAE,0BAA0B;CAC1C,CAAC;AAIX;;;GAGG;AACH,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,oDAAoD;IACpD,oDAAkC,CAAA;IAClC,gDAAgD;IAChD,8DAA4C,CAAA;AAC9C,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB;AASD;;;GAGG;AACH,MAAM,qBAAqB,GAAG;IAC5B,uBAAuB;IACvB,aAAa;IACb,QAAQ;IACR,cAAc;IACd,UAAU;IACV,aAAa;IACb,SAAS;IACT,UAAU;IACV,cAAc;CACf,CAAC;AAEF;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,QAAgB,EAChB,KAA2B;IAE3B,2BAA2B;IAC3B,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,kEAAkE;IAClE,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,IAAA,aAAK,EAAC,8CAA8C,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO;YACL,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,+DAA+D;SACzE,CAAC;IACJ,CAAC;IAED,kDAAkD;IAClD,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACtD,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAC3B,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,IAAA,aAAK,EAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,IAAA,aAAK,EAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IAC1C,OAAO;QACL,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,oGAAoG;KAC9G,CAAC;AACJ,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe,CACnC,MAAmB,EACnB,OAAsB,EACtB,OAAyC;IAEzC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAEzC,MAAM,WAAW,GAAG;YAClB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,OAAO,EAAE,CAAC,KAAiB,EAAE,EAAE;gBAC7B,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YACD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;SAC7B,CAAC;QAEF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAA,aAAK,EAAC,eAAe,EAAE;gBACrB,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;gBAC9C,aAAa,EAAE,WAAW,CAAC,aAAa;gBACxC,oBAAoB,EAAE,CAAC,CAAC,WAAW,CAAC,aAAa;aAClD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QACrC,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,+BAAgC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,IAAA,aAAK,EAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CACvB,KAAiB,EACjB,OAAsB,EACtB,OAAyC;IAEzC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAA,aAAK,EAAC,eAAe,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,4EAA4E;IAC5E,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC,aAAa;YAC1B,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,KAAK,WAAW,CAAC,SAAS,EAAE,CAAC;gBACrD,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;gBACzC,IAAI,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO;yBAChC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC;yBACvD,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;yBAC/B,IAAI,CAAC,IAAI,CAAC,CAAC;oBAEd,+CAA+C;oBAC/C,MAAM,WAAW,GAAG,IAAI,MAAM,CAC5B,MAAM,oBAAY,CAAC,MAAM,CAAC,OAAO,CAC/B,qBAAqB,EACrB,MAAM,CACP,YAAY,EACb,GAAG,CACJ,CAAC;oBACF,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBACnD,IAAI,WAAW,EAAE,CAAC;wBAChB,qDAAqD;wBACrD,uDAAuD;wBACvD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;wBACpC,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM;QAER,KAAK,SAAS,CAAC,KAAK;YAClB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,IAAA,aAAK,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YACD,MAAM;QAER,KAAK,SAAS,CAAC,SAAS;YACtB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,IAAA,aAAK,EAAC,SAAS,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACjC,IAAA,aAAK,EAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC;YACD,MAAM;QAER,KAAK,SAAS,CAAC,WAAW;YACxB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,IAAA,aAAK,EAAC,KAAK,KAAK,CAAC,QAAQ,YAAY,CAAC,CAAC;gBACvC,MAAM,SAAS,GACb,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;oBAC9B,CAAC,CAAC,KAAK,CAAC,MAAM;oBACd,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC5C,MAAM,SAAS,GACb,SAAS,CAAC,MAAM,GAAG,GAAG;oBACpB,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK;oBACrC,CAAC,CAAC,SAAS,CAAC;gBAChB,IAAA,aAAK,EAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAChC,CAAC;YACD,MAAM;QAER,KAAK,SAAS,CAAC,KAAK;YAClB,6BAA6B;YAC7B,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3C,IAAI,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAA,aAAK,EAAC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,YAAY,KAAK,EAAE,CAAC;gBACjC,qBAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE;oBACtC,UAAU,EAAE,KAAK,CAAC,IAAI;oBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;YACL,CAAC;YACD,MAAM;QAER,KAAK,SAAS,CAAC,IAAI;YACjB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,IAAA,aAAK,EAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChE,CAAC;gBACD,qBAAS,CAAC,OAAO,CAAC,yCAA6B,EAAE;oBAC/C,MAAM,EAAE,6BAA6B;oBACrC,WAAW,EAAE,KAAK,CAAC,UAAU;oBAC7B,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;iBACtD,CAAC,CAAC;YACL,CAAC;YACD,MAAM;IACV,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,QAAQ,CAC5B,KAAY,EACZ,MAAc,EACd,OAAsB,EACtB,OAAyC,EACzC,MAKC;IAED,MAAM,EACJ,wBAAwB,GAAG,CAAC,EAC5B,cAAc,GAAG,mCAAmC,EACpD,cAAc,GAAG,8BAA8B,EAC/C,YAAY,GAAG,oBAAoB,GACpC,GAAG,MAAM,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;IAElD,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,wCAAwC,wBAAwB,mEAAmE,CACpI,CAAC;IAEF,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;YACrC,cAAc,EAAE,OAAO,CAAC,UAAU;YAClC,cAAc,EAAE,cAAc,CAAC,YAAY;YAC3C,cAAc,EAAE;gBACd,KAAK,EAAE,0BAA0B;gBACjC,UAAU,EAAE,gBAAgB;aAC7B;SACF,CAAC,CAAC;QAEH,gDAAgD;QAChD,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE1D,IAAI,UAAU,CAAC,QAAQ,CAAC,oBAAY,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACnD,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC;QAC/C,CAAC;QAED,IAAI,UAAU,CAAC,QAAQ,CAAC,oBAAY,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACtD,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,gBAAgB,EAAE,CAAC;QACpD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAW,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,IAAA,aAAK,EAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC5B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,OAAc;IAC5C,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,gDAAgD;QAChD,IAAI,MAAM,EAAE,IAAI,KAAK,WAAW,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACtE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YACvC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBAClD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["/**\n * Shared agent interface for PostHog wizards\n * Provides common agent initialization and event handling\n */\n\nimport clack from '../utils/clack';\nimport { debug } from '../utils/debug';\nimport type { WizardOptions } from '../utils/types';\nimport { analytics } from '../utils/analytics';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\n\nlet _agentModule: any = null;\nasync function getAgentModule(): Promise<any> {\n if (!_agentModule) {\n _agentModule = await import('@posthog/agent');\n }\n return _agentModule;\n}\n\n// Using `any` because typed imports from ESM modules require import attributes\n// syntax which prettier cannot parse. See PR discussion for details.\ntype Agent = any;\ntype AgentEvent = any;\n\n// TODO: Remove these if/when posthog/agent exports an enum for events\nconst EventType = {\n RAW_SDK_EVENT: 'raw_sdk_event',\n TOKEN: 'token',\n TOOL_CALL: 'tool_call',\n TOOL_RESULT: 'tool_result',\n ERROR: 'error',\n DONE: 'done',\n} as const;\n\n/**\n * Content types for agent messages and blocks\n */\nconst ContentType = {\n TEXT: 'text',\n ASSISTANT: 'assistant',\n} as const;\n\nexport const AgentSignals = {\n /** Signal emitted when the agent reports progress to the user */\n STATUS: '[STATUS]',\n /** Signal emitted when the agent cannot access the PostHog MCP server */\n ERROR_MCP_MISSING: '[ERROR-MCP-MISSING]',\n /** Signal emitted when the agent cannot access the setup resource */\n ERROR_RESOURCE_MISSING: '[ERROR-RESOURCE-MISSING]',\n} as const;\n\nexport type AgentSignal = (typeof AgentSignals)[keyof typeof AgentSignals];\n\n/**\n * Error types that can be returned from agent execution.\n * These correspond to the error signals that the agent emits.\n */\nexport enum AgentErrorType {\n /** Agent could not access the PostHog MCP server */\n MCP_MISSING = 'WIZARD_MCP_MISSING',\n /** Agent could not access the setup resource */\n RESOURCE_MISSING = 'WIZARD_RESOURCE_MISSING',\n}\n\nexport type AgentConfig = {\n workingDirectory: string;\n posthogMcpUrl: string;\n posthogApiKey: string;\n debug?: boolean;\n};\n\n/**\n * Allowed bash command prefixes for the wizard agent.\n * These are package manager commands needed for PostHog installation.\n */\nconst ALLOWED_BASH_PREFIXES = [\n // Package installation\n 'npm install',\n 'npm ci',\n 'pnpm install',\n 'pnpm add',\n 'bun install',\n 'bun add',\n 'yarn add',\n 'yarn install',\n];\n\n/**\n * Permission hook that allows only safe package manager commands.\n * This prevents the agent from running arbitrary shell commands.\n */\nexport function wizardCanUseTool(\n toolName: string,\n input: { command?: string },\n): { behavior: 'allow' } | { behavior: 'deny'; message: string } {\n // Allow all non-Bash tools\n if (toolName !== 'Bash') {\n return { behavior: 'allow' };\n }\n\n const command = (input.command ?? '').trim();\n // Block commands with shell operators (chaining, subshells, etc.)\n if (/[;&|`$()]/.test(command)) {\n debug(`Denying bash command with shell operators: ${command}`);\n return {\n behavior: 'deny',\n message: `Bash command not allowed. Chained commands are not permitted.`,\n };\n }\n\n // Check if command starts with any allowed prefix\n const isAllowed = ALLOWED_BASH_PREFIXES.some((prefix) =>\n command.startsWith(prefix),\n );\n\n if (isAllowed) {\n debug(`Allowing bash command: ${command}`);\n return { behavior: 'allow' };\n }\n\n debug(`Denying bash command: ${command}`);\n return {\n behavior: 'deny',\n message: `Bash command not allowed. Only package manager commands (npm/pnpm/bun/yarn install) are permitted.`,\n };\n}\n\n/**\n * Initialize a PostHog Agent instance with the provided configuration\n */\nexport async function initializeAgent(\n config: AgentConfig,\n options: WizardOptions,\n spinner: ReturnType<typeof clack.spinner>,\n): Promise<Agent> {\n clack.log.step('Initializing PostHog agent...');\n\n try {\n const { Agent } = await getAgentModule();\n\n const agentConfig = {\n workingDirectory: config.workingDirectory,\n posthogMcpUrl: config.posthogMcpUrl,\n posthogApiKey: config.posthogApiKey,\n onEvent: (event: AgentEvent) => {\n handleAgentEvent(event, options, spinner);\n },\n debug: config.debug ?? false,\n };\n\n if (options.debug) {\n debug('Agent config:', {\n workingDirectory: agentConfig.workingDirectory,\n posthogMcpUrl: agentConfig.posthogMcpUrl,\n posthogApiKeyPresent: !!agentConfig.posthogApiKey,\n });\n }\n\n const agent = new Agent(agentConfig);\n clack.log.success(\"Agent initialized. Let's get cooking!\");\n return agent;\n } catch (error) {\n clack.log.error(`Failed to initialize agent: ${(error as Error).message}`);\n debug('Agent initialization error:', error);\n throw error;\n }\n}\n\n/**\n * Handle agent events and provide user feedback\n * This function processes events from the agent SDK and provides appropriate\n * user feedback through the CLI spinner and logging\n */\nfunction handleAgentEvent(\n event: AgentEvent,\n options: WizardOptions,\n spinner: ReturnType<typeof clack.spinner>,\n): void {\n if (options.debug) {\n debug(`Event type: ${event.type}`, JSON.stringify(event, null, 2));\n }\n\n // Only show [STATUS] events to the user - everything else goes to debug log\n switch (event.type) {\n case EventType.RAW_SDK_EVENT:\n if (event.sdkMessage?.type === ContentType.ASSISTANT) {\n const message = event.sdkMessage.message;\n if (message?.content && Array.isArray(message.content)) {\n const textContent = message.content\n .filter((block: any) => block.type === ContentType.TEXT)\n .map((block: any) => block.text)\n .join('\\n');\n\n // Check if the text contains a [STATUS] marker\n const statusRegex = new RegExp(\n `^.*${AgentSignals.STATUS.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&',\n )}\\\\s*(.+?)$`,\n 'm',\n );\n const statusMatch = textContent.match(statusRegex);\n if (statusMatch) {\n // Stop spinner, log the status step, restart spinner\n // This creates the progress list as the agent proceeds\n spinner.stop(statusMatch[1].trim());\n spinner.start('Integrating PostHog...');\n }\n }\n }\n break;\n\n case EventType.TOKEN:\n if (options.debug) {\n debug(event.content);\n }\n break;\n\n case EventType.TOOL_CALL:\n if (options.debug) {\n debug(`Tool: ${event.toolName}`);\n debug(' Args:', JSON.stringify(event.args, null, 2));\n }\n break;\n\n case EventType.TOOL_RESULT:\n if (options.debug) {\n debug(`✅ ${event.toolName} completed`);\n const resultStr: string =\n typeof event.result === 'string'\n ? event.result\n : JSON.stringify(event.result, null, 2);\n const truncated =\n resultStr.length > 500\n ? `${resultStr.substring(0, 500)}...`\n : resultStr;\n debug(' Result:', truncated);\n }\n break;\n\n case EventType.ERROR:\n // Always show errors to user\n clack.log.error(`Error: ${event.message}`);\n if (options.debug && event.error) {\n debug('Error details:', event.error);\n }\n if (event.error instanceof Error) {\n analytics.captureException(event.error, {\n event_type: event.type,\n message: event.message,\n });\n }\n break;\n\n case EventType.DONE:\n if (event.durationMs) {\n if (options.debug) {\n debug(`Completed in ${Math.round(event.durationMs / 1000)}s`);\n }\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'agent integration completed',\n duration_ms: event.durationMs,\n duration_seconds: Math.round(event.durationMs / 1000),\n });\n }\n break;\n }\n}\n\n/**\n * Execute an agent with the provided prompt and options\n * Handles the full lifecycle: spinner, execution, error handling\n *\n * @returns An object containing any error detected in the agent's output\n */\nexport async function runAgent(\n agent: Agent,\n prompt: string,\n options: WizardOptions,\n spinner: ReturnType<typeof clack.spinner>,\n config?: {\n estimatedDurationMinutes?: number;\n spinnerMessage?: string;\n successMessage?: string;\n errorMessage?: string;\n },\n): Promise<{ error?: AgentErrorType }> {\n const {\n estimatedDurationMinutes = 8,\n spinnerMessage = 'Customizing your PostHog setup...',\n successMessage = 'PostHog integration complete',\n errorMessage = 'Integration failed',\n } = config ?? {};\n const { PermissionMode } = await getAgentModule();\n\n clack.log.step(\n `This whole process should take about ${estimatedDurationMinutes} minutes including error checking and fixes.\\n\\nGrab some coffee!`,\n );\n\n spinner.start(spinnerMessage);\n\n try {\n const result = await agent.run(prompt, {\n repositoryPath: options.installDir,\n permissionMode: PermissionMode.ACCEPT_EDITS,\n queryOverrides: {\n model: 'claude-opus-4-5-20251101',\n canUseTool: wizardCanUseTool,\n },\n });\n\n // Check for error markers in the agent's output\n const outputText = extractTextFromResults(result.results);\n\n if (outputText.includes(AgentSignals.ERROR_MCP_MISSING)) {\n spinner.stop('Agent could not access PostHog MCP');\n return { error: AgentErrorType.MCP_MISSING };\n }\n\n if (outputText.includes(AgentSignals.ERROR_RESOURCE_MISSING)) {\n spinner.stop('Agent could not access setup resource');\n return { error: AgentErrorType.RESOURCE_MISSING };\n }\n\n spinner.stop(successMessage);\n return {};\n } catch (error) {\n spinner.stop(errorMessage);\n clack.log.error(`Error: ${(error as Error).message}`);\n debug('Full error:', error);\n throw error;\n }\n}\n\n/**\n * Extract text content from agent execution results\n */\nfunction extractTextFromResults(results: any[]): string {\n const textParts: string[] = [];\n\n for (const result of results) {\n // Handle assistant messages with content blocks\n if (result?.type === ContentType.ASSISTANT && result.message?.content) {\n const content = result.message.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (block.type === ContentType.TEXT && block.text) {\n textParts.push(block.text);\n }\n }\n }\n }\n\n // Handle direct text content\n if (typeof result === 'string') {\n textParts.push(result);\n }\n }\n\n return textParts.join('\\n');\n}\n"]}
1
+ {"version":3,"file":"agent-interface.js","sourceRoot":"","sources":["../../../src/lib/agent-interface.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared agent interface for PostHog wizards\n * Uses Claude Agent SDK directly with PostHog LLM gateway\n */\n\nimport path from 'path';\nimport clack from '../utils/clack';\nimport { debug, logToFile, initLogFile, LOG_FILE_PATH } from '../utils/debug';\nimport type { WizardOptions } from '../utils/types';\nimport { analytics } from '../utils/analytics';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\n\n// Dynamic import cache for ESM module\nlet _sdkModule: any = null;\nasync function getSDKModule(): Promise<any> {\n if (!_sdkModule) {\n _sdkModule = await import('@anthropic-ai/claude-agent-sdk');\n }\n return _sdkModule;\n}\n\n/**\n * Get the path to the bundled Claude Code CLI from the SDK package.\n * This ensures we use the SDK's bundled version rather than the user's installed Claude Code.\n */\nfunction getClaudeCodeExecutablePath(): string {\n // require.resolve finds the package's main entry, then we get cli.js from same dir\n const sdkPackagePath = require.resolve('@anthropic-ai/claude-agent-sdk');\n return path.join(path.dirname(sdkPackagePath), 'cli.js');\n}\n\n// Using `any` because typed imports from ESM modules require import attributes\n// syntax which prettier cannot parse. See PR discussion for details.\ntype SDKMessage = any;\ntype McpServersConfig = any;\n\nexport const AgentSignals = {\n /** Signal emitted when the agent reports progress to the user */\n STATUS: '[STATUS]',\n /** Signal emitted when the agent cannot access the PostHog MCP server */\n ERROR_MCP_MISSING: '[ERROR-MCP-MISSING]',\n /** Signal emitted when the agent cannot access the setup resource */\n ERROR_RESOURCE_MISSING: '[ERROR-RESOURCE-MISSING]',\n} as const;\n\nexport type AgentSignal = (typeof AgentSignals)[keyof typeof AgentSignals];\n\n/**\n * Error types that can be returned from agent execution.\n * These correspond to the error signals that the agent emits.\n */\nexport enum AgentErrorType {\n /** Agent could not access the PostHog MCP server */\n MCP_MISSING = 'WIZARD_MCP_MISSING',\n /** Agent could not access the setup resource */\n RESOURCE_MISSING = 'WIZARD_RESOURCE_MISSING',\n}\n\nexport type AgentConfig = {\n workingDirectory: string;\n posthogMcpUrl: string;\n posthogApiKey: string;\n posthogApiHost: string;\n posthogProjectId: number;\n};\n\n/**\n * Internal configuration object returned by initializeAgent\n */\ntype AgentRunConfig = {\n workingDirectory: string;\n mcpServers: McpServersConfig;\n model: string;\n};\n\n/**\n * Package managers that can be used to run commands.\n */\nconst PACKAGE_MANAGERS = ['npm', 'pnpm', 'yarn', 'bun', 'npx'];\n\n/**\n * Safe scripts/commands that can be run with any package manager.\n * Uses startsWith matching, so 'build' matches 'build', 'build:prod', etc.\n */\nconst SAFE_SCRIPTS = [\n // Package installation\n 'install',\n 'add',\n 'ci',\n // Build\n 'build',\n // Type checking (various naming conventions)\n 'tsc',\n 'typecheck',\n 'type-check',\n 'check-types',\n 'types',\n // Linting\n 'lint',\n 'eslint',\n 'next lint',\n // Formatting\n 'format',\n 'prettier',\n];\n\n/**\n * Dangerous shell operators that could allow command injection.\n * Note: We handle `2>&1` and `| tail/head` separately as safe patterns.\n */\nconst DANGEROUS_OPERATORS = /[;`$()]/;\n\n/**\n * Check if command is an allowed package manager command.\n * Matches: <pkg-manager> [run|exec] <safe-script> [args...]\n */\nfunction matchesAllowedPrefix(command: string): boolean {\n const parts = command.split(/\\s+/);\n if (parts.length === 0 || !PACKAGE_MANAGERS.includes(parts[0])) {\n return false;\n }\n\n // Skip 'run' or 'exec' if present\n let scriptIndex = 1;\n if (parts[scriptIndex] === 'run' || parts[scriptIndex] === 'exec') {\n scriptIndex++;\n }\n\n // Get the script/command portion (may include args)\n const scriptPart = parts.slice(scriptIndex).join(' ');\n\n // Check if script starts with any safe script name\n return SAFE_SCRIPTS.some((safe) => scriptPart.startsWith(safe));\n}\n\n/**\n * Permission hook that allows only safe commands.\n * - Package manager install commands\n * - Build/typecheck/lint commands for verification\n * - Piping to tail/head for output limiting is allowed\n * - Stderr redirection (2>&1) is allowed\n */\nexport function wizardCanUseTool(\n toolName: string,\n input: Record<string, unknown>,\n):\n | { behavior: 'allow'; updatedInput: Record<string, unknown> }\n | { behavior: 'deny'; message: string } {\n // Allow all non-Bash tools\n if (toolName !== 'Bash') {\n return { behavior: 'allow', updatedInput: input };\n }\n\n const command = (\n typeof input.command === 'string' ? input.command : ''\n ).trim();\n\n // Block definitely dangerous operators: ; ` $ ( )\n if (DANGEROUS_OPERATORS.test(command)) {\n logToFile(`Denying bash command with dangerous operators: ${command}`);\n debug(`Denying bash command with dangerous operators: ${command}`);\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'bash command denied',\n reason: 'dangerous operators',\n command,\n });\n return {\n behavior: 'deny',\n message: `Bash command not allowed. Shell operators like ; \\` $ ( ) are not permitted.`,\n };\n }\n\n // Normalize: remove safe stderr redirection (2>&1, 2>&2, etc.)\n const normalized = command.replace(/\\s*\\d*>&\\d+\\s*/g, ' ').trim();\n\n // Check for pipe to tail/head (safe output limiting)\n const pipeMatch = normalized.match(/^(.+?)\\s*\\|\\s*(tail|head)(\\s+\\S+)*\\s*$/);\n if (pipeMatch) {\n const baseCommand = pipeMatch[1].trim();\n\n // Block if base command has pipes or & (multiple chaining)\n if (/[|&]/.test(baseCommand)) {\n logToFile(`Denying bash command with multiple pipes: ${command}`);\n debug(`Denying bash command with multiple pipes: ${command}`);\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'bash command denied',\n reason: 'multiple pipes',\n command,\n });\n return {\n behavior: 'deny',\n message: `Bash command not allowed. Only single pipe to tail/head is permitted.`,\n };\n }\n\n if (matchesAllowedPrefix(baseCommand)) {\n logToFile(`Allowing bash command with output limiter: ${command}`);\n debug(`Allowing bash command with output limiter: ${command}`);\n return { behavior: 'allow', updatedInput: input };\n }\n }\n\n // Block remaining pipes and & (not covered by tail/head case above)\n if (/[|&]/.test(normalized)) {\n logToFile(`Denying bash command with pipe/&: ${command}`);\n debug(`Denying bash command with pipe/&: ${command}`);\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'bash command denied',\n reason: 'disallowed pipe',\n command,\n });\n return {\n behavior: 'deny',\n message: `Bash command not allowed. Pipes are only permitted with tail/head for output limiting.`,\n };\n }\n\n // Check if command starts with any allowed prefix\n if (matchesAllowedPrefix(normalized)) {\n logToFile(`Allowing bash command: ${command}`);\n debug(`Allowing bash command: ${command}`);\n return { behavior: 'allow', updatedInput: input };\n }\n\n logToFile(`Denying bash command: ${command}`);\n debug(`Denying bash command: ${command}`);\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'bash command denied',\n reason: 'not in allowlist',\n command,\n });\n return {\n behavior: 'deny',\n message: `Bash command not allowed. Only install, build, typecheck, and lint commands are permitted.`,\n };\n}\n\n/**\n * Initialize agent configuration for the LLM gateway\n */\nexport function initializeAgent(\n config: AgentConfig,\n options: WizardOptions,\n): AgentRunConfig {\n // Initialize log file for this run\n initLogFile();\n logToFile('Agent initialization starting');\n logToFile('Install directory:', options.installDir);\n\n clack.log.step('Initializing Claude agent...');\n\n try {\n // Configure LLM gateway environment variables (inherited by SDK subprocess)\n const gatewayUrl = `${config.posthogApiHost}/api/projects/${config.posthogProjectId}/llm_gateway`;\n process.env.ANTHROPIC_BASE_URL = gatewayUrl;\n process.env.ANTHROPIC_AUTH_TOKEN = config.posthogApiKey;\n // Disable experimental betas (like input_examples) that the LLM gateway doesn't support\n process.env.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS = 'true';\n\n logToFile('Configured LLM gateway:', gatewayUrl);\n\n // Configure MCP server with PostHog authentication\n const mcpServers: McpServersConfig = {\n posthog: {\n type: 'http',\n url: config.posthogMcpUrl,\n headers: {\n Authorization: `Bearer ${config.posthogApiKey}`,\n },\n },\n };\n\n const agentRunConfig: AgentRunConfig = {\n workingDirectory: config.workingDirectory,\n mcpServers,\n model: 'claude-opus-4-5-20251101',\n };\n\n logToFile('Agent config:', {\n workingDirectory: agentRunConfig.workingDirectory,\n posthogMcpUrl: config.posthogMcpUrl,\n gatewayUrl,\n apiKeyPresent: !!config.posthogApiKey,\n });\n\n if (options.debug) {\n debug('Agent config:', {\n workingDirectory: agentRunConfig.workingDirectory,\n posthogMcpUrl: config.posthogMcpUrl,\n gatewayUrl,\n apiKeyPresent: !!config.posthogApiKey,\n });\n }\n\n clack.log.step(`Verbose logs: ${LOG_FILE_PATH}`);\n clack.log.success(\"Agent initialized. Let's get cooking!\");\n return agentRunConfig;\n } catch (error) {\n clack.log.error(`Failed to initialize agent: ${(error as Error).message}`);\n logToFile('Agent initialization error:', error);\n debug('Agent initialization error:', error);\n throw error;\n }\n}\n\n/**\n * Execute an agent with the provided prompt and options\n * Handles the full lifecycle: spinner, execution, error handling\n *\n * @returns An object containing any error detected in the agent's output\n */\nexport async function runAgent(\n agentConfig: AgentRunConfig,\n prompt: string,\n options: WizardOptions,\n spinner: ReturnType<typeof clack.spinner>,\n config?: {\n estimatedDurationMinutes?: number;\n spinnerMessage?: string;\n successMessage?: string;\n errorMessage?: string;\n },\n): Promise<{ error?: AgentErrorType }> {\n const {\n estimatedDurationMinutes = 8,\n spinnerMessage = 'Customizing your PostHog setup...',\n successMessage = 'PostHog integration complete',\n errorMessage = 'Integration failed',\n } = config ?? {};\n\n const { query } = await getSDKModule();\n\n clack.log.step(\n `This whole process should take about ${estimatedDurationMinutes} minutes including error checking and fixes.\\n\\nGrab some coffee!`,\n );\n\n spinner.start(spinnerMessage);\n\n const cliPath = getClaudeCodeExecutablePath();\n logToFile('Starting agent run');\n logToFile('Claude Code executable:', cliPath);\n logToFile('Prompt:', prompt);\n\n const startTime = Date.now();\n const collectedText: string[] = [];\n\n try {\n // Workaround for SDK bug: stdin closes before canUseTool responses can be sent.\n // The fix is to use an async generator for the prompt that stays open until\n // the result is received, keeping the stdin stream alive for permission responses.\n // See: https://github.com/anthropics/claude-code/issues/4775\n // See: https://github.com/anthropics/claude-agent-sdk-typescript/issues/41\n let signalDone: () => void;\n const resultReceived = new Promise<void>((resolve) => {\n signalDone = resolve;\n });\n\n const createPromptStream = async function* () {\n yield {\n type: 'user',\n session_id: '',\n message: { role: 'user', content: prompt },\n parent_tool_use_id: null,\n };\n await resultReceived;\n };\n\n const response = query({\n prompt: createPromptStream(),\n options: {\n model: agentConfig.model,\n cwd: agentConfig.workingDirectory,\n permissionMode: 'acceptEdits',\n mcpServers: agentConfig.mcpServers,\n env: { ...process.env },\n canUseTool: (toolName: string, input: unknown) => {\n logToFile('canUseTool called:', { toolName, input });\n const result = wizardCanUseTool(\n toolName,\n input as Record<string, unknown>,\n );\n logToFile('canUseTool result:', result);\n return Promise.resolve(result);\n },\n tools: { type: 'preset', preset: 'claude_code' },\n // Capture stderr from CLI subprocess for debugging\n stderr: (data: string) => {\n logToFile('CLI stderr:', data);\n if (options.debug) {\n debug('CLI stderr:', data);\n }\n },\n },\n });\n\n // Process the async generator\n for await (const message of response) {\n handleSDKMessage(message, options, spinner, collectedText);\n // Signal completion when result received\n if (message.type === 'result') {\n signalDone!();\n }\n }\n\n const durationMs = Date.now() - startTime;\n const outputText = collectedText.join('\\n');\n\n // Check for error markers in the agent's output\n if (outputText.includes(AgentSignals.ERROR_MCP_MISSING)) {\n logToFile('Agent error: MCP_MISSING');\n spinner.stop('Agent could not access PostHog MCP');\n return { error: AgentErrorType.MCP_MISSING };\n }\n\n if (outputText.includes(AgentSignals.ERROR_RESOURCE_MISSING)) {\n logToFile('Agent error: RESOURCE_MISSING');\n spinner.stop('Agent could not access setup resource');\n return { error: AgentErrorType.RESOURCE_MISSING };\n }\n\n logToFile(`Agent run completed in ${Math.round(durationMs / 1000)}s`);\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'agent integration completed',\n duration_ms: durationMs,\n duration_seconds: Math.round(durationMs / 1000),\n });\n\n spinner.stop(successMessage);\n return {};\n } catch (error) {\n spinner.stop(errorMessage);\n clack.log.error(`Error: ${(error as Error).message}`);\n logToFile('Agent run failed:', error);\n debug('Full error:', error);\n throw error;\n }\n}\n\n/**\n * Handle SDK messages and provide user feedback\n */\nfunction handleSDKMessage(\n message: SDKMessage,\n options: WizardOptions,\n spinner: ReturnType<typeof clack.spinner>,\n collectedText: string[],\n): void {\n logToFile(`SDK Message: ${message.type}`, JSON.stringify(message, null, 2));\n\n if (options.debug) {\n debug(`SDK Message type: ${message.type}`);\n }\n\n switch (message.type) {\n case 'assistant': {\n // Extract text content from assistant messages\n const content = message.message?.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (block.type === 'text' && typeof block.text === 'string') {\n collectedText.push(block.text);\n\n // Check for [STATUS] markers\n const statusRegex = new RegExp(\n `^.*${AgentSignals.STATUS.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&',\n )}\\\\s*(.+?)$`,\n 'm',\n );\n const statusMatch = block.text.match(statusRegex);\n if (statusMatch) {\n spinner.stop(statusMatch[1].trim());\n spinner.start('Integrating PostHog...');\n }\n }\n }\n }\n break;\n }\n\n case 'result': {\n if (message.subtype === 'success') {\n logToFile('Agent completed successfully');\n if (typeof message.result === 'string') {\n collectedText.push(message.result);\n }\n } else {\n // Error result\n logToFile('Agent error result:', message.subtype);\n if (message.errors) {\n for (const err of message.errors) {\n clack.log.error(`Error: ${err}`);\n logToFile('ERROR:', err);\n }\n }\n }\n break;\n }\n\n case 'system': {\n if (message.subtype === 'init') {\n logToFile('Agent session initialized', {\n model: message.model,\n tools: message.tools?.length,\n mcpServers: message.mcp_servers,\n });\n }\n break;\n }\n\n default:\n // Log other message types for debugging\n if (options.debug) {\n debug(`Unhandled message type: ${message.type}`);\n }\n break;\n }\n}\n"]}
@@ -19,7 +19,7 @@ const steps_1 = require("../steps");
19
19
  async function runAgentWizard(config, options) {
20
20
  // Setup phase
21
21
  (0, clack_utils_1.printWelcome)({ wizardName: config.ui.welcomeMessage });
22
- clack_1.default.log.info(`🧙 The wizard has chosen you to try the next-generation agent integration for ${config.metadata.name}.\n\nStand by for the good stuff, and let me know how it goes:\n\ndanilo@posthog.com`);
22
+ clack_1.default.log.info(`🧙 The wizard has chosen you to try the next-generation agent integration for ${config.metadata.name}.\n\nStand by for the good stuff, and let the robot minders know how it goes:\n\nwizard@posthog.com`);
23
23
  const aiConsent = await (0, clack_utils_1.askForAIConsent)(options);
24
24
  if (!aiConsent) {
25
25
  await (0, clack_utils_1.abort)(config.metadata.abortMessage, 0);
@@ -41,7 +41,7 @@ async function runAgentWizard(config, options) {
41
41
  integration: config.metadata.integration,
42
42
  });
43
43
  // Get PostHog credentials
44
- const { projectApiKey, host, accessToken } = await (0, clack_utils_1.getOrAskForProjectData)({
44
+ const { projectApiKey, host, accessToken, projectId } = await (0, clack_utils_1.getOrAskForProjectData)({
45
45
  ...options,
46
46
  cloudRegion,
47
47
  });
@@ -63,12 +63,17 @@ async function runAgentWizard(config, options) {
63
63
  }, frameworkContext);
64
64
  // Initialize and run agent
65
65
  const spinner = clack_1.default.spinner();
66
- const agent = await (0, agent_interface_1.initializeAgent)({
66
+ // Determine MCP URL: CLI flag > env var > production default
67
+ const mcpUrl = options.localMcp
68
+ ? 'http://localhost:8787/mcp'
69
+ : process.env.MCP_URL || 'https://mcp.posthog.com/mcp';
70
+ const agent = (0, agent_interface_1.initializeAgent)({
67
71
  workingDirectory: options.installDir,
68
- posthogMcpUrl: 'https://mcp.posthog.com/mcp',
72
+ posthogMcpUrl: mcpUrl,
69
73
  posthogApiKey: accessToken,
70
- debug: false,
71
- }, options, spinner);
74
+ posthogApiHost: host,
75
+ posthogProjectId: projectId,
76
+ }, options);
72
77
  const agentResult = await (0, agent_interface_1.runAgent)(agent, integrationPrompt, options, spinner, {
73
78
  estimatedDurationMinutes: config.ui.estimatedDurationMinutes,
74
79
  spinnerMessage: config.ui.spinnerMessage,
@@ -158,7 +163,7 @@ Learn more: ${chalk_1.default.cyan(config.metadata.docsUrl)}
158
163
  ${continueUrl ? `\nContinue onboarding: ${chalk_1.default.cyan(continueUrl)}\n` : ``}
159
164
  ${chalk_1.default.dim('Note: This wizard uses an LLM agent to analyze and modify your project. Please review the changes made.')}
160
165
 
161
- ${chalk_1.default.dim(`How did this work for you? Drop me a line: danilo@posthog.com`)}`;
166
+ ${chalk_1.default.dim(`How did this work for you? Drop us a line: wizard@posthog.com`)}`;
162
167
  clack_1.default.outro(outroMessage);
163
168
  await analytics_1.analytics.shutdown('success');
164
169
  }
@@ -182,8 +187,9 @@ Project context:
182
187
  - PostHog Host: ${context.host}${additionalContext}
183
188
 
184
189
  Instructions:
190
+
185
191
  1. Call the PostHog MCP's resource for setup: posthog://workflows/basic-integration/begin
186
- 2. Follow all instructions provided
192
+ 2. Follow all instructions provided; do package installation as soon as possible.
187
193
  3. Set up environment variables for PostHog in a .env file with the API key and host provided above, using the appropriate naming convention for ${config.metadata.name}. Make sure to use these environment variables in the code files you create instead of hardcoding the API key and host.
188
194
 
189
195
  The PostHog MCP will provide specific integration code and instructions. Please follow them carefully. Be sure to look for lockfiles to determine the appropriate package manager to use when installing PostHog. Do not manually edit the package.json file.
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/lib/agent-runner.ts"],"names":[],"mappings":";;;;;AAiCA,wCAiNC;AAhPD,sDAU8B;AAC9B,kDAA+C;AAC/C,2CAA4D;AAC5D,2DAAmC;AACnC,uDAK2B;AAC3B,wCAAsD;AACtD,kDAA0B;AAC1B,oCAGkB;AAElB;;;GAGG;AACI,KAAK,UAAU,cAAc,CAClC,MAAuB,EACvB,OAAsB;IAEtB,cAAc;IACd,IAAA,0BAAY,EAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;IAEvD,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,iFAAiF,MAAM,CAAC,QAAQ,CAAC,IAAI,sFAAsF,CAC5L,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAe,EAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAA,mBAAK,EAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,MAAM,IAAA,+BAAiB,GAAE,CAAC,CAAC;IACvE,MAAM,kBAAkB,GAAG,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;IAEtD,MAAM,IAAA,+CAAiC,EAAC,OAAO,CAAC,CAAC;IAEjD,kCAAkC;IAClC,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;IACrD,MAAM,IAAA,sCAAwB,EAC5B,WAAW,EACX,MAAM,CAAC,SAAS,CAAC,WAAW,EAC5B,MAAM,CAAC,SAAS,CAAC,kBAAkB,CACpC,CAAC;IAEF,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAElE,2CAA2C;IAC3C,IAAI,gBAAgB,IAAI,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAC1E,qBAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,UAAU,EAAE,aAAa,CAAC,CAAC;IAC5E,CAAC;IAED,qBAAS,CAAC,OAAO,CAAC,yCAA6B,EAAE;QAC/C,MAAM,EAAE,2BAA2B;QACnC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;KACzC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,oCAAsB,EAAC;QACxE,GAAG,OAAO;QACV,WAAW;KACZ,CAAC,CAAC;IAEH,kFAAkF;IAClF,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa;QACpD,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;QAC9C,CAAC,CAAC,EAAE,CAAC;IAEP,4CAA4C;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACnD,qBAAS,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,iBAAiB,GAAG,sBAAsB,CAC9C,MAAM,EACN;QACE,gBAAgB,EAAE,gBAAgB,IAAI,QAAQ;QAC9C,UAAU,EAAE,kBAAkB;QAC9B,aAAa;QACb,IAAI;KACL,EACD,gBAAgB,CACjB,CAAC;IAEF,2BAA2B;IAC3B,MAAM,OAAO,GAAG,eAAK,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,IAAA,iCAAe,EACjC;QACE,gBAAgB,EAAE,OAAO,CAAC,UAAU;QACpC,aAAa,EAAE,6BAA6B;QAC5C,aAAa,EAAE,WAAW;QAC1B,KAAK,EAAE,KAAK;KACb,EACD,OAAO,EACP,OAAO,CACR,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,IAAA,0BAAQ,EAChC,KAAK,EACL,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP;QACE,wBAAwB,EAAE,MAAM,CAAC,EAAE,CAAC,wBAAwB;QAC5D,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,cAAc;QACxC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,cAAc;QACxC,YAAY,EAAE,oBAAoB;KACnC,CACF,CAAC;IAEF,8CAA8C;IAC9C,IAAI,WAAW,CAAC,KAAK,KAAK,gCAAc,CAAC,WAAW,EAAE,CAAC;QACrD,qBAAS,CAAC,gBAAgB,CACxB,IAAI,KAAK,CAAC,2CAA2C,CAAC,EACtD;YACE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;YACxC,UAAU,EAAE,gCAAc,CAAC,WAAW;YACtC,MAAM,EAAE,8BAAY,CAAC,iBAAiB;SACvC,CACF,CAAC;QAEF,MAAM,YAAY,GAAG;EACvB,eAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC;;;;;8BAMlD,MAAM,CAAC,QAAQ,CAAC,IAClB;EACF,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAEpC,eAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1B,MAAM,qBAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,WAAW,CAAC,KAAK,KAAK,gCAAc,CAAC,gBAAgB,EAAE,CAAC;QAC1D,qBAAS,CAAC,gBAAgB,CACxB,IAAI,KAAK,CAAC,uCAAuC,CAAC,EAClD;YACE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;YACxC,UAAU,EAAE,gCAAc,CAAC,gBAAgB;YAC3C,MAAM,EAAE,8BAAY,CAAC,sBAAsB;SAC5C,CACF,CAAC;QAEF,MAAM,YAAY,GAAG;EACvB,eAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC;;;;8BAK9C,MAAM,CAAC,QAAQ,CAAC,IAClB;EACF,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAEpC,eAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1B,MAAM,qBAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qDAAqD;IACrD,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAEnE,oEAAoE;IACpE,IAAI,eAAe,GAAa,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QACvC,eAAe,GAAG,MAAM,IAAA,sCAA8B,EAAC,OAAO,EAAE;YAC9D,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;YACxC,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,4BAA4B;IAC5B,MAAM,IAAA,iCAAyB,EAAC;QAC9B,WAAW;QACX,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;KACzC,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM;QAChC,CAAC,CAAC,GAAG,IAAA,4BAAqB,EAAC,WAAW,CAAC,yBAAyB;QAChE,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,OAAO,GAAG;QACd,GAAG,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,gBAAgB,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;YAC7B,CAAC,CAAC,0CAA0C;YAC5C,CAAC,CAAC,EAAE;QACN,eAAe,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,yDAAyD;YAC3D,CAAC,CAAC,EAAE;KACP,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,MAAM,SAAS,GAAG;QAChB,GAAG,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,gBAAgB,CAAC;QAChD,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,eAAe;YAChE,CAAC,CAAC,sDAAsD;YACxD,CAAC,CAAC,EAAE;KACP,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,MAAM,YAAY,GAAG;EACrB,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC;;EAE9C,eAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC;EACjC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;EAEjD,eAAK,CAAC,MAAM,CAAC,aAAa,CAAC;EAC3B,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;cAEnC,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;EAC/C,WAAW,CAAC,CAAC,CAAC,0BAA0B,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;EACxE,eAAK,CAAC,GAAG,CACT,yGAAyG,CAC1G;;EAEC,eAAK,CAAC,GAAG,CAAC,+DAA+D,CAAC,EAAE,CAAC;IAE7E,eAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAE1B,MAAM,qBAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAC7B,MAAuB,EACvB,OAKC,EACD,gBAAqC;IAErC,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB;QAC9D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,gBAAgB,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,iBAAiB,GACrB,eAAe,CAAC,MAAM,GAAG,CAAC;QACxB,CAAC,CAAC,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9D,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,mHACL,MAAM,CAAC,QAAQ,CAAC,IAClB;;;eAGa,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,gBAAgB;gBAC/C,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;qBAC5B,OAAO,CAAC,aAAa;kBACxB,OAAO,CAAC,IAAI,GAAG,iBAAiB;;;;;mJAM9C,MAAM,CAAC,QAAQ,CAAC,IAClB;;;;;;EAMA,8BAAY,CAAC,iBAAiB;;;;EAI9B,8BAAY,CAAC,sBAAsB;;CAEpC,CAAC;AACF,CAAC","sourcesContent":["import type { FrameworkConfig } from './framework-config';\nimport type { WizardOptions } from '../utils/types';\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n isUsingTypeScript,\n printWelcome,\n askForCloudRegion,\n} from '../utils/clack-utils';\nimport { analytics } from '../utils/analytics';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\nimport clack from '../utils/clack';\nimport {\n initializeAgent,\n runAgent,\n AgentSignals,\n AgentErrorType,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../utils/urls';\nimport chalk from 'chalk';\nimport {\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\n\n/**\n * Universal agent-powered wizard runner.\n * Handles the complete flow for any framework using PostHog MCP integration.\n */\nexport async function runAgentWizard(\n config: FrameworkConfig,\n options: WizardOptions,\n): Promise<void> {\n // Setup phase\n printWelcome({ wizardName: config.ui.welcomeMessage });\n\n clack.log.info(\n `🧙 The wizard has chosen you to try the next-generation agent integration for ${config.metadata.name}.\\n\\nStand by for the good stuff, and let me know how it goes:\\n\\ndanilo@posthog.com`,\n );\n\n const aiConsent = await askForAIConsent(options);\n if (!aiConsent) {\n await abort(config.metadata.abortMessage, 0);\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n // Framework detection and version\n const packageJson = await getPackageDotJson(options);\n await ensurePackageIsInstalled(\n packageJson,\n config.detection.packageName,\n config.detection.packageDisplayName,\n );\n\n const frameworkVersion = config.detection.getVersion(packageJson);\n\n // Set analytics tags for framework version\n if (frameworkVersion && config.detection.getVersionBucket) {\n const versionBucket = config.detection.getVersionBucket(frameworkVersion);\n analytics.setTag(`${config.metadata.integration}-version`, versionBucket);\n }\n\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: config.metadata.integration,\n });\n\n // Get PostHog credentials\n const { projectApiKey, host, accessToken } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n // Gather framework-specific context (e.g., Next.js router, React Native platform)\n const frameworkContext = config.metadata.gatherContext\n ? await config.metadata.gatherContext(options)\n : {};\n\n // Set analytics tags from framework context\n const contextTags = config.analytics.getTags(frameworkContext);\n Object.entries(contextTags).forEach(([key, value]) => {\n analytics.setTag(key, value);\n });\n\n // Build integration prompt\n const integrationPrompt = buildIntegrationPrompt(\n config,\n {\n frameworkVersion: frameworkVersion || 'latest',\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n },\n frameworkContext,\n );\n\n // Initialize and run agent\n const spinner = clack.spinner();\n const agent = await initializeAgent(\n {\n workingDirectory: options.installDir,\n posthogMcpUrl: 'https://mcp.posthog.com/mcp',\n posthogApiKey: accessToken,\n debug: false,\n },\n options,\n spinner,\n );\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n options,\n spinner,\n {\n estimatedDurationMinutes: config.ui.estimatedDurationMinutes,\n spinnerMessage: config.ui.spinnerMessage,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n },\n );\n\n // Handle error cases detected in agent output\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n analytics.captureException(\n new Error('Agent could not access PostHog MCP server'),\n {\n integration: config.metadata.integration,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n },\n );\n\n const errorMessage = `\n${chalk.red('❌ Could not access the PostHog MCP server')}\n\nThe wizard was unable to connect to the PostHog MCP server.\nThis could be due to a network issue or a configuration problem.\n\nPlease try again, or set up ${\n config.metadata.name\n } manually by following our documentation:\n${chalk.cyan(config.metadata.docsUrl)}`;\n\n clack.outro(errorMessage);\n await analytics.shutdown('error');\n process.exit(1);\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n analytics.captureException(\n new Error('Agent could not access setup resource'),\n {\n integration: config.metadata.integration,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n },\n );\n\n const errorMessage = `\n${chalk.red('❌ Could not access the setup resource')}\n\nThe wizard could not access the setup resource. This may indicate a version mismatch or a temporary service issue.\n\nPlease try again, or set up ${\n config.metadata.name\n } manually by following our documentation:\n${chalk.cyan(config.metadata.docsUrl)}`;\n\n clack.outro(errorMessage);\n await analytics.shutdown('error');\n process.exit(1);\n }\n\n // Build environment variables from OAuth credentials\n const envVars = config.environment.getEnvVars(projectApiKey, host);\n\n // Upload environment variables to hosting providers (if configured)\n let uploadedEnvVars: string[] = [];\n if (config.environment.uploadToHosting) {\n uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {\n integration: config.metadata.integration,\n options,\n });\n }\n\n // Add MCP server to clients\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: config.metadata.integration,\n });\n\n // Build outro message\n const continueUrl = options.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n ...config.ui.getOutroChanges(frameworkContext),\n Object.keys(envVars).length > 0\n ? `Added environment variables to .env file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded environment variables to your hosting provider`\n : '',\n ].filter(Boolean);\n\n const nextSteps = [\n ...config.ui.getOutroNextSteps(frameworkContext),\n uploadedEnvVars.length === 0 && config.environment.uploadToHosting\n ? `Upload your Project API key to your hosting provider`\n : '',\n ].filter(Boolean);\n\n const outroMessage = `\n${chalk.green('Successfully installed PostHog!')}\n\n${chalk.cyan('What the agent did:')}\n${changes.map((change) => `• ${change}`).join('\\n')}\n\n${chalk.yellow('Next steps:')}\n${nextSteps.map((step) => `• ${step}`).join('\\n')}\n\nLearn more: ${chalk.cyan(config.metadata.docsUrl)}\n${continueUrl ? `\\nContinue onboarding: ${chalk.cyan(continueUrl)}\\n` : ``}\n${chalk.dim(\n 'Note: This wizard uses an LLM agent to analyze and modify your project. Please review the changes made.',\n)}\n\n${chalk.dim(`How did this work for you? Drop me a line: danilo@posthog.com`)}`;\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n\n/**\n * Build the integration prompt for the agent.\n * Uses shared base prompt with optional framework-specific addendum.\n */\nfunction buildIntegrationPrompt(\n config: FrameworkConfig,\n context: {\n frameworkVersion: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n },\n frameworkContext: Record<string, any>,\n): string {\n const additionalLines = config.prompts.getAdditionalContextLines\n ? config.prompts.getAdditionalContextLines(frameworkContext)\n : [];\n\n const additionalContext =\n additionalLines.length > 0\n ? '\\n' + additionalLines.map((line) => `- ${line}`).join('\\n')\n : '';\n\n return `You have access to the PostHog MCP server which provides an integration resource to integrate PostHog into this ${\n config.metadata.name\n } project.\n\nProject context:\n- Framework: ${config.metadata.name} ${context.frameworkVersion}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog API Key: ${context.projectApiKey}\n- PostHog Host: ${context.host}${additionalContext}\n\nInstructions:\n1. Call the PostHog MCP's resource for setup: posthog://workflows/basic-integration/begin\n2. Follow all instructions provided\n3. Set up environment variables for PostHog in a .env file with the API key and host provided above, using the appropriate naming convention for ${\n config.metadata.name\n }. Make sure to use these environment variables in the code files you create instead of hardcoding the API key and host.\n\nThe PostHog MCP will provide specific integration code and instructions. Please follow them carefully. Be sure to look for lockfiles to determine the appropriate package manager to use when installing PostHog. Do not manually edit the package.json file.\n\nBefore beginning, confirm that you can access the PostHog MCP. If the PostHog MCP is not accessible, emit the following string:\n\n${AgentSignals.ERROR_MCP_MISSING} Could not access the PostHog MCP.\n\nIf the PostHog MCP is accessible, attempt to access the setup resource. If the setup resource is not accessible, emit the following string:\n\n${AgentSignals.ERROR_RESOURCE_MISSING} Could not access the setup resource.\n\n`;\n}\n"]}
1
+ {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/lib/agent-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameworkConfig } from './framework-config';\nimport type { WizardOptions } from '../utils/types';\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n isUsingTypeScript,\n printWelcome,\n askForCloudRegion,\n} from '../utils/clack-utils';\nimport { analytics } from '../utils/analytics';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\nimport clack from '../utils/clack';\nimport {\n initializeAgent,\n runAgent,\n AgentSignals,\n AgentErrorType,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../utils/urls';\nimport chalk from 'chalk';\nimport {\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\n\n/**\n * Universal agent-powered wizard runner.\n * Handles the complete flow for any framework using PostHog MCP integration.\n */\nexport async function runAgentWizard(\n config: FrameworkConfig,\n options: WizardOptions,\n): Promise<void> {\n // Setup phase\n printWelcome({ wizardName: config.ui.welcomeMessage });\n\n clack.log.info(\n `🧙 The wizard has chosen you to try the next-generation agent integration for ${config.metadata.name}.\\n\\nStand by for the good stuff, and let the robot minders know how it goes:\\n\\nwizard@posthog.com`,\n );\n\n const aiConsent = await askForAIConsent(options);\n if (!aiConsent) {\n await abort(config.metadata.abortMessage, 0);\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n // Framework detection and version\n const packageJson = await getPackageDotJson(options);\n await ensurePackageIsInstalled(\n packageJson,\n config.detection.packageName,\n config.detection.packageDisplayName,\n );\n\n const frameworkVersion = config.detection.getVersion(packageJson);\n\n // Set analytics tags for framework version\n if (frameworkVersion && config.detection.getVersionBucket) {\n const versionBucket = config.detection.getVersionBucket(frameworkVersion);\n analytics.setTag(`${config.metadata.integration}-version`, versionBucket);\n }\n\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: config.metadata.integration,\n });\n\n // Get PostHog credentials\n const { projectApiKey, host, accessToken, projectId } =\n await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n // Gather framework-specific context (e.g., Next.js router, React Native platform)\n const frameworkContext = config.metadata.gatherContext\n ? await config.metadata.gatherContext(options)\n : {};\n\n // Set analytics tags from framework context\n const contextTags = config.analytics.getTags(frameworkContext);\n Object.entries(contextTags).forEach(([key, value]) => {\n analytics.setTag(key, value);\n });\n\n // Build integration prompt\n const integrationPrompt = buildIntegrationPrompt(\n config,\n {\n frameworkVersion: frameworkVersion || 'latest',\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n },\n frameworkContext,\n );\n\n // Initialize and run agent\n const spinner = clack.spinner();\n\n // Determine MCP URL: CLI flag > env var > production default\n const mcpUrl = options.localMcp\n ? 'http://localhost:8787/mcp'\n : process.env.MCP_URL || 'https://mcp.posthog.com/mcp';\n\n const agent = initializeAgent(\n {\n workingDirectory: options.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n posthogProjectId: projectId,\n },\n options,\n );\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n options,\n spinner,\n {\n estimatedDurationMinutes: config.ui.estimatedDurationMinutes,\n spinnerMessage: config.ui.spinnerMessage,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n },\n );\n\n // Handle error cases detected in agent output\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n analytics.captureException(\n new Error('Agent could not access PostHog MCP server'),\n {\n integration: config.metadata.integration,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n },\n );\n\n const errorMessage = `\n${chalk.red('❌ Could not access the PostHog MCP server')}\n\nThe wizard was unable to connect to the PostHog MCP server.\nThis could be due to a network issue or a configuration problem.\n\nPlease try again, or set up ${\n config.metadata.name\n } manually by following our documentation:\n${chalk.cyan(config.metadata.docsUrl)}`;\n\n clack.outro(errorMessage);\n await analytics.shutdown('error');\n process.exit(1);\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n analytics.captureException(\n new Error('Agent could not access setup resource'),\n {\n integration: config.metadata.integration,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n },\n );\n\n const errorMessage = `\n${chalk.red('❌ Could not access the setup resource')}\n\nThe wizard could not access the setup resource. This may indicate a version mismatch or a temporary service issue.\n\nPlease try again, or set up ${\n config.metadata.name\n } manually by following our documentation:\n${chalk.cyan(config.metadata.docsUrl)}`;\n\n clack.outro(errorMessage);\n await analytics.shutdown('error');\n process.exit(1);\n }\n\n // Build environment variables from OAuth credentials\n const envVars = config.environment.getEnvVars(projectApiKey, host);\n\n // Upload environment variables to hosting providers (if configured)\n let uploadedEnvVars: string[] = [];\n if (config.environment.uploadToHosting) {\n uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {\n integration: config.metadata.integration,\n options,\n });\n }\n\n // Add MCP server to clients\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: config.metadata.integration,\n });\n\n // Build outro message\n const continueUrl = options.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n ...config.ui.getOutroChanges(frameworkContext),\n Object.keys(envVars).length > 0\n ? `Added environment variables to .env file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded environment variables to your hosting provider`\n : '',\n ].filter(Boolean);\n\n const nextSteps = [\n ...config.ui.getOutroNextSteps(frameworkContext),\n uploadedEnvVars.length === 0 && config.environment.uploadToHosting\n ? `Upload your Project API key to your hosting provider`\n : '',\n ].filter(Boolean);\n\n const outroMessage = `\n${chalk.green('Successfully installed PostHog!')}\n\n${chalk.cyan('What the agent did:')}\n${changes.map((change) => `• ${change}`).join('\\n')}\n\n${chalk.yellow('Next steps:')}\n${nextSteps.map((step) => `• ${step}`).join('\\n')}\n\nLearn more: ${chalk.cyan(config.metadata.docsUrl)}\n${continueUrl ? `\\nContinue onboarding: ${chalk.cyan(continueUrl)}\\n` : ``}\n${chalk.dim(\n 'Note: This wizard uses an LLM agent to analyze and modify your project. Please review the changes made.',\n)}\n\n${chalk.dim(`How did this work for you? Drop us a line: wizard@posthog.com`)}`;\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n\n/**\n * Build the integration prompt for the agent.\n * Uses shared base prompt with optional framework-specific addendum.\n */\nfunction buildIntegrationPrompt(\n config: FrameworkConfig,\n context: {\n frameworkVersion: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n },\n frameworkContext: Record<string, any>,\n): string {\n const additionalLines = config.prompts.getAdditionalContextLines\n ? config.prompts.getAdditionalContextLines(frameworkContext)\n : [];\n\n const additionalContext =\n additionalLines.length > 0\n ? '\\n' + additionalLines.map((line) => `- ${line}`).join('\\n')\n : '';\n\n return `You have access to the PostHog MCP server which provides an integration resource to integrate PostHog into this ${\n config.metadata.name\n } project.\n\nProject context:\n- Framework: ${config.metadata.name} ${context.frameworkVersion}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog API Key: ${context.projectApiKey}\n- PostHog Host: ${context.host}${additionalContext}\n\nInstructions:\n\n1. Call the PostHog MCP's resource for setup: posthog://workflows/basic-integration/begin\n2. Follow all instructions provided; do package installation as soon as possible.\n3. Set up environment variables for PostHog in a .env file with the API key and host provided above, using the appropriate naming convention for ${\n config.metadata.name\n }. Make sure to use these environment variables in the code files you create instead of hardcoding the API key and host.\n\nThe PostHog MCP will provide specific integration code and instructions. Please follow them carefully. Be sure to look for lockfiles to determine the appropriate package manager to use when installing PostHog. Do not manually edit the package.json file.\n\nBefore beginning, confirm that you can access the PostHog MCP. If the PostHog MCP is not accessible, emit the following string:\n\n${AgentSignals.ERROR_MCP_MISSING} Could not access the PostHog MCP.\n\nIf the PostHog MCP is accessible, attempt to access the setup resource. If the setup resource is not accessible, emit the following string:\n\n${AgentSignals.ERROR_RESOURCE_MISSING} Could not access the setup resource.\n\n`;\n}\n"]}
package/dist/src/run.d.ts CHANGED
@@ -8,6 +8,7 @@ type Args = {
8
8
  region?: CloudRegion;
9
9
  default?: boolean;
10
10
  signup?: boolean;
11
+ localMcp?: boolean;
11
12
  };
12
13
  export declare function runWizard(argv: Args): Promise<void>;
13
14
  export {};
package/dist/src/run.js CHANGED
@@ -80,6 +80,7 @@ async function runWizard(argv) {
80
80
  cloudRegion: finalArgs.region ?? undefined,
81
81
  default: finalArgs.default ?? false,
82
82
  signup: finalArgs.signup ?? false,
83
+ localMcp: finalArgs.localMcp ?? false,
83
84
  };
84
85
  clack_1.default.intro(`Welcome to the PostHog setup wizard ✨`);
85
86
  const integration = finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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","sourcesContent":["import { abortIfCancelled, getPackageDotJson } from './utils/clack-utils';\n\nimport { runNextjsWizard } from './nextjs/nextjs-wizard';\nimport { runNextjsWizardAgent } from './nextjs/nextjs-wizard-agent';\nimport type { CloudRegion, WizardOptions } from './utils/types';\n\nimport {\n getIntegrationDescription,\n Integration,\n FeatureFlagDefinition,\n WizardVariant,\n} from './lib/constants';\nimport { readEnvironment } from './utils/environment';\nimport clack from './utils/clack';\nimport path from 'path';\nimport { INTEGRATION_CONFIG, INTEGRATION_ORDER } from './lib/config';\nimport { runReactWizard } from './react/react-wizard';\nimport { analytics } from './utils/analytics';\nimport { runSvelteWizard } from './svelte/svelte-wizard';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\nimport { runAstroWizard } from './astro/astro-wizard';\nimport { EventEmitter } from 'events';\nimport chalk from 'chalk';\nimport { RateLimitError } from './utils/errors';\nimport { getPackageVersion } from './utils/package-json';\nimport * as semver from 'semver';\n\nEventEmitter.defaultMaxListeners = 50;\n\ntype Args = {\n integration?: Integration;\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n region?: CloudRegion;\n default?: boolean;\n signup?: boolean;\n};\n\nexport async function runWizard(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n let resolvedInstallDir: string;\n if (finalArgs.installDir) {\n if (path.isAbsolute(finalArgs.installDir)) {\n resolvedInstallDir = finalArgs.installDir;\n } else {\n resolvedInstallDir = path.join(process.cwd(), finalArgs.installDir);\n }\n } else {\n resolvedInstallDir = process.cwd();\n }\n\n const wizardOptions: WizardOptions = {\n debug: finalArgs.debug ?? false,\n forceInstall: finalArgs.forceInstall ?? false,\n installDir: resolvedInstallDir,\n cloudRegion: finalArgs.region ?? undefined,\n default: finalArgs.default ?? false,\n signup: finalArgs.signup ?? false,\n };\n\n clack.intro(`Welcome to the PostHog setup wizard ✨`);\n\n const integration =\n finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));\n\n analytics.setTag('integration', integration);\n\n try {\n switch (integration) {\n case Integration.nextjs:\n await chooseNextjsWizard(wizardOptions);\n break;\n case Integration.react:\n await runReactWizard(wizardOptions);\n break;\n case Integration.svelte:\n await runSvelteWizard(wizardOptions);\n break;\n case Integration.reactNative:\n await runReactNativeWizard(wizardOptions);\n break;\n case Integration.astro:\n await runAstroWizard(wizardOptions);\n break;\n default:\n clack.log.error('No setup wizard selected!');\n }\n } catch (error) {\n analytics.captureException(error as Error, {\n integration,\n arguments: JSON.stringify(finalArgs),\n });\n\n await analytics.shutdown('error');\n\n if (error instanceof RateLimitError) {\n clack.log.error('Wizard usage limit reached. Please try again later.');\n } else {\n clack.log.error(\n `Something went wrong. You can read the documentation at ${chalk.cyan(\n `${INTEGRATION_CONFIG[integration].docsUrl}`,\n )} to set up PostHog manually.`,\n );\n }\n process.exit(1);\n }\n}\n\nasync function detectIntegration(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<Integration | undefined> {\n const integrationConfigs = Object.entries(INTEGRATION_CONFIG).sort(\n ([a], [b]) =>\n INTEGRATION_ORDER.indexOf(a as Integration) -\n INTEGRATION_ORDER.indexOf(b as Integration),\n );\n\n for (const [integration, config] of integrationConfigs) {\n const detected = await config.detect(options);\n if (detected) {\n return integration as Integration;\n }\n }\n}\n\nasync function getIntegrationForSetup(\n options: Pick<WizardOptions, 'installDir'>,\n) {\n const detectedIntegration = await detectIntegration(options);\n\n if (detectedIntegration) {\n clack.log.success(\n `Detected integration: ${getIntegrationDescription(detectedIntegration)}`,\n );\n return detectedIntegration;\n }\n\n const integration: Integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: Integration.nextjs, label: 'Next.js' },\n { value: Integration.astro, label: 'Astro' },\n { value: Integration.react, label: 'React' },\n { value: Integration.svelte, label: 'Svelte' },\n { value: Integration.reactNative, label: 'React Native' },\n ],\n }),\n );\n\n return integration;\n}\n\nasync function chooseNextjsWizard(options: WizardOptions): Promise<void> {\n try {\n const packageJson = await getPackageDotJson(options);\n const nextVersion = getPackageVersion('next', packageJson);\n\n // If Next.js < 15, use legacy wizard\n if (nextVersion) {\n const coercedVersion = semver.coerce(nextVersion);\n if (coercedVersion && semver.lt(coercedVersion, '15.3.0')) {\n await runNextjsWizard(options);\n return;\n }\n }\n\n // Next.js >= 15 - check feature flag to determine which wizard to use\n const flagValue = await analytics.getFeatureFlag(\n FeatureFlagDefinition.NextV2,\n );\n\n if (flagValue === WizardVariant.Agent) {\n await runNextjsWizardAgent(options);\n } else {\n await runNextjsWizard(options);\n }\n } catch (error) {\n await runNextjsWizard(options);\n }\n}\n"]}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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","sourcesContent":["import { abortIfCancelled, getPackageDotJson } from './utils/clack-utils';\n\nimport { runNextjsWizard } from './nextjs/nextjs-wizard';\nimport { runNextjsWizardAgent } from './nextjs/nextjs-wizard-agent';\nimport type { CloudRegion, WizardOptions } from './utils/types';\n\nimport {\n getIntegrationDescription,\n Integration,\n FeatureFlagDefinition,\n WizardVariant,\n} from './lib/constants';\nimport { readEnvironment } from './utils/environment';\nimport clack from './utils/clack';\nimport path from 'path';\nimport { INTEGRATION_CONFIG, INTEGRATION_ORDER } from './lib/config';\nimport { runReactWizard } from './react/react-wizard';\nimport { analytics } from './utils/analytics';\nimport { runSvelteWizard } from './svelte/svelte-wizard';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\nimport { runAstroWizard } from './astro/astro-wizard';\nimport { EventEmitter } from 'events';\nimport chalk from 'chalk';\nimport { RateLimitError } from './utils/errors';\nimport { getPackageVersion } from './utils/package-json';\nimport * as semver from 'semver';\n\nEventEmitter.defaultMaxListeners = 50;\n\ntype Args = {\n integration?: Integration;\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n region?: CloudRegion;\n default?: boolean;\n signup?: boolean;\n localMcp?: boolean;\n};\n\nexport async function runWizard(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n let resolvedInstallDir: string;\n if (finalArgs.installDir) {\n if (path.isAbsolute(finalArgs.installDir)) {\n resolvedInstallDir = finalArgs.installDir;\n } else {\n resolvedInstallDir = path.join(process.cwd(), finalArgs.installDir);\n }\n } else {\n resolvedInstallDir = process.cwd();\n }\n\n const wizardOptions: WizardOptions = {\n debug: finalArgs.debug ?? false,\n forceInstall: finalArgs.forceInstall ?? false,\n installDir: resolvedInstallDir,\n cloudRegion: finalArgs.region ?? undefined,\n default: finalArgs.default ?? false,\n signup: finalArgs.signup ?? false,\n localMcp: finalArgs.localMcp ?? false,\n };\n\n clack.intro(`Welcome to the PostHog setup wizard ✨`);\n\n const integration =\n finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));\n\n analytics.setTag('integration', integration);\n\n try {\n switch (integration) {\n case Integration.nextjs:\n await chooseNextjsWizard(wizardOptions);\n break;\n case Integration.react:\n await runReactWizard(wizardOptions);\n break;\n case Integration.svelte:\n await runSvelteWizard(wizardOptions);\n break;\n case Integration.reactNative:\n await runReactNativeWizard(wizardOptions);\n break;\n case Integration.astro:\n await runAstroWizard(wizardOptions);\n break;\n default:\n clack.log.error('No setup wizard selected!');\n }\n } catch (error) {\n analytics.captureException(error as Error, {\n integration,\n arguments: JSON.stringify(finalArgs),\n });\n\n await analytics.shutdown('error');\n\n if (error instanceof RateLimitError) {\n clack.log.error('Wizard usage limit reached. Please try again later.');\n } else {\n clack.log.error(\n `Something went wrong. You can read the documentation at ${chalk.cyan(\n `${INTEGRATION_CONFIG[integration].docsUrl}`,\n )} to set up PostHog manually.`,\n );\n }\n process.exit(1);\n }\n}\n\nasync function detectIntegration(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<Integration | undefined> {\n const integrationConfigs = Object.entries(INTEGRATION_CONFIG).sort(\n ([a], [b]) =>\n INTEGRATION_ORDER.indexOf(a as Integration) -\n INTEGRATION_ORDER.indexOf(b as Integration),\n );\n\n for (const [integration, config] of integrationConfigs) {\n const detected = await config.detect(options);\n if (detected) {\n return integration as Integration;\n }\n }\n}\n\nasync function getIntegrationForSetup(\n options: Pick<WizardOptions, 'installDir'>,\n) {\n const detectedIntegration = await detectIntegration(options);\n\n if (detectedIntegration) {\n clack.log.success(\n `Detected integration: ${getIntegrationDescription(detectedIntegration)}`,\n );\n return detectedIntegration;\n }\n\n const integration: Integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: Integration.nextjs, label: 'Next.js' },\n { value: Integration.astro, label: 'Astro' },\n { value: Integration.react, label: 'React' },\n { value: Integration.svelte, label: 'Svelte' },\n { value: Integration.reactNative, label: 'React Native' },\n ],\n }),\n );\n\n return integration;\n}\n\nasync function chooseNextjsWizard(options: WizardOptions): Promise<void> {\n try {\n const packageJson = await getPackageDotJson(options);\n const nextVersion = getPackageVersion('next', packageJson);\n\n // If Next.js < 15, use legacy wizard\n if (nextVersion) {\n const coercedVersion = semver.coerce(nextVersion);\n if (coercedVersion && semver.lt(coercedVersion, '15.3.0')) {\n await runNextjsWizard(options);\n return;\n }\n }\n\n // Next.js >= 15 - check feature flag to determine which wizard to use\n const flagValue = await analytics.getFeatureFlag(\n FeatureFlagDefinition.NextV2,\n );\n\n if (flagValue === WizardVariant.Agent) {\n await runNextjsWizardAgent(options);\n } else {\n await runNextjsWizard(options);\n }\n } catch (error) {\n await runNextjsWizard(options);\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ export type MCPServerConfig = Record<string, unknown>;
1
2
  export declare abstract class MCPClient {
2
3
  name: string;
3
4
  abstract getConfigPath(): Promise<string>;
@@ -15,13 +16,7 @@ export declare abstract class DefaultMCPClient extends MCPClient {
15
16
  name: string;
16
17
  constructor();
17
18
  getServerPropertyName(): string;
18
- getServerConfig(apiKey: string, type: 'sse' | 'streamable-http', selectedFeatures?: string[], local?: boolean): {
19
- command: string;
20
- args: string[];
21
- env: {
22
- POSTHOG_AUTH_HEADER: string;
23
- };
24
- };
19
+ getServerConfig(apiKey: string, type: 'sse' | 'streamable-http', selectedFeatures?: string[], local?: boolean): MCPServerConfig;
25
20
  isServerInstalled(local?: boolean): Promise<boolean>;
26
21
  addServer(apiKey: string, selectedFeatures?: string[], local?: boolean): Promise<{
27
22
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"MCPClient.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/MCPClient.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as jsonc from 'jsonc-parser';\nimport { getDefaultServerConfig } from './defaults';\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,\n type: 'sse' | 'streamable-http',\n selectedFeatures?: string[],\n local?: boolean,\n ) {\n return getDefaultServerConfig(apiKey, type, 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 return this._addServerType(apiKey, 'sse', selectedFeatures, local);\n }\n\n async _addServerType(\n apiKey: string,\n type: 'sse' | 'streamable-http',\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 type,\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"]}
1
+ {"version":3,"file":"MCPClient.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/MCPClient.ts"],"names":[],"mappings":"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","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,\n type: 'sse' | 'streamable-http',\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return getDefaultServerConfig(apiKey, type, 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 return this._addServerType(apiKey, 'sse', selectedFeatures, local);\n }\n\n async _addServerType(\n apiKey: string,\n type: 'sse' | 'streamable-http',\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 type,\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"]}
@@ -2,7 +2,7 @@ import { DefaultMCPClient } from '../MCPClient';
2
2
  import { DefaultMCPClientConfig } from '../defaults';
3
3
  import { z } from 'zod';
4
4
  export declare const ClaudeCodeMCPConfig: z.ZodObject<{
5
- mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
5
+ mcpServers: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodObject<{
6
6
  command: z.ZodOptional<z.ZodString>;
7
7
  args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
8
8
  env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
@@ -14,9 +14,18 @@ export declare const ClaudeCodeMCPConfig: z.ZodObject<{
14
14
  command?: string | undefined;
15
15
  args?: string[] | undefined;
16
16
  env?: Record<string, string> | undefined;
17
- }>>;
17
+ }>, z.ZodObject<{
18
+ url: z.ZodString;
19
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ url: string;
22
+ headers?: Record<string, string> | undefined;
23
+ }, {
24
+ url: string;
25
+ headers?: Record<string, string> | undefined;
26
+ }>]>>;
18
27
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
19
- mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
28
+ mcpServers: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodObject<{
20
29
  command: z.ZodOptional<z.ZodString>;
21
30
  args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
22
31
  env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
@@ -28,9 +37,18 @@ export declare const ClaudeCodeMCPConfig: z.ZodObject<{
28
37
  command?: string | undefined;
29
38
  args?: string[] | undefined;
30
39
  env?: Record<string, string> | undefined;
31
- }>>;
40
+ }>, z.ZodObject<{
41
+ url: z.ZodString;
42
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
43
+ }, "strip", z.ZodTypeAny, {
44
+ url: string;
45
+ headers?: Record<string, string> | undefined;
46
+ }, {
47
+ url: string;
48
+ headers?: Record<string, string> | undefined;
49
+ }>]>>;
32
50
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
33
- mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
51
+ mcpServers: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodObject<{
34
52
  command: z.ZodOptional<z.ZodString>;
35
53
  args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
36
54
  env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
@@ -42,7 +60,16 @@ export declare const ClaudeCodeMCPConfig: z.ZodObject<{
42
60
  command?: string | undefined;
43
61
  args?: string[] | undefined;
44
62
  env?: Record<string, string> | undefined;
45
- }>>;
63
+ }>, z.ZodObject<{
64
+ url: z.ZodString;
65
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
66
+ }, "strip", z.ZodTypeAny, {
67
+ url: string;
68
+ headers?: Record<string, string> | undefined;
69
+ }, {
70
+ url: string;
71
+ headers?: Record<string, string> | undefined;
72
+ }>]>>;
46
73
  }, z.ZodTypeAny, "passthrough">>;
47
74
  export type ClaudeCodeMCPConfig = z.infer<typeof DefaultMCPClientConfig>;
48
75
  export declare class ClaudeCodeMCPClient extends DefaultMCPClient {
@@ -56,7 +83,6 @@ export declare class ClaudeCodeMCPClient extends DefaultMCPClient {
56
83
  addServer(apiKey: string, selectedFeatures?: string[], local?: boolean): Promise<{
57
84
  success: boolean;
58
85
  }>;
59
- private buildClaudeCodeConfig;
60
86
  removeServer(local?: boolean): Promise<{
61
87
  success: boolean;
62
88
  }>;
@@ -129,11 +129,9 @@ class ClaudeCodeMCPClient extends MCPClient_1.DefaultMCPClient {
129
129
  if (!claudeBinary) {
130
130
  return Promise.resolve({ success: false });
131
131
  }
132
- // Build Claude Code-specific config
133
- // Based on getDefaultServerConfig() but with fixes for Claude Code bugs
134
- const config = this.buildClaudeCodeConfig(apiKey, selectedFeatures, local);
135
132
  const serverName = local ? 'posthog-local' : 'posthog';
136
- const command = `${claudeBinary} mcp add-json ${serverName} -s user '${JSON.stringify(config)}'`;
133
+ const url = (0, defaults_1.buildMCPUrl)('streamable-http', selectedFeatures, local);
134
+ const command = `${claudeBinary} mcp add --transport http ${serverName} ${url} --header "Authorization: Bearer ${apiKey}" -s user`;
137
135
  try {
138
136
  (0, child_process_1.execSync)(command);
139
137
  }
@@ -143,49 +141,6 @@ class ClaudeCodeMCPClient extends MCPClient_1.DefaultMCPClient {
143
141
  }
144
142
  return Promise.resolve({ success: true });
145
143
  }
146
- buildClaudeCodeConfig(apiKey, selectedFeatures, local) {
147
- // Replicate getDefaultServerConfig() logic but with Claude Code fixes:
148
- // 1. Add https:// protocol (mcp-remote requires valid URLs)
149
- // 2. Embed token directly in Authorization header (env var expansion broken)
150
- //
151
- // Claude Code bugs:
152
- // - https://github.com/anthropics/claude-code/issues/6204
153
- // - https://github.com/anthropics/claude-code/issues/9427
154
- // - https://github.com/anthropics/claude-code/issues/10955
155
- const protocol = local ? 'http://' : 'https://';
156
- const host = local ? 'localhost:8787' : 'mcp.posthog.com';
157
- const baseUrl = `${protocol}${host}/sse`;
158
- const ALL_FEATURE_VALUES = [
159
- 'dashboards',
160
- 'insights',
161
- 'experiments',
162
- 'llm-analytics',
163
- 'error-tracking',
164
- 'flags',
165
- 'workspace',
166
- 'docs',
167
- ];
168
- const isAllFeaturesSelected = selectedFeatures &&
169
- selectedFeatures.length === ALL_FEATURE_VALUES.length &&
170
- ALL_FEATURE_VALUES.every((feature) => selectedFeatures.includes(feature));
171
- const urlWithFeatures = selectedFeatures && selectedFeatures.length > 0 && !isAllFeaturesSelected
172
- ? `${baseUrl}?features=${selectedFeatures.join(',')}`
173
- : baseUrl;
174
- return {
175
- command: 'npx',
176
- args: [
177
- '-y',
178
- 'mcp-remote@latest',
179
- urlWithFeatures,
180
- '--header',
181
- `Authorization:Bearer ${apiKey}`, // Embed token directly (not ${VAR})
182
- ],
183
- // Keep env block for backward compatibility if bugs get fixed
184
- env: {
185
- POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,
186
- },
187
- };
188
- }
189
144
  removeServer(local) {
190
145
  const claudeBinary = this.findClaudeBinary();
191
146
  if (!claudeBinary) {
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/claude-code.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefaultMCPClient } from '../MCPClient';\nimport { DefaultMCPClientConfig } from '../defaults';\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 extends DefaultMCPClient {\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 try {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve(false);\n }\n\n // check if specific server name exists in output\n const output = execSync(`${claudeBinary} mcp list`, {\n stdio: 'pipe',\n });\n\n const outputStr = output.toString();\n const serverName = local ? 'posthog-local' : 'posthog';\n\n if (outputStr.includes(serverName)) {\n return Promise.resolve(true);\n }\n } catch {\n //\n }\n\n return Promise.resolve(false);\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 claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve({ success: false });\n }\n\n // Build Claude Code-specific config\n // Based on getDefaultServerConfig() but with fixes for Claude Code bugs\n const config = this.buildClaudeCodeConfig(apiKey, selectedFeatures, local);\n const serverName = local ? 'posthog-local' : 'posthog';\n\n const command = `${claudeBinary} mcp add-json ${serverName} -s user '${JSON.stringify(\n config,\n )}'`;\n\n try {\n execSync(command);\n } catch (error) {\n analytics.captureException(\n new Error(\n `Failed to add server to 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 private buildClaudeCodeConfig(\n apiKey: string,\n selectedFeatures?: string[],\n local?: boolean,\n ) {\n // Replicate getDefaultServerConfig() logic but with Claude Code fixes:\n // 1. Add https:// protocol (mcp-remote requires valid URLs)\n // 2. Embed token directly in Authorization header (env var expansion broken)\n //\n // Claude Code bugs:\n // - https://github.com/anthropics/claude-code/issues/6204\n // - https://github.com/anthropics/claude-code/issues/9427\n // - https://github.com/anthropics/claude-code/issues/10955\n\n const protocol = local ? 'http://' : 'https://';\n const host = local ? 'localhost:8787' : 'mcp.posthog.com';\n const baseUrl = `${protocol}${host}/sse`;\n\n const ALL_FEATURE_VALUES = [\n 'dashboards',\n 'insights',\n 'experiments',\n 'llm-analytics',\n 'error-tracking',\n 'flags',\n 'workspace',\n 'docs',\n ];\n\n const isAllFeaturesSelected =\n selectedFeatures &&\n selectedFeatures.length === ALL_FEATURE_VALUES.length &&\n ALL_FEATURE_VALUES.every((feature) => selectedFeatures.includes(feature));\n\n const urlWithFeatures =\n selectedFeatures && selectedFeatures.length > 0 && !isAllFeaturesSelected\n ? `${baseUrl}?features=${selectedFeatures.join(',')}`\n : baseUrl;\n\n return {\n command: 'npx',\n args: [\n '-y',\n 'mcp-remote@latest',\n urlWithFeatures,\n '--header',\n `Authorization:Bearer ${apiKey}`, // Embed token directly (not ${VAR})\n ],\n // Keep env block for backward compatibility if bugs get fixed\n env: {\n POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,\n },\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"]}
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/claude-code.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefaultMCPClient } from '../MCPClient';\nimport { buildMCPUrl, DefaultMCPClientConfig } from '../defaults';\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 extends DefaultMCPClient {\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 try {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve(false);\n }\n\n // check if specific server name exists in output\n const output = execSync(`${claudeBinary} mcp list`, {\n stdio: 'pipe',\n });\n\n const outputStr = output.toString();\n const serverName = local ? 'posthog-local' : 'posthog';\n\n if (outputStr.includes(serverName)) {\n return Promise.resolve(true);\n }\n } catch {\n //\n }\n\n return Promise.resolve(false);\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 claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve({ success: false });\n }\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const url = buildMCPUrl('streamable-http', selectedFeatures, local);\n\n const command = `${claudeBinary} mcp add --transport http ${serverName} ${url} --header \"Authorization: Bearer ${apiKey}\" -s user`;\n\n try {\n execSync(command);\n } catch (error) {\n analytics.captureException(\n new Error(\n `Failed to add server to 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 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"]}