@posthog/wizard 1.18.0 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Shared agent interface for PostHog wizards
|
|
3
3
|
* Provides common agent initialization and event handling
|
|
4
4
|
*/
|
|
5
|
-
import { Agent } from '@posthog/agent';
|
|
6
5
|
import clack from '../utils/clack';
|
|
7
6
|
import type { WizardOptions } from '../utils/types';
|
|
7
|
+
type Agent = any;
|
|
8
8
|
export type AgentConfig = {
|
|
9
9
|
workingDirectory: string;
|
|
10
10
|
posthogMcpUrl: string;
|
|
@@ -14,7 +14,7 @@ export type AgentConfig = {
|
|
|
14
14
|
/**
|
|
15
15
|
* Initialize a PostHog Agent instance with the provided configuration
|
|
16
16
|
*/
|
|
17
|
-
export declare function initializeAgent(config: AgentConfig, options: WizardOptions, spinner: ReturnType<typeof clack.spinner>): Agent
|
|
17
|
+
export declare function initializeAgent(config: AgentConfig, options: WizardOptions, spinner: ReturnType<typeof clack.spinner>): Promise<Agent>;
|
|
18
18
|
/**
|
|
19
19
|
* Execute an agent with the provided prompt and options
|
|
20
20
|
* Handles the full lifecycle: spinner, execution, error handling
|
|
@@ -25,3 +25,4 @@ export declare function runAgent(agent: Agent, prompt: string, options: WizardOp
|
|
|
25
25
|
successMessage?: string;
|
|
26
26
|
errorMessage?: string;
|
|
27
27
|
}): Promise<void>;
|
|
28
|
+
export {};
|
|
@@ -9,12 +9,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.initializeAgent = initializeAgent;
|
|
11
11
|
exports.runAgent = runAgent;
|
|
12
|
-
// @ts-ignore - posthog-agent is ESM, wizard is CommonJS. Works at runtime via local link.
|
|
13
|
-
const agent_1 = require("@posthog/agent");
|
|
14
12
|
const clack_1 = __importDefault(require("../utils/clack"));
|
|
15
13
|
const debug_1 = require("../utils/debug");
|
|
16
14
|
const analytics_1 = require("../utils/analytics");
|
|
17
15
|
const constants_1 = require("./constants");
|
|
16
|
+
let _agentModule = null;
|
|
17
|
+
async function getAgentModule() {
|
|
18
|
+
if (!_agentModule) {
|
|
19
|
+
_agentModule = await import('@posthog/agent');
|
|
20
|
+
}
|
|
21
|
+
return _agentModule;
|
|
22
|
+
}
|
|
18
23
|
// TODO: Remove these if/when posthog/agent exports an enum for events
|
|
19
24
|
const EventType = {
|
|
20
25
|
RAW_SDK_EVENT: 'raw_sdk_event',
|
|
@@ -27,9 +32,10 @@ const EventType = {
|
|
|
27
32
|
/**
|
|
28
33
|
* Initialize a PostHog Agent instance with the provided configuration
|
|
29
34
|
*/
|
|
30
|
-
function initializeAgent(config, options, spinner) {
|
|
35
|
+
async function initializeAgent(config, options, spinner) {
|
|
31
36
|
clack_1.default.log.step('Initializing PostHog agent...');
|
|
32
37
|
try {
|
|
38
|
+
const { Agent } = await getAgentModule();
|
|
33
39
|
const agentConfig = {
|
|
34
40
|
workingDirectory: config.workingDirectory,
|
|
35
41
|
posthogMcpUrl: config.posthogMcpUrl,
|
|
@@ -46,7 +52,7 @@ function initializeAgent(config, options, spinner) {
|
|
|
46
52
|
posthogApiKeyPresent: !!agentConfig.posthogApiKey,
|
|
47
53
|
});
|
|
48
54
|
}
|
|
49
|
-
const agent = new
|
|
55
|
+
const agent = new Agent(agentConfig);
|
|
50
56
|
clack_1.default.log.success("Agent initialized. Let's get cooking!");
|
|
51
57
|
return agent;
|
|
52
58
|
}
|
|
@@ -142,12 +148,13 @@ function handleAgentEvent(event, options, spinner) {
|
|
|
142
148
|
*/
|
|
143
149
|
async function runAgent(agent, prompt, options, spinner, config) {
|
|
144
150
|
const { estimatedDurationMinutes = 8, spinnerMessage = 'Customizing your PostHog setup...', successMessage = 'PostHog integration complete', errorMessage = 'Integration failed', } = config ?? {};
|
|
151
|
+
const { PermissionMode } = await getAgentModule();
|
|
145
152
|
clack_1.default.log.step(`This whole process should take about ${estimatedDurationMinutes} minutes including error checking and fixes.\n\nGrab some coffee!`);
|
|
146
153
|
spinner.start(spinnerMessage);
|
|
147
154
|
try {
|
|
148
155
|
await agent.run(prompt, {
|
|
149
156
|
repositoryPath: options.installDir,
|
|
150
|
-
permissionMode:
|
|
157
|
+
permissionMode: PermissionMode.ACCEPT_EDITS,
|
|
151
158
|
});
|
|
152
159
|
spinner.stop(successMessage);
|
|
153
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-interface.js","sourceRoot":"","sources":["../../../src/lib/agent-interface.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AA8BH,0CAkCC;AAoGD,4BAqCC;AAvMD,0FAA0F;AAC1F,0CAAwE;AACxE,2DAAmC;AACnC,0CAAuC;AAEvC,kDAA+C;AAC/C,2CAA4D;AAE5D,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;AASX;;GAEG;AACH,SAAgB,eAAe,CAC7B,MAAmB,EACnB,OAAsB,EACtB,OAAyC;IAEzC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,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,aAAK,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,EAAE,CAAC;gBAC3C,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,MAAM,CAAC;yBAC7C,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,WAAW,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBACjE,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;;;GAGG;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;IAEjB,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,wCAAwC,wBAAwB,mEAAmE,CACpI,CAAC;IAEF,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;YACtB,cAAc,EAAE,OAAO,CAAC,UAAU;YAClC,cAAc,EAAE,sBAAc,CAAC,YAAY;SAC5C,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/B,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","sourcesContent":["/**\n * Shared agent interface for PostHog wizards\n * Provides common agent initialization and event handling\n */\n\n// @ts-ignore - posthog-agent is ESM, wizard is CommonJS. Works at runtime via local link.\nimport { Agent, PermissionMode, type AgentEvent } from '@posthog/agent';\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\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\nexport type AgentConfig = {\n workingDirectory: string;\n posthogMcpUrl: string;\n posthogApiKey: string;\n debug?: boolean;\n};\n\n/**\n * Initialize a PostHog Agent instance with the provided configuration\n */\nexport function initializeAgent(\n config: AgentConfig,\n options: WizardOptions,\n spinner: ReturnType<typeof clack.spinner>,\n): Agent {\n clack.log.step('Initializing PostHog agent...');\n\n try {\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 === '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 === 'text')\n .map((block: any) => block.text)\n .join('\\n');\n\n // Check if the text contains a [STATUS] marker\n const statusMatch = textContent.match(/^.*\\[STATUS\\]\\s*(.+?)$/m);\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 */\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<void> {\n const {\n estimatedDurationMinutes = 8,\n spinnerMessage = 'Customizing your PostHog setup...',\n successMessage = 'PostHog integration complete',\n errorMessage = 'Integration failed',\n } = config ?? {};\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 await agent.run(prompt, {\n repositoryPath: options.installDir,\n permissionMode: PermissionMode.ACCEPT_EDITS,\n });\n spinner.stop(successMessage);\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"]}
|
|
1
|
+
{"version":3,"file":"agent-interface.js","sourceRoot":"","sources":["../../../src/lib/agent-interface.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAyCH,0CAoCC;AAoGD,4BAsCC;AArND,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;AASX;;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,EAAE,CAAC;gBAC3C,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,MAAM,CAAC;yBAC7C,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,WAAW,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBACjE,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;;;GAGG;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,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;YACtB,cAAc,EAAE,OAAO,CAAC,UAAU;YAClC,cAAc,EAAE,cAAc,CAAC,YAAY;SAC5C,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/B,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","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\nexport type AgentConfig = {\n workingDirectory: string;\n posthogMcpUrl: string;\n posthogApiKey: string;\n debug?: boolean;\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 === '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 === 'text')\n .map((block: any) => block.text)\n .join('\\n');\n\n // Check if the text contains a [STATUS] marker\n const statusMatch = textContent.match(/^.*\\[STATUS\\]\\s*(.+?)$/m);\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 */\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<void> {\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 await agent.run(prompt, {\n repositoryPath: options.installDir,\n permissionMode: PermissionMode.ACCEPT_EDITS,\n });\n spinner.stop(successMessage);\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"]}
|
|
@@ -49,7 +49,7 @@ async function runNextjsWizardAgent(options) {
|
|
|
49
49
|
const router = await (0, utils_1.getNextJsRouter)(options);
|
|
50
50
|
const routerType = router === utils_1.NextJsRouter.APP_ROUTER ? 'app' : 'pages';
|
|
51
51
|
const spinner = clack_1.default.spinner();
|
|
52
|
-
const agent = (0, agent_interface_1.initializeAgent)({
|
|
52
|
+
const agent = await (0, agent_interface_1.initializeAgent)({
|
|
53
53
|
workingDirectory: options.installDir,
|
|
54
54
|
posthogMcpUrl: 'https://mcp.posthog.com/mcp',
|
|
55
55
|
posthogApiKey: accessToken,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs-wizard-agent.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard-agent.ts"],"names":[],"mappings":";;;;;AA+BA,oDAqJC;AApLD,oEAAoE;AACpE,sDAS8B;AAC9B,wDAA0D;AAC1D,mCAAgF;AAChF,2DAAmC;AACnC,gDAA8E;AAC9E,kDAA+C;AAE/C,sDAAyD;AACzD,wCAAsD;AACtD,kDAA0B;AAC1B,oCAIkB;AAClB,0CAAiD;AACjD,4DAAmE;AAEnE;;GAEG;AACI,KAAK,UAAU,oBAAoB,CACxC,OAAsB;IAEtB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAA,uBAAe,GAAE,CAAC;IACpB,CAAC;IAED,IAAA,0BAAY,EAAC;QACX,UAAU,EAAE,wCAAwC;KACrD,CAAC,CAAC;IAEH,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,2KAA2K,CAC5K,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAe,EAAC,OAAO,CAAC,CAAC;IAEjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAA,mBAAK,EACT,wKAAwK,EACxK,CAAC,CACF,CAAC;IACJ,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,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;IACrD,MAAM,IAAA,sCAAwB,EAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3D,qBAAS,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAA,8BAAsB,EAAC,WAAW,CAAC,CAAC,CAAC;IAExE,qBAAS,CAAC,OAAO,CAAC,yCAA6B,EAAE;QAC/C,MAAM,EAAE,2BAA2B;KACpC,CAAC,CAAC;IAEH,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,oCAAsB,EAAC;QACxE,GAAG,OAAO;QACV,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAe,EAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,KAAK,oBAAY,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IAExE,MAAM,OAAO,GAAG,eAAK,CAAC,OAAO,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAG,IAAA,iCAAe,EAC3B;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,iBAAiB,GAAG,sBAAsB,CAAC;QAC/C,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,WAAW,IAAI,QAAQ;QAChC,MAAM,EAAE,UAAU;QAClB,UAAU,EAAE,kBAAkB;QAC9B,aAAa;QACb,IAAI;KACL,CAAC,CAAC;IAEH,MAAM,IAAA,0BAAQ,EAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE;QACzD,wBAAwB,EAAE,CAAC;QAC3B,cAAc,EACZ,mEAAmE;QACrE,cAAc,EAAE,8BAA8B;QAC9C,YAAY,EAAE,oBAAoB;KACnC,CAAC,CAAC;IAEH,MAAM,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,GAC9C,MAAM,IAAA,2CAAmC,EAAC;QACxC,SAAS,EAAE;YACT,uBAAuB,EAAE,aAAa;YACtC,wBAAwB,EAAE,IAAI;SAC/B;QACD,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,uBAAW,CAAC,MAAM;KAChC,CAAC,CAAC;IAEL,MAAM,eAAe,GAAG,MAAM,IAAA,sCAA8B,EAC1D;QACE,uBAAuB,EAAE,aAAa;QACtC,wBAAwB,EAAE,IAAI;KAC/B,EACD;QACE,WAAW,EAAE,uBAAW,CAAC,MAAM;QAC/B,OAAO;KACR,CACF,CAAC;IAEF,MAAM,IAAA,iCAAyB,EAAC;QAC9B,WAAW;QACX,WAAW,EAAE,uBAAW,CAAC,MAAM;KAChC,CAAC,CAAC;IAEH,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,iBAAiB;YACf,CAAC,CAAC,sCAAsC,mBAAmB,OAAO;YAClE,CAAC,CAAC,EAAE;QACN,eAAe,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,wDAAwD;YAC1D,CAAC,CAAC,EAAE;KACP,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,MAAM,SAAS,GAAG;QAChB,eAAe,CAAC,MAAM,KAAK,CAAC;YAC1B,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;6CACU,UAAU;;;EAGrD,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;;;EAG3B,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;sCAEX,eAAK,CAAC,IAAI,CAC5C,4CAA4C,CAC7C;EACD,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,SAAS,sBAAsB,CAAC,OAO/B;IACC,OAAO,mHACL,OAAO,CAAC,SACV;;;eAGa,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO;YACvC,OAAO,CAAC,MAAM;gBACV,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;qBAC5B,OAAO,CAAC,aAAa;kBACxB,OAAO,CAAC,IAAI;;;;;;;CAO7B,CAAC;AACF,CAAC","sourcesContent":["/* Simplified Next.js wizard using posthog-agent with PostHog MCP */\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion } from '../utils/package-json';\nimport { getNextJsRouter, getNextJsVersionBucket, NextJsRouter } from './utils';\nimport clack from '../utils/clack';\nimport { Integration, WIZARD_INTERACTION_EVENT_NAME } from '../lib/constants';\nimport { analytics } from '../utils/analytics';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { getCloudUrlFromRegion } from '../utils/urls';\nimport chalk from 'chalk';\nimport {\n addOrUpdateEnvironmentVariablesStep,\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\nimport { enableDebugLogs } from '../utils/debug';\nimport { initializeAgent, runAgent } from '../lib/agent-interface';\n\n/**\n * Simplified Next.js wizard that delegates to PostHog MCP's /integrate command\n */\nexport async function runNextjsWizardAgent(\n options: WizardOptions,\n): Promise<void> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n printWelcome({\n wizardName: 'PostHog Next.js wizard (agent-powered)',\n });\n\n clack.log.info(\n '🧙 The wizard has chosen you to try the next-generation agent integration for Next.js.\\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\n if (!aiConsent) {\n await abort(\n 'This wizard uses an LLM agent to intelligently modify your project. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n analytics.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n });\n\n const { projectApiKey, host, accessToken } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n const router = await getNextJsRouter(options);\n const routerType = router === NextJsRouter.APP_ROUTER ? 'app' : 'pages';\n\n const spinner = clack.spinner();\n\n const agent = 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 integrationPrompt = buildIntegrationPrompt({\n framework: 'Next.js',\n version: nextVersion || 'latest',\n router: routerType,\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n });\n\n await runAgent(agent, integrationPrompt, options, spinner, {\n estimatedDurationMinutes: 8,\n spinnerMessage:\n 'Writing your PostHog setup with events, error capture and more...',\n successMessage: 'PostHog integration complete',\n errorMessage: 'Integration failed',\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n {\n integration: Integration.nextjs,\n options,\n },\n );\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.nextjs,\n });\n\n const continueUrl = options.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n addedEnvVariables\n ? `Added your Project API key to your ${relativeEnvFilePath} file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded your Project API key to your hosting provider`\n : '',\n ].filter(Boolean);\n\n const nextSteps = [\n uploadedEnvVars.length === 0\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• Analyzed your Next.js project structure (${routerType} router)\n• Created and configured PostHog initializers\n• Integrated PostHog into your application\n${changes.map((change) => `• ${change}`).join('\\n')}\n\n${chalk.yellow('Next steps:')}\n• Start your development server to see PostHog in action\n• Visit your PostHog dashboard to see incoming events\n${nextSteps.map((step) => `• ${step}`).join('\\n')}\n\nLearn more about PostHog + Next.js: ${chalk.cyan(\n 'https://posthog.com/docs/libraries/next-js',\n )}\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\nfunction buildIntegrationPrompt(context: {\n framework: string;\n version: string;\n router: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n}): string {\n return `You have access to the PostHog MCP server which provides an integration resource to integrate PostHog into this ${\n context.framework\n } project.\n\nProject context:\n- Framework: ${context.framework} ${context.version}\n- Router: ${context.router}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog API Key: ${context.projectApiKey}\n- PostHog Host: ${context.host}\n\nInstructions:\n1. Call the PostHog MCP's resource for setup: posthog://integration/workflow/setup/begin\n2. Follow all instructions provided\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`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"nextjs-wizard-agent.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Simplified Next.js wizard using posthog-agent with PostHog MCP */\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion } from '../utils/package-json';\nimport { getNextJsRouter, getNextJsVersionBucket, NextJsRouter } from './utils';\nimport clack from '../utils/clack';\nimport { Integration, WIZARD_INTERACTION_EVENT_NAME } from '../lib/constants';\nimport { analytics } from '../utils/analytics';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { getCloudUrlFromRegion } from '../utils/urls';\nimport chalk from 'chalk';\nimport {\n addOrUpdateEnvironmentVariablesStep,\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\nimport { enableDebugLogs } from '../utils/debug';\nimport { initializeAgent, runAgent } from '../lib/agent-interface';\n\n/**\n * Simplified Next.js wizard that delegates to PostHog MCP's /integrate command\n */\nexport async function runNextjsWizardAgent(\n options: WizardOptions,\n): Promise<void> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n printWelcome({\n wizardName: 'PostHog Next.js wizard (agent-powered)',\n });\n\n clack.log.info(\n '🧙 The wizard has chosen you to try the next-generation agent integration for Next.js.\\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\n if (!aiConsent) {\n await abort(\n 'This wizard uses an LLM agent to intelligently modify your project. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n analytics.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n });\n\n const { projectApiKey, host, accessToken } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n const router = await getNextJsRouter(options);\n const routerType = router === NextJsRouter.APP_ROUTER ? 'app' : 'pages';\n\n const spinner = clack.spinner();\n\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 integrationPrompt = buildIntegrationPrompt({\n framework: 'Next.js',\n version: nextVersion || 'latest',\n router: routerType,\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n });\n\n await runAgent(agent, integrationPrompt, options, spinner, {\n estimatedDurationMinutes: 8,\n spinnerMessage:\n 'Writing your PostHog setup with events, error capture and more...',\n successMessage: 'PostHog integration complete',\n errorMessage: 'Integration failed',\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n {\n integration: Integration.nextjs,\n options,\n },\n );\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.nextjs,\n });\n\n const continueUrl = options.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n addedEnvVariables\n ? `Added your Project API key to your ${relativeEnvFilePath} file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded your Project API key to your hosting provider`\n : '',\n ].filter(Boolean);\n\n const nextSteps = [\n uploadedEnvVars.length === 0\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• Analyzed your Next.js project structure (${routerType} router)\n• Created and configured PostHog initializers\n• Integrated PostHog into your application\n${changes.map((change) => `• ${change}`).join('\\n')}\n\n${chalk.yellow('Next steps:')}\n• Start your development server to see PostHog in action\n• Visit your PostHog dashboard to see incoming events\n${nextSteps.map((step) => `• ${step}`).join('\\n')}\n\nLearn more about PostHog + Next.js: ${chalk.cyan(\n 'https://posthog.com/docs/libraries/next-js',\n )}\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\nfunction buildIntegrationPrompt(context: {\n framework: string;\n version: string;\n router: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n}): string {\n return `You have access to the PostHog MCP server which provides an integration resource to integrate PostHog into this ${\n context.framework\n } project.\n\nProject context:\n- Framework: ${context.framework} ${context.version}\n- Router: ${context.router}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog API Key: ${context.projectApiKey}\n- PostHog Host: ${context.host}\n\nInstructions:\n1. Call the PostHog MCP's resource for setup: posthog://integration/workflow/setup/begin\n2. Follow all instructions provided\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`;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@posthog/wizard",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"homepage": "https://github.com/
|
|
5
|
-
"repository": "https://github.com/
|
|
3
|
+
"version": "1.19.0",
|
|
4
|
+
"homepage": "https://github.com/PostHog/wizard",
|
|
5
|
+
"repository": "https://github.com/PostHog/wizard",
|
|
6
6
|
"description": "The PostHog wizard helps you to configure your project",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"posthog",
|
|
@@ -127,14 +127,15 @@
|
|
|
127
127
|
"license": "MIT",
|
|
128
128
|
"volta": {
|
|
129
129
|
"node": "20.18.2",
|
|
130
|
-
"pnpm": "
|
|
130
|
+
"pnpm": "10.23.0"
|
|
131
131
|
},
|
|
132
132
|
"scripts": {
|
|
133
133
|
"clean": "rm -rf ./dist",
|
|
134
134
|
"prebuild": "pnpm clean",
|
|
135
135
|
"build:watch": "pnpm tsc -w",
|
|
136
136
|
"build": "pnpm tsc",
|
|
137
|
-
"postbuild": "chmod +x ./dist/bin.js && cp -r scripts/** dist && cp -r src/utils/rules dist/src/utils",
|
|
137
|
+
"postbuild": "chmod +x ./dist/bin.js && cp -r scripts/** dist && cp -r src/utils/rules dist/src/utils && pnpm test:smoke",
|
|
138
|
+
"test:smoke": "node -e \"require('./dist/bin.js')\" 2>&1 | head -5 | grep -q 'PostHog Wizard' || (echo 'Smoke test failed: compiled binary crashed on load' && exit 1)",
|
|
138
139
|
"lint": "pnpm lint:prettier && pnpm lint:eslint",
|
|
139
140
|
"lint:prettier": "prettier --check \"{lib,src,test}/**/*.ts\"",
|
|
140
141
|
"lint:eslint": "eslint . --cache --format stylish",
|