@posthog/wizard 2.30.0 → 2.32.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.
- package/README.md +35 -1
- package/dist/README.md +33 -0
- package/dist/{add-mcp-server-to-clients-D0G4cmPf.js → add-mcp-server-to-clients-Dc0yssCM.js} +4 -4
- package/dist/{add-mcp-server-to-clients-D0G4cmPf.js.map → add-mcp-server-to-clients-Dc0yssCM.js.map} +1 -1
- package/dist/{agent-interface-CYFyWCMj.js → agent-interface-c7B2JZEd.js} +483 -416
- package/dist/agent-interface-c7B2JZEd.js.map +1 -0
- package/dist/{agent-runner-HTfFCUrR.js → agent-runner-Am34bBUT.js} +39 -23
- package/dist/agent-runner-Am34bBUT.js.map +1 -0
- package/dist/{analytics-CdT0VV8s.js → analytics-CBIKy9PZ.js} +14 -6
- package/dist/analytics-CBIKy9PZ.js.map +1 -0
- package/dist/{api-D9CerM6x.js → api-Blg3nvvZ.js} +3 -3
- package/dist/{api-D9CerM6x.js.map → api-Blg3nvvZ.js.map} +1 -1
- package/dist/bin.js +103 -53
- package/dist/bin.js.map +1 -1
- package/dist/{ci-install-CTydrjHu.js → ci-install-51ntd9x5.js} +4 -4
- package/dist/{ci-install-CTydrjHu.js.map → ci-install-51ntd9x5.js.map} +1 -1
- package/dist/{debug-D9giWww2.js → debug-AdvgwKEw.js} +9 -10
- package/dist/debug-AdvgwKEw.js.map +1 -0
- package/dist/{debug-Bmq9KH4W.js → debug-cy_jyRb4.js} +1 -1
- package/dist/{environment-C6j-a4Gz.js → environment-B6TW5v9d.js} +3 -3
- package/dist/{environment-C6j-a4Gz.js.map → environment-B6TW5v9d.js.map} +1 -1
- package/dist/{file-utils-BiElGS_N.js → file-utils-8tUk_eEX.js} +2 -2
- package/dist/{file-utils-BiElGS_N.js.map → file-utils-8tUk_eEX.js.map} +1 -1
- package/dist/{interactive-C0Vssetd.js → interactive-CApktTrj.js} +2 -2
- package/dist/{interactive-C0Vssetd.js.map → interactive-CApktTrj.js.map} +1 -1
- package/dist/{mcp-prompt-streaming-DQXxG2Pg.js → mcp-prompt-streaming-BKcU9yuz.js} +4 -4
- package/dist/{mcp-prompt-streaming-DQXxG2Pg.js.map → mcp-prompt-streaming-BKcU9yuz.js.map} +1 -1
- package/dist/{non-interactive-DX-N3ZEb.js → non-interactive-DejTdRTW.js} +2 -2
- package/dist/{non-interactive-DX-N3ZEb.js.map → non-interactive-DejTdRTW.js.map} +1 -1
- package/dist/{package-manager-cIPAT7g3.js → package-manager-DBfgSXNn.js} +2 -2
- package/dist/{package-manager-cIPAT7g3.js.map → package-manager-DBfgSXNn.js.map} +1 -1
- package/dist/{playground-DQI2vpr0.js → playground-BOg2U1AT.js} +4 -4
- package/dist/{playground-DQI2vpr0.js.map → playground-BOg2U1AT.js.map} +1 -1
- package/dist/{posthog-integration-EUokB9U1.js → posthog-integration-gLhOUdPJ.js} +13 -14
- package/dist/{posthog-integration-EUokB9U1.js.map → posthog-integration-gLhOUdPJ.js.map} +1 -1
- package/dist/{provisioning-BCCeBATw.js → provisioning-DuzclqPB.js} +3 -3
- package/dist/{provisioning-BCCeBATw.js.map → provisioning-DuzclqPB.js.map} +1 -1
- package/dist/{registry-DCxIW2G5.js → registry-Dbl-5SnO.js} +4 -4
- package/dist/{registry-DCxIW2G5.js.map → registry-Dbl-5SnO.js.map} +1 -1
- package/dist/{setup-utils-DmX3o2bT.js → setup-utils-B6wbp3s0.js} +8 -8
- package/dist/{setup-utils-DmX3o2bT.js.map → setup-utils-B6wbp3s0.js.map} +1 -1
- package/dist/{start-tui-B9dCp0hW.js → start-tui-IoQh-Nhj.js} +13 -13
- package/dist/{start-tui-B9dCp0hW.js.map → start-tui-IoQh-Nhj.js.map} +1 -1
- package/dist/{steps-3XbXMf0T.js → steps-CJrqlHbo.js} +7 -7
- package/dist/{steps-3XbXMf0T.js.map → steps-CJrqlHbo.js.map} +1 -1
- package/dist/{telemetry-GFq8wmz0.js → telemetry-1m0CyTry.js} +3 -3
- package/dist/{telemetry-GFq8wmz0.js.map → telemetry-1m0CyTry.js.map} +1 -1
- package/dist/{terminal-oI1dOWQI.js → terminal-BKI4i72f.js} +9 -9
- package/dist/{terminal-oI1dOWQI.js.map → terminal-BKI4i72f.js.map} +1 -1
- package/dist/{urls-93eQ-Rd0.js → urls-B3JumpLT.js} +2 -2
- package/dist/{urls-93eQ-Rd0.js.map → urls-B3JumpLT.js.map} +1 -1
- package/dist/{wizard-abort-dmkJqxAb.js → wizard-abort-D7SzKUgE.js} +1 -1
- package/dist/{wizard-abort-BehJBPpy.js → wizard-abort-PqLMKSh1.js} +3 -3
- package/dist/{wizard-abort-BehJBPpy.js.map → wizard-abort-PqLMKSh1.js.map} +1 -1
- package/package.json +16 -52
- package/dist/agent-interface-CYFyWCMj.js.map +0 -1
- package/dist/agent-runner-HTfFCUrR.js.map +0 -1
- package/dist/analytics-CdT0VV8s.js.map +0 -1
- package/dist/debug-D9giWww2.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-D9CerM6x.js","names":[],"sources":["../src/lib/api.ts"],"sourcesContent":["import axios, { AxiosError } from 'axios';\nimport { z } from 'zod';\nimport { analytics } from '@utils/analytics';\nimport { WIZARD_USER_AGENT } from './constants';\n\n/**\n * User payload from `/api/users/@me/`. Schema typed for the fields the\n * wizard actually reads + passthrough on everything else so the full\n * upstream response rides through to the session for downstream features\n * (account-aware copy, plan-gated flows, org/team metadata, etc.).\n *\n * Top-level uses `.passthrough()` so unknown fields aren't stripped;\n * the few nested objects we care about (team, organization,\n * organizations[]) do the same so their additional fields survive too.\n *\n * Keep `distinct_id` required — analytics depends on it. Everything\n * else added here is nullish so partial responses don't fail parsing.\n */\nexport const ApiUserSchema = z\n .object({\n // Identifiers\n distinct_id: z.string(),\n uuid: z.string().nullish(),\n id: z.number().nullish(),\n\n // Profile\n email: z.string().nullish(),\n first_name: z.string().nullish(),\n last_name: z.string().nullish(),\n date_joined: z.string().nullish(),\n is_email_verified: z.boolean().nullish(),\n is_2fa_enabled: z.boolean().nullish(),\n is_staff: z.boolean().nullish(),\n\n // Preferences\n theme_mode: z.string().nullish(),\n toolbar_mode: z.string().nullish(),\n hide_mcp_hints: z.boolean().nullish(),\n\n // Optional / nullable on the backend — pre-onboarding signup paths\n // return null and older accounts may not have it set. Treat as a\n // hint, never a guarantee.\n role_at_organization: z.string().nullish(),\n\n // Current team + organization (objects from the API, kept typed on\n // the fields the wizard uses; passthrough preserves the rest).\n team: z\n .object({\n id: z.number(),\n uuid: z.string().nullish(),\n organization: z.string().uuid(),\n api_token: z.string().nullish(),\n project_id: z.number().nullish(),\n name: z.string().nullish(),\n timezone: z.string().nullish(),\n })\n .passthrough(),\n organization: z\n .object({\n id: z.string().uuid(),\n name: z.string().nullish(),\n slug: z.string().nullish(),\n membership_level: z.number().nullish(),\n customer_id: z.string().nullish(),\n // Org-level AI consent gate. Signals drops all findings while\n // this is not true. Null on older orgs (pre-2026-05 default\n // flip) — treat null as \"unknown\", not \"off\".\n is_ai_data_processing_approved: z.boolean().nullish(),\n })\n .passthrough(),\n organizations: z.array(\n z\n .object({\n id: z.string().uuid(),\n name: z.string().nullish(),\n membership_level: z.number().nullish(),\n })\n .passthrough(),\n ),\n })\n .passthrough();\n\n/**\n * Single activity log entry the wizard cares about. The PostHog endpoint\n * returns much more — schema kept minimal so changes upstream don't break us.\n *\n * @unused — no current caller after the Phase 6 streaming-agent pivot\n * dropped activity_log polling. Deliberately retained: this is a thin,\n * well-typed wrapper around a stable PostHog endpoint, and we're likely\n * to want it again for a future feature (e.g. \"what changed in your\n * project recently\"). Re-deriving the schema is more work than letting\n * it sit dormant.\n */\nexport const ActivityLogEntrySchema = z\n .object({\n scope: z.string().nullish(),\n activity: z.string().nullish(),\n created_at: z.string().nullish(),\n })\n .passthrough();\n\n/** @unused — see ActivityLogEntrySchema. */\nexport const ActivityLogResponseSchema = z.object({\n results: z.array(ActivityLogEntrySchema),\n});\n\n/** @unused — see ActivityLogEntrySchema. */\nexport type ActivityLogEntry = z.infer<typeof ActivityLogEntrySchema>;\n\nexport const ApiProjectSchema = z.object({\n id: z.number(),\n uuid: z.string().uuid(),\n organization: z.string().uuid(),\n api_token: z.string(),\n name: z.string(),\n // Product opt-ins (TeamSerializer-compat fields on /api/projects/:id).\n // Project-level truth for \"is this product enabled\" — a product can be\n // instrumented from another repo or the snippet, so these settings\n // override repo-local evidence. Null/absent = unknown. Only the\n // opt-ins a signals decision consumes: replay + exception autocapture\n // feed signal-source choices; surveys feeds the surveys-scout tuning.\n session_recording_opt_in: z.boolean().nullish(),\n autocapture_exceptions_opt_in: z.boolean().nullish(),\n surveys_opt_in: z.boolean().nullish(),\n});\n\nexport type ApiUser = z.infer<typeof ApiUserSchema>;\nexport type ApiProject = z.infer<typeof ApiProjectSchema>;\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly endpoint?: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport async function fetchUserData(\n accessToken: string,\n baseUrl: string,\n): Promise<ApiUser> {\n try {\n const response = await axios.get(`${baseUrl}/api/users/@me/`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n });\n\n return ApiUserSchema.parse(response.data);\n } catch (error) {\n const apiError = handleApiError(error, 'fetch user data');\n analytics.captureException(apiError, {\n endpoint: '/api/users/@me/',\n baseUrl,\n });\n throw apiError;\n }\n}\n\n/**\n * Best-effort fetch of recent activity log entries. Returns [] on any error\n * so callers can treat absence of results as \"haven't detected anything yet\"\n * rather than a hard failure.\n *\n * @unused — no current caller after the Phase 6 streaming-agent pivot\n * dropped activity_log polling from McpSuggestedPromptsScreen.\n * Deliberately retained for future features that want a soft signal of\n * recent project changes (e.g. dashboards, audit summaries). See the\n * ActivityLogEntrySchema doc comment for the keep-vs-delete rationale.\n */\nexport async function fetchRecentActivity(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n since: Date,\n): Promise<ActivityLogEntry[]> {\n try {\n const response = await axios.get(\n `${baseUrl}/api/projects/${projectId}/activity_log/`,\n {\n params: { limit: 10 },\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n // Short timeout — best-effort probe, not a critical path.\n timeout: 4000,\n },\n );\n const parsed = ActivityLogResponseSchema.safeParse(response.data);\n if (!parsed.success) return [];\n const sinceMs = since.getTime();\n return parsed.data.results.filter((entry) => {\n if (!entry.created_at) return false;\n const t = Date.parse(entry.created_at);\n return Number.isFinite(t) && t >= sinceMs;\n });\n } catch {\n return [];\n }\n}\n\nexport async function fetchProjectData(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n): Promise<ApiProject> {\n try {\n const response = await axios.get(`${baseUrl}/api/projects/${projectId}/`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n });\n\n return ApiProjectSchema.parse(response.data);\n } catch (error) {\n const apiError = handleApiError(error, 'fetch project data');\n analytics.captureException(apiError, {\n endpoint: `/api/projects/${projectId}/`,\n baseUrl,\n projectId,\n });\n throw apiError;\n }\n}\n\n/** Minimal shape of `/api/projects/:id/integrations/` — we only read `kind`. */\nconst IntegrationsResponseSchema = z.object({\n results: z.array(z.object({ kind: z.string().nullish() }).passthrough()),\n});\n\n/**\n * Check whether the project already has a Slack integration connected.\n * Requires the `integration:read` scope. Throws on failure — callers\n * (including the SlackConnectScreen poll) decide how to degrade and\n * are responsible for capturing the error exactly once.\n */\nexport async function fetchSlackConnected(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n signal?: AbortSignal,\n): Promise<boolean> {\n const response = await axios.get(\n `${baseUrl}/api/projects/${projectId}/integrations/`,\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n signal,\n },\n );\n const parsed = IntegrationsResponseSchema.safeParse(response.data);\n if (!parsed.success) return false;\n return parsed.data.results.some((i) => i.kind === 'slack');\n}\n\nexport function handleApiError(error: unknown, operation: string): ApiError {\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError<{ detail?: string }>;\n const status = axiosError.response?.status;\n const detail = axiosError.response?.data?.detail;\n const endpoint = axiosError.config?.url;\n\n if (status === 401) {\n return new ApiError(\n `Authentication failed while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n if (status === 403) {\n return new ApiError(\n `Access denied while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n if (status === 404) {\n return new ApiError(\n `Resource not found while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n const message = detail || `Failed to ${operation}`;\n return new ApiError(message, status, endpoint);\n }\n\n if (error instanceof z.ZodError) {\n return new ApiError(`Invalid response format while trying to ${operation}`);\n }\n\n return new ApiError(\n `Unexpected error while trying to ${operation}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAa,gBAAgB,EAC1B,OAAO;CAEN,aAAa,EAAE,QAAQ;CACvB,MAAM,EAAE,QAAQ,CAAC,SAAS;CAC1B,IAAI,EAAE,QAAQ,CAAC,SAAS;CAGxB,OAAO,EAAE,QAAQ,CAAC,SAAS;CAC3B,YAAY,EAAE,QAAQ,CAAC,SAAS;CAChC,WAAW,EAAE,QAAQ,CAAC,SAAS;CAC/B,aAAa,EAAE,QAAQ,CAAC,SAAS;CACjC,mBAAmB,EAAE,SAAS,CAAC,SAAS;CACxC,gBAAgB,EAAE,SAAS,CAAC,SAAS;CACrC,UAAU,EAAE,SAAS,CAAC,SAAS;CAG/B,YAAY,EAAE,QAAQ,CAAC,SAAS;CAChC,cAAc,EAAE,QAAQ,CAAC,SAAS;CAClC,gBAAgB,EAAE,SAAS,CAAC,SAAS;CAKrC,sBAAsB,EAAE,QAAQ,CAAC,SAAS;CAI1C,MAAM,EACH,OAAO;EACN,IAAI,EAAE,QAAQ;EACd,MAAM,EAAE,QAAQ,CAAC,SAAS;EAC1B,cAAc,EAAE,QAAQ,CAAC,MAAM;EAC/B,WAAW,EAAE,QAAQ,CAAC,SAAS;EAC/B,YAAY,EAAE,QAAQ,CAAC,SAAS;EAChC,MAAM,EAAE,QAAQ,CAAC,SAAS;EAC1B,UAAU,EAAE,QAAQ,CAAC,SAAS;EAC/B,CAAC,CACD,aAAa;CAChB,cAAc,EACX,OAAO;EACN,IAAI,EAAE,QAAQ,CAAC,MAAM;EACrB,MAAM,EAAE,QAAQ,CAAC,SAAS;EAC1B,MAAM,EAAE,QAAQ,CAAC,SAAS;EAC1B,kBAAkB,EAAE,QAAQ,CAAC,SAAS;EACtC,aAAa,EAAE,QAAQ,CAAC,SAAS;EAIjC,gCAAgC,EAAE,SAAS,CAAC,SAAS;EACtD,CAAC,CACD,aAAa;CAChB,eAAe,EAAE,MACf,EACG,OAAO;EACN,IAAI,EAAE,QAAQ,CAAC,MAAM;EACrB,MAAM,EAAE,QAAQ,CAAC,SAAS;EAC1B,kBAAkB,EAAE,QAAQ,CAAC,SAAS;EACvC,CAAC,CACD,aAAa,CACjB;CACF,CAAC,CACD,aAAa;;;;;;;;;;;;AAahB,MAAa,yBAAyB,EACnC,OAAO;CACN,OAAO,EAAE,QAAQ,CAAC,SAAS;CAC3B,UAAU,EAAE,QAAQ,CAAC,SAAS;CAC9B,YAAY,EAAE,QAAQ,CAAC,SAAS;CACjC,CAAC,CACD,aAAa;AAGyB,EAAE,OAAO,EAChD,SAAS,EAAE,MAAM,uBAAuB,EACzC,CAAC;AAKF,MAAa,mBAAmB,EAAE,OAAO;CACvC,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ,CAAC,MAAM;CACvB,cAAc,EAAE,QAAQ,CAAC,MAAM;CAC/B,WAAW,EAAE,QAAQ;CACrB,MAAM,EAAE,QAAQ;CAOhB,0BAA0B,EAAE,SAAS,CAAC,SAAS;CAC/C,+BAA+B,EAAE,SAAS,CAAC,SAAS;CACpD,gBAAgB,EAAE,SAAS,CAAC,SAAS;CACtC,CAAC;AAKF,IAAa,WAAb,cAA8B,MAAM;CAClC,YACE,SACA,YACA,UACA;AACA,QAAM,QAAQ;AAHE,OAAA,aAAA;AACA,OAAA,WAAA;AAGhB,OAAK,OAAO;;;AAIhB,eAAsB,cACpB,aACA,SACkB;AAClB,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,IAAI,GAAG,QAAQ,kBAAkB,EAC5D,SAAS;GACP,eAAe,UAAU;GACzB,cAAc;GACf,EACF,CAAC;AAEF,SAAO,cAAc,MAAM,SAAS,KAAK;UAClC,OAAO;EACd,MAAM,WAAW,eAAe,OAAO,kBAAkB;AACzD,YAAU,iBAAiB,UAAU;GACnC,UAAU;GACV;GACD,CAAC;AACF,QAAM;;;AA+CV,eAAsB,iBACpB,aACA,WACA,SACqB;AACrB,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,IAAI,GAAG,QAAQ,gBAAgB,UAAU,IAAI,EACxE,SAAS;GACP,eAAe,UAAU;GACzB,cAAc;GACf,EACF,CAAC;AAEF,SAAO,iBAAiB,MAAM,SAAS,KAAK;UACrC,OAAO;EACd,MAAM,WAAW,eAAe,OAAO,qBAAqB;AAC5D,YAAU,iBAAiB,UAAU;GACnC,UAAU,iBAAiB,UAAU;GACrC;GACA;GACD,CAAC;AACF,QAAM;;;;AAKV,MAAM,6BAA6B,EAAE,OAAO,EAC1C,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,EACzE,CAAC;;;;;;;AAQF,eAAsB,oBACpB,aACA,WACA,SACA,QACkB;CAClB,MAAM,WAAW,MAAM,MAAM,IAC3B,GAAG,QAAQ,gBAAgB,UAAU,iBACrC;EACE,SAAS;GACP,eAAe,UAAU;GACzB,cAAc;GACf;EACD;EACD,CACF;CACD,MAAM,SAAS,2BAA2B,UAAU,SAAS,KAAK;AAClE,KAAI,CAAC,OAAO,QAAS,QAAO;AAC5B,QAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,EAAE,SAAS,QAAQ;;AAG5D,SAAgB,eAAe,OAAgB,WAA6B;AAC1E,KAAI,MAAM,aAAa,MAAM,EAAE;EAC7B,MAAM,aAAa;EACnB,MAAM,SAAS,WAAW,UAAU;EACpC,MAAM,SAAS,WAAW,UAAU,MAAM;EAC1C,MAAM,WAAW,WAAW,QAAQ;AAEpC,MAAI,WAAW,IACb,QAAO,IAAI,SACT,yCAAyC,aACzC,QACA,SACD;AAGH,MAAI,WAAW,IACb,QAAO,IAAI,SACT,iCAAiC,aACjC,QACA,SACD;AAGH,MAAI,WAAW,IACb,QAAO,IAAI,SACT,sCAAsC,aACtC,QACA,SACD;AAIH,SAAO,IAAI,SADK,UAAU,aAAa,aACV,QAAQ,SAAS;;AAGhD,KAAI,iBAAiB,EAAE,SACrB,QAAO,IAAI,SAAS,2CAA2C,YAAY;AAG7E,QAAO,IAAI,SACT,oCAAoC,UAAU,IAC5C,iBAAiB,QAAQ,MAAM,UAAU,kBAE5C"}
|
|
1
|
+
{"version":3,"file":"api-Blg3nvvZ.js","names":[],"sources":["../src/lib/api.ts"],"sourcesContent":["import axios, { AxiosError } from 'axios';\nimport { z } from 'zod';\nimport { analytics } from '@utils/analytics';\nimport { WIZARD_USER_AGENT } from './constants';\n\n/**\n * User payload from `/api/users/@me/`. Schema typed for the fields the\n * wizard actually reads + passthrough on everything else so the full\n * upstream response rides through to the session for downstream features\n * (account-aware copy, plan-gated flows, org/team metadata, etc.).\n *\n * Top-level uses `.passthrough()` so unknown fields aren't stripped;\n * the few nested objects we care about (team, organization,\n * organizations[]) do the same so their additional fields survive too.\n *\n * Keep `distinct_id` required — analytics depends on it. Everything\n * else added here is nullish so partial responses don't fail parsing.\n */\nexport const ApiUserSchema = z\n .object({\n // Identifiers\n distinct_id: z.string(),\n uuid: z.string().nullish(),\n id: z.number().nullish(),\n\n // Profile\n email: z.string().nullish(),\n first_name: z.string().nullish(),\n last_name: z.string().nullish(),\n date_joined: z.string().nullish(),\n is_email_verified: z.boolean().nullish(),\n is_2fa_enabled: z.boolean().nullish(),\n is_staff: z.boolean().nullish(),\n\n // Preferences\n theme_mode: z.string().nullish(),\n toolbar_mode: z.string().nullish(),\n hide_mcp_hints: z.boolean().nullish(),\n\n // Optional / nullable on the backend — pre-onboarding signup paths\n // return null and older accounts may not have it set. Treat as a\n // hint, never a guarantee.\n role_at_organization: z.string().nullish(),\n\n // Current team + organization (objects from the API, kept typed on\n // the fields the wizard uses; passthrough preserves the rest).\n team: z\n .object({\n id: z.number(),\n uuid: z.string().nullish(),\n organization: z.string().uuid(),\n api_token: z.string().nullish(),\n project_id: z.number().nullish(),\n name: z.string().nullish(),\n timezone: z.string().nullish(),\n })\n .passthrough(),\n organization: z\n .object({\n id: z.string().uuid(),\n name: z.string().nullish(),\n slug: z.string().nullish(),\n membership_level: z.number().nullish(),\n customer_id: z.string().nullish(),\n // Org-level AI consent gate. Signals drops all findings while\n // this is not true. Null on older orgs (pre-2026-05 default\n // flip) — treat null as \"unknown\", not \"off\".\n is_ai_data_processing_approved: z.boolean().nullish(),\n })\n .passthrough(),\n organizations: z.array(\n z\n .object({\n id: z.string().uuid(),\n name: z.string().nullish(),\n membership_level: z.number().nullish(),\n })\n .passthrough(),\n ),\n })\n .passthrough();\n\n/**\n * Single activity log entry the wizard cares about. The PostHog endpoint\n * returns much more — schema kept minimal so changes upstream don't break us.\n *\n * @unused — no current caller after the Phase 6 streaming-agent pivot\n * dropped activity_log polling. Deliberately retained: this is a thin,\n * well-typed wrapper around a stable PostHog endpoint, and we're likely\n * to want it again for a future feature (e.g. \"what changed in your\n * project recently\"). Re-deriving the schema is more work than letting\n * it sit dormant.\n */\nexport const ActivityLogEntrySchema = z\n .object({\n scope: z.string().nullish(),\n activity: z.string().nullish(),\n created_at: z.string().nullish(),\n })\n .passthrough();\n\n/** @unused — see ActivityLogEntrySchema. */\nexport const ActivityLogResponseSchema = z.object({\n results: z.array(ActivityLogEntrySchema),\n});\n\n/** @unused — see ActivityLogEntrySchema. */\nexport type ActivityLogEntry = z.infer<typeof ActivityLogEntrySchema>;\n\nexport const ApiProjectSchema = z.object({\n id: z.number(),\n uuid: z.string().uuid(),\n organization: z.string().uuid(),\n api_token: z.string(),\n name: z.string(),\n // Product opt-ins (TeamSerializer-compat fields on /api/projects/:id).\n // Project-level truth for \"is this product enabled\" — a product can be\n // instrumented from another repo or the snippet, so these settings\n // override repo-local evidence. Null/absent = unknown. Only the\n // opt-ins a signals decision consumes: replay + exception autocapture\n // feed signal-source choices; surveys feeds the surveys-scout tuning.\n session_recording_opt_in: z.boolean().nullish(),\n autocapture_exceptions_opt_in: z.boolean().nullish(),\n surveys_opt_in: z.boolean().nullish(),\n});\n\nexport type ApiUser = z.infer<typeof ApiUserSchema>;\nexport type ApiProject = z.infer<typeof ApiProjectSchema>;\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly endpoint?: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport async function fetchUserData(\n accessToken: string,\n baseUrl: string,\n): Promise<ApiUser> {\n try {\n const response = await axios.get(`${baseUrl}/api/users/@me/`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n });\n\n return ApiUserSchema.parse(response.data);\n } catch (error) {\n const apiError = handleApiError(error, 'fetch user data');\n analytics.captureException(apiError, {\n endpoint: '/api/users/@me/',\n baseUrl,\n });\n throw apiError;\n }\n}\n\n/**\n * Best-effort fetch of recent activity log entries. Returns [] on any error\n * so callers can treat absence of results as \"haven't detected anything yet\"\n * rather than a hard failure.\n *\n * @unused — no current caller after the Phase 6 streaming-agent pivot\n * dropped activity_log polling from McpSuggestedPromptsScreen.\n * Deliberately retained for future features that want a soft signal of\n * recent project changes (e.g. dashboards, audit summaries). See the\n * ActivityLogEntrySchema doc comment for the keep-vs-delete rationale.\n */\nexport async function fetchRecentActivity(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n since: Date,\n): Promise<ActivityLogEntry[]> {\n try {\n const response = await axios.get(\n `${baseUrl}/api/projects/${projectId}/activity_log/`,\n {\n params: { limit: 10 },\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n // Short timeout — best-effort probe, not a critical path.\n timeout: 4000,\n },\n );\n const parsed = ActivityLogResponseSchema.safeParse(response.data);\n if (!parsed.success) return [];\n const sinceMs = since.getTime();\n return parsed.data.results.filter((entry) => {\n if (!entry.created_at) return false;\n const t = Date.parse(entry.created_at);\n return Number.isFinite(t) && t >= sinceMs;\n });\n } catch {\n return [];\n }\n}\n\nexport async function fetchProjectData(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n): Promise<ApiProject> {\n try {\n const response = await axios.get(`${baseUrl}/api/projects/${projectId}/`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n });\n\n return ApiProjectSchema.parse(response.data);\n } catch (error) {\n const apiError = handleApiError(error, 'fetch project data');\n analytics.captureException(apiError, {\n endpoint: `/api/projects/${projectId}/`,\n baseUrl,\n projectId,\n });\n throw apiError;\n }\n}\n\n/** Minimal shape of `/api/projects/:id/integrations/` — we only read `kind`. */\nconst IntegrationsResponseSchema = z.object({\n results: z.array(z.object({ kind: z.string().nullish() }).passthrough()),\n});\n\n/**\n * Check whether the project already has a Slack integration connected.\n * Requires the `integration:read` scope. Throws on failure — callers\n * (including the SlackConnectScreen poll) decide how to degrade and\n * are responsible for capturing the error exactly once.\n */\nexport async function fetchSlackConnected(\n accessToken: string,\n projectId: number,\n baseUrl: string,\n signal?: AbortSignal,\n): Promise<boolean> {\n const response = await axios.get(\n `${baseUrl}/api/projects/${projectId}/integrations/`,\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n signal,\n },\n );\n const parsed = IntegrationsResponseSchema.safeParse(response.data);\n if (!parsed.success) return false;\n return parsed.data.results.some((i) => i.kind === 'slack');\n}\n\nexport function handleApiError(error: unknown, operation: string): ApiError {\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError<{ detail?: string }>;\n const status = axiosError.response?.status;\n const detail = axiosError.response?.data?.detail;\n const endpoint = axiosError.config?.url;\n\n if (status === 401) {\n return new ApiError(\n `Authentication failed while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n if (status === 403) {\n return new ApiError(\n `Access denied while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n if (status === 404) {\n return new ApiError(\n `Resource not found while trying to ${operation}`,\n status,\n endpoint,\n );\n }\n\n const message = detail || `Failed to ${operation}`;\n return new ApiError(message, status, endpoint);\n }\n\n if (error instanceof z.ZodError) {\n return new ApiError(`Invalid response format while trying to ${operation}`);\n }\n\n return new ApiError(\n `Unexpected error while trying to ${operation}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n );\n}\n"],"mappings":"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"}
|
package/dist/bin.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { I as POSTHOG_DOCS_URL, Q as WIZARD_USER_AGENT, a as getLogFilePath,
|
|
3
|
-
import { t as analytics } from "./analytics-
|
|
4
|
-
import { r as setEntryCommand } from "./telemetry-
|
|
5
|
-
import { n as isUsingTypeScript } from "./setup-utils-
|
|
6
|
-
import { a as getUiHostFromHost, n as getCloudUrlFromRegion } from "./urls-
|
|
7
|
-
import { o as handleApiError } from "./api-
|
|
2
|
+
import { I as POSTHOG_DOCS_URL, Q as WIZARD_USER_AGENT, a as getLogFilePath, et as getSkillsBaseUrl, h as LoggingUI, m as setUI, p as getUI, r as debug, s as logToFile, tt as VERSION } from "./debug-AdvgwKEw.js";
|
|
3
|
+
import { t as analytics } from "./analytics-CBIKy9PZ.js";
|
|
4
|
+
import { r as setEntryCommand } from "./telemetry-1m0CyTry.js";
|
|
5
|
+
import { n as isUsingTypeScript } from "./setup-utils-B6wbp3s0.js";
|
|
6
|
+
import { a as getUiHostFromHost, n as getCloudUrlFromRegion } from "./urls-B3JumpLT.js";
|
|
7
|
+
import { o as handleApiError } from "./api-Blg3nvvZ.js";
|
|
8
8
|
import "./wizard-session-G3VWD6hv.js";
|
|
9
|
-
import { r as runCleanups } from "./wizard-abort-
|
|
10
|
-
import { n as isNonInteractiveEnvironment } from "./environment-
|
|
11
|
-
import {
|
|
12
|
-
import { i as SPINNER_MESSAGE } from "./registry-
|
|
13
|
-
import { _ as
|
|
14
|
-
import { n as safeReadFile, r as walkProjectFiles, t as IGNORED_DIRS } from "./file-utils-
|
|
9
|
+
import { r as runCleanups } from "./wizard-abort-PqLMKSh1.js";
|
|
10
|
+
import { n as isNonInteractiveEnvironment } from "./environment-B6TW5v9d.js";
|
|
11
|
+
import { C as AUDIT_CHECKS_FILE, T as AUDIT_REPORT_FILE, c as recoverOrphanedSettingsBackups, g as WIZARD_TOOL_NAMES, h as SETUP_REPORT_FILE, u as AgentSignals, v as fetchSkillMenu, w as AUDIT_CHECKS_KEY } from "./agent-interface-c7B2JZEd.js";
|
|
12
|
+
import { i as SPINNER_MESSAGE } from "./registry-Dbl-5SnO.js";
|
|
13
|
+
import { _ as parseRequirementsTxt, a as StatusPeekTrigger, c as isClearBlock, d as Colors, f as Icons, g as parsePyprojectToml, h as parsePipfile, i as PRODUCT_SUITE_BLOCK, n as FUNNEL_BLOCK, p as HEALTH_CHECK_STEP, r as LINE_CHART_BLOCK, t as posthogIntegrationConfig } from "./posthog-integration-gLhOUdPJ.js";
|
|
14
|
+
import { n as safeReadFile, r as walkProjectFiles, t as IGNORED_DIRS } from "./file-utils-8tUk_eEX.js";
|
|
15
15
|
import { n as readApiKeyFromEnv } from "./env-api-key-MlzJYAvt.js";
|
|
16
16
|
import { satisfies } from "semver";
|
|
17
17
|
import yargs from "yargs";
|
|
@@ -190,7 +190,7 @@ function runProvision(argv) {
|
|
|
190
190
|
}
|
|
191
191
|
async function provision({ email, region, name, jsonMode }) {
|
|
192
192
|
try {
|
|
193
|
-
const { provisionNewAccount } = await import("./provisioning-
|
|
193
|
+
const { provisionNewAccount } = await import("./provisioning-DuzclqPB.js").then((n) => n.n);
|
|
194
194
|
if (!jsonMode) getUI().log.info(`Provisioning account for ${email} in ${region}...`);
|
|
195
195
|
emitResult(await provisionNewAccount(email, name, region), jsonMode);
|
|
196
196
|
process.exit(0);
|
|
@@ -255,18 +255,18 @@ const basicIntegrationCommand = {
|
|
|
255
255
|
setEntryCommand("integrate");
|
|
256
256
|
(async () => {
|
|
257
257
|
if (argv.ci) {
|
|
258
|
-
const { runCIInstall } = await import("./ci-install-
|
|
258
|
+
const { runCIInstall } = await import("./ci-install-51ntd9x5.js");
|
|
259
259
|
return runCIInstall(argv);
|
|
260
260
|
}
|
|
261
261
|
if (isNonInteractiveEnvironment()) {
|
|
262
|
-
const { failNonInteractive } = await import("./non-interactive-
|
|
262
|
+
const { failNonInteractive } = await import("./non-interactive-DejTdRTW.js");
|
|
263
263
|
return failNonInteractive();
|
|
264
264
|
}
|
|
265
265
|
if (argv.playground) {
|
|
266
|
-
const { runPlayground } = await import("./playground-
|
|
266
|
+
const { runPlayground } = await import("./playground-BOg2U1AT.js");
|
|
267
267
|
return runPlayground();
|
|
268
268
|
}
|
|
269
|
-
const { runInteractive } = await import("./interactive-
|
|
269
|
+
const { runInteractive } = await import("./interactive-CApktTrj.js");
|
|
270
270
|
runInteractive(argv);
|
|
271
271
|
})();
|
|
272
272
|
}
|
|
@@ -1723,7 +1723,6 @@ const EVENTS_AUDIT_SEED_CHECKS = [
|
|
|
1723
1723
|
];
|
|
1724
1724
|
//#endregion
|
|
1725
1725
|
//#region src/lib/programs/events-audit/index.ts
|
|
1726
|
-
const SETUP_REPORT_FILE = "posthog-events-audit-report.md";
|
|
1727
1726
|
const DOCS_URL$3 = "https://posthog.com/docs/product-analytics/best-practices";
|
|
1728
1727
|
const eventsAuditConfig = {
|
|
1729
1728
|
command: "events-audit",
|
|
@@ -3641,6 +3640,45 @@ const mcpTutorialConfig = {
|
|
|
3641
3640
|
}]
|
|
3642
3641
|
};
|
|
3643
3642
|
//#endregion
|
|
3643
|
+
//#region src/lib/programs/mcp-analytics/index.ts
|
|
3644
|
+
const MCP_ANALYTICS_REPORT_FILE = "posthog-mcp-analytics-report.md";
|
|
3645
|
+
/**
|
|
3646
|
+
* `wizard mcp-analytics` — flat skill command.
|
|
3647
|
+
*
|
|
3648
|
+
* Instruments the user's own MCP server with the `@posthog/mcp` SDK so it
|
|
3649
|
+
* reports `$mcp_*` analytics about itself. This is the opposite of
|
|
3650
|
+
* `wizard mcp add` (which installs the PostHog MCP *server* into a coding
|
|
3651
|
+
* agent) — keep the two distinct.
|
|
3652
|
+
*
|
|
3653
|
+
* Flat while instrumenting is the only action. If an uninstrument / `remove`
|
|
3654
|
+
* leaf ever lands, restructure into a family with `familyCommandFactory` and
|
|
3655
|
+
* publish each leaf as a `cliEntries` entry with `parentCommand:
|
|
3656
|
+
* 'mcp-analytics'` from context-mill — a deliberate breaking change, done then,
|
|
3657
|
+
* not pre-emptively.
|
|
3658
|
+
*/
|
|
3659
|
+
const mcpAnalyticsConfig = createSkillProgram({
|
|
3660
|
+
skillId: "mcp-analytics",
|
|
3661
|
+
command: "mcp-analytics",
|
|
3662
|
+
id: "mcp-analytics",
|
|
3663
|
+
description: "Add PostHog MCP analytics to your MCP server",
|
|
3664
|
+
integrationLabel: "mcp-analytics",
|
|
3665
|
+
customPrompt: `Instrument this project's MCP server with PostHog MCP analytics. Run the \`mcp-analytics\` skill end-to-end: detect the server style, install \`@posthog/mcp\` and \`posthog-node\`, wrap the server (or use \`PostHogMCP\` for a custom dispatcher), wire the project API key and host, and verify. Make only additive changes — do not alter tool behavior. The final report is written to ./${MCP_ANALYTICS_REPORT_FILE}.`,
|
|
3666
|
+
successMessage: `MCP analytics configured! View the report at ./${MCP_ANALYTICS_REPORT_FILE}`,
|
|
3667
|
+
reportFile: MCP_ANALYTICS_REPORT_FILE,
|
|
3668
|
+
docsUrl: "https://posthog.com/docs/mcp-analytics",
|
|
3669
|
+
spinnerMessage: "Setting up MCP analytics...",
|
|
3670
|
+
estimatedDurationMinutes: 5,
|
|
3671
|
+
abortCases: [{
|
|
3672
|
+
match: /^not a javascript mcp server$/i,
|
|
3673
|
+
message: "Not a JavaScript/TypeScript MCP server",
|
|
3674
|
+
body: "MCP analytics is currently TypeScript/JavaScript-only — the `@posthog/mcp` SDK is a Node package (a Python SDK is on the roadmap). This project doesn't look like a JS/TS MCP server, so there's nothing to instrument. See https://posthog.com/docs/mcp-analytics for the supported setups."
|
|
3675
|
+
}, {
|
|
3676
|
+
match: /^no mcp server found$/i,
|
|
3677
|
+
message: "No MCP server found",
|
|
3678
|
+
body: "This command instruments an existing MCP server with PostHog analytics, but no MCP server was found in this project. If you just want PostHog product analytics, run `npx @posthog/wizard` instead."
|
|
3679
|
+
}]
|
|
3680
|
+
});
|
|
3681
|
+
//#endregion
|
|
3644
3682
|
//#region src/lib/programs/slack/index.ts
|
|
3645
3683
|
const slackConnectConfig = {
|
|
3646
3684
|
id: "slack",
|
|
@@ -3688,6 +3726,7 @@ const PROGRAM_REGISTRY = [
|
|
|
3688
3726
|
mcpAddConfig,
|
|
3689
3727
|
mcpRemoveConfig,
|
|
3690
3728
|
mcpTutorialConfig,
|
|
3729
|
+
mcpAnalyticsConfig,
|
|
3691
3730
|
slackConnectConfig
|
|
3692
3731
|
];
|
|
3693
3732
|
/**
|
|
@@ -3710,6 +3749,7 @@ const Program = {
|
|
|
3710
3749
|
McpAdd: mcpAddConfig.id,
|
|
3711
3750
|
McpRemove: mcpRemoveConfig.id,
|
|
3712
3751
|
McpTutorial: mcpTutorialConfig.id,
|
|
3752
|
+
McpAnalytics: mcpAnalyticsConfig.id,
|
|
3713
3753
|
SlackConnect: slackConnectConfig.id
|
|
3714
3754
|
};
|
|
3715
3755
|
/**
|
|
@@ -3750,7 +3790,7 @@ function runMcpAdd(argv) {
|
|
|
3750
3790
|
const debug = argv.debug;
|
|
3751
3791
|
const localMcp = argv.local;
|
|
3752
3792
|
try {
|
|
3753
|
-
const { startTUI } = await import("./start-tui-
|
|
3793
|
+
const { startTUI } = await import("./start-tui-IoQh-Nhj.js");
|
|
3754
3794
|
const { buildSession } = await import("./wizard-session-wPJtNl4c.js");
|
|
3755
3795
|
const tui = startTUI(VERSION, Program.McpAdd);
|
|
3756
3796
|
tui.store.session = buildSession({
|
|
@@ -3762,7 +3802,7 @@ function runMcpAdd(argv) {
|
|
|
3762
3802
|
} catch (error) {
|
|
3763
3803
|
if (!isTUIUnavailable(error)) throw error;
|
|
3764
3804
|
setUI(new LoggingUI());
|
|
3765
|
-
const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-
|
|
3805
|
+
const { addMCPServerToClientsStep } = await import("./add-mcp-server-to-clients-Dc0yssCM.js").then((n) => n.r);
|
|
3766
3806
|
await addMCPServerToClientsStep({
|
|
3767
3807
|
local: localMcp,
|
|
3768
3808
|
features,
|
|
@@ -3801,7 +3841,7 @@ function runMcpRemove(argv) {
|
|
|
3801
3841
|
const debug = argv.debug;
|
|
3802
3842
|
const localMcp = argv.local;
|
|
3803
3843
|
try {
|
|
3804
|
-
const { startTUI } = await import("./start-tui-
|
|
3844
|
+
const { startTUI } = await import("./start-tui-IoQh-Nhj.js");
|
|
3805
3845
|
const { buildSession } = await import("./wizard-session-wPJtNl4c.js");
|
|
3806
3846
|
const tui = startTUI(VERSION, Program.McpRemove);
|
|
3807
3847
|
tui.store.session = buildSession({
|
|
@@ -3810,7 +3850,7 @@ function runMcpRemove(argv) {
|
|
|
3810
3850
|
});
|
|
3811
3851
|
} catch {
|
|
3812
3852
|
setUI(new LoggingUI());
|
|
3813
|
-
const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-
|
|
3853
|
+
const { removeMCPServerFromClientsStep } = await import("./add-mcp-server-to-clients-Dc0yssCM.js").then((n) => n.r);
|
|
3814
3854
|
await removeMCPServerFromClientsStep({ local: localMcp });
|
|
3815
3855
|
}
|
|
3816
3856
|
})();
|
|
@@ -3832,7 +3872,7 @@ function runMcpTutorial(argv) {
|
|
|
3832
3872
|
const debug = argv.debug;
|
|
3833
3873
|
const localMcp = argv.local;
|
|
3834
3874
|
try {
|
|
3835
|
-
const { startTUI } = await import("./start-tui-
|
|
3875
|
+
const { startTUI } = await import("./start-tui-IoQh-Nhj.js");
|
|
3836
3876
|
const { buildSession } = await import("./wizard-session-wPJtNl4c.js");
|
|
3837
3877
|
const tui = startTUI(VERSION, Program.McpTutorial);
|
|
3838
3878
|
tui.store.session = buildSession({
|
|
@@ -3887,7 +3927,7 @@ function runWizard(config, options) {
|
|
|
3887
3927
|
(async () => {
|
|
3888
3928
|
try {
|
|
3889
3929
|
const installDir = options.installDir || process.cwd();
|
|
3890
|
-
const { startTUI } = await import("./start-tui-
|
|
3930
|
+
const { startTUI } = await import("./start-tui-IoQh-Nhj.js");
|
|
3891
3931
|
const { buildSession, RunPhase } = await import("./wizard-session-wPJtNl4c.js");
|
|
3892
3932
|
const { TaskStreamPush } = await import("./task-stream-BQNSp0qR.js");
|
|
3893
3933
|
const { PostHogDestination } = await import("./posthog-Cr37rnla.js");
|
|
@@ -3943,7 +3983,7 @@ function runWizard(config, options) {
|
|
|
3943
3983
|
await activeTui.store.getGate("health-check");
|
|
3944
3984
|
const skipAgent = config.run == null;
|
|
3945
3985
|
if (skipAgent) {
|
|
3946
|
-
const { getOrAskForProjectData } = await import("./setup-utils-
|
|
3986
|
+
const { getOrAskForProjectData } = await import("./setup-utils-B6wbp3s0.js").then((n) => n.r);
|
|
3947
3987
|
const { projectApiKey, host, accessToken, projectId } = await getOrAskForProjectData({
|
|
3948
3988
|
signup: session.signup,
|
|
3949
3989
|
ci: session.ci,
|
|
@@ -3958,7 +3998,7 @@ function runWizard(config, options) {
|
|
|
3958
3998
|
projectId
|
|
3959
3999
|
});
|
|
3960
4000
|
} else {
|
|
3961
|
-
const { runAgent } = await import("./agent-runner-
|
|
4001
|
+
const { runAgent } = await import("./agent-runner-Am34bBUT.js");
|
|
3962
4002
|
await runAgent(config, activeTui.store.session);
|
|
3963
4003
|
}
|
|
3964
4004
|
const isDone = () => skipAgent ? activeTui.store.session.outroDismissed : activeTui.store.session.skillsComplete;
|
|
@@ -4035,10 +4075,10 @@ function runWizardCI(config, options) {
|
|
|
4035
4075
|
(async () => {
|
|
4036
4076
|
const path = await import("path");
|
|
4037
4077
|
const { buildSession } = await import("./wizard-session-wPJtNl4c.js");
|
|
4038
|
-
const { readEnvironment } = await import("./environment-
|
|
4078
|
+
const { readEnvironment } = await import("./environment-B6TW5v9d.js").then((n) => n.t);
|
|
4039
4079
|
const { readApiKeyFromEnv } = await import("./env-api-key-MlzJYAvt.js").then((n) => n.t);
|
|
4040
|
-
const { configureLogFileFromEnvironment, logToFile } = await import("./debug-
|
|
4041
|
-
const { wizardAbort, WizardError } = await import("./wizard-abort-
|
|
4080
|
+
const { configureLogFileFromEnvironment, logToFile } = await import("./debug-cy_jyRb4.js");
|
|
4081
|
+
const { wizardAbort, WizardError } = await import("./wizard-abort-D7SzKUgE.js");
|
|
4042
4082
|
configureLogFileFromEnvironment();
|
|
4043
4083
|
const env = readEnvironment();
|
|
4044
4084
|
const apiKey = options.apiKey ?? readApiKeyFromEnv() ?? void 0;
|
|
@@ -4089,7 +4129,7 @@ function runWizardCI(config, options) {
|
|
|
4089
4129
|
})
|
|
4090
4130
|
});
|
|
4091
4131
|
}
|
|
4092
|
-
const { runAgent } = await import("./agent-runner-
|
|
4132
|
+
const { runAgent } = await import("./agent-runner-Am34bBUT.js");
|
|
4093
4133
|
await runAgent(config, session);
|
|
4094
4134
|
} catch (error) {
|
|
4095
4135
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -4172,6 +4212,35 @@ function mergeCommandOptions(config) {
|
|
|
4172
4212
|
};
|
|
4173
4213
|
}
|
|
4174
4214
|
//#endregion
|
|
4215
|
+
//#region src/commands/factories/native-command-factory.ts
|
|
4216
|
+
/**
|
|
4217
|
+
* Build a yargs `Command` from a wizard-native `ProgramConfig`.
|
|
4218
|
+
*
|
|
4219
|
+
* Collapses the previously duplicated boilerplate (read `config.command`,
|
|
4220
|
+
* merge skill-program flags with program-specific options, dispatch via
|
|
4221
|
+
* `runWizard` / `runWizardCI`) into a single call.
|
|
4222
|
+
*/
|
|
4223
|
+
function nativeCommandFactory(config, opts = {}) {
|
|
4224
|
+
if (!config.command) throw new Error(`nativeCommandFactory: program "${config.id}" has no \`command\` — wizard-native programs must declare a CLI name`);
|
|
4225
|
+
return {
|
|
4226
|
+
name: config.command,
|
|
4227
|
+
description: config.description,
|
|
4228
|
+
options: mergeCommandOptions(config),
|
|
4229
|
+
children: opts.children,
|
|
4230
|
+
handler: (argv) => dispatchProgram(config, argv)
|
|
4231
|
+
};
|
|
4232
|
+
}
|
|
4233
|
+
//#endregion
|
|
4234
|
+
//#region src/commands/mcp-analytics.ts
|
|
4235
|
+
/**
|
|
4236
|
+
* `wizard mcp-analytics` — flat skill command, instrument-an-MCP-server today.
|
|
4237
|
+
*
|
|
4238
|
+
* Distinct from `wizard mcp add`: this instruments the user's own MCP server
|
|
4239
|
+
* with the `@posthog/mcp` SDK, rather than installing the PostHog MCP server
|
|
4240
|
+
* into a coding agent. Stays flat while instrumenting is the only action.
|
|
4241
|
+
*/
|
|
4242
|
+
const mcpAnalyticsCommand = nativeCommandFactory(mcpAnalyticsConfig);
|
|
4243
|
+
//#endregion
|
|
4175
4244
|
//#region src/lib/programs/dispatch-family.ts
|
|
4176
4245
|
/**
|
|
4177
4246
|
* Capture a CLI dispatch error, flush analytics, and exit. The wizard never
|
|
@@ -4956,7 +5025,7 @@ async function runDoctorCI(options) {
|
|
|
4956
5025
|
getUI().intro("Welcome to the PostHog setup wizard");
|
|
4957
5026
|
getUI().log.info("Running posthog-doctor in CI mode");
|
|
4958
5027
|
try {
|
|
4959
|
-
const { getOrAskForProjectData } = await import("./setup-utils-
|
|
5028
|
+
const { getOrAskForProjectData } = await import("./setup-utils-B6wbp3s0.js").then((n) => n.r);
|
|
4960
5029
|
const { host, accessToken, projectId } = await getOrAskForProjectData({
|
|
4961
5030
|
signup: false,
|
|
4962
5031
|
ci: true,
|
|
@@ -4973,32 +5042,13 @@ async function runDoctorCI(options) {
|
|
|
4973
5042
|
for (const issue of sorted) getUI().log.info(` • [${issue.severity}] ${getKindMeta(issue.kind).title}`);
|
|
4974
5043
|
process.exit(1);
|
|
4975
5044
|
} catch (error) {
|
|
4976
|
-
const { ApiError } = await import("./api-
|
|
5045
|
+
const { ApiError } = await import("./api-Blg3nvvZ.js").then((n) => n.n);
|
|
4977
5046
|
const message = error instanceof ApiError && error.statusCode === 401 ? "Your PostHog API key is invalid or expired." : error instanceof Error ? error.message : String(error);
|
|
4978
5047
|
getUI().log.error(`Doctor failed: ${message}`);
|
|
4979
5048
|
process.exit(1);
|
|
4980
5049
|
}
|
|
4981
5050
|
}
|
|
4982
5051
|
//#endregion
|
|
4983
|
-
//#region src/commands/factories/native-command-factory.ts
|
|
4984
|
-
/**
|
|
4985
|
-
* Build a yargs `Command` from a wizard-native `ProgramConfig`.
|
|
4986
|
-
*
|
|
4987
|
-
* Collapses the previously duplicated boilerplate (read `config.command`,
|
|
4988
|
-
* merge skill-program flags with program-specific options, dispatch via
|
|
4989
|
-
* `runWizard` / `runWizardCI`) into a single call.
|
|
4990
|
-
*/
|
|
4991
|
-
function nativeCommandFactory(config, opts = {}) {
|
|
4992
|
-
if (!config.command) throw new Error(`nativeCommandFactory: program "${config.id}" has no \`command\` — wizard-native programs must declare a CLI name`);
|
|
4993
|
-
return {
|
|
4994
|
-
name: config.command,
|
|
4995
|
-
description: config.description,
|
|
4996
|
-
options: mergeCommandOptions(config),
|
|
4997
|
-
children: opts.children,
|
|
4998
|
-
handler: (argv) => dispatchProgram(config, argv)
|
|
4999
|
-
};
|
|
5000
|
-
}
|
|
5001
|
-
//#endregion
|
|
5002
5052
|
//#region src/commands/migrate.ts
|
|
5003
5053
|
/**
|
|
5004
5054
|
* `wizard migrate` — flat skill command, Statsig today.
|
|
@@ -5069,7 +5119,7 @@ function runSlackConnect(argv) {
|
|
|
5069
5119
|
(async () => {
|
|
5070
5120
|
const debug = argv.debug;
|
|
5071
5121
|
try {
|
|
5072
|
-
const { startTUI } = await import("./start-tui-
|
|
5122
|
+
const { startTUI } = await import("./start-tui-IoQh-Nhj.js");
|
|
5073
5123
|
const { buildSession } = await import("./wizard-session-wPJtNl4c.js");
|
|
5074
5124
|
const tui = startTUI(VERSION, Program.SlackConnect);
|
|
5075
5125
|
tui.store.session = buildSession({ debug });
|
|
@@ -5446,7 +5496,7 @@ function resolveInstallDir() {
|
|
|
5446
5496
|
if (inline) return inline.slice(14);
|
|
5447
5497
|
return process.env.POSTHOG_WIZARD_INSTALL_DIR ?? process.cwd();
|
|
5448
5498
|
}
|
|
5449
|
-
Wizard.use(basicIntegrationCommand).use(mcpCommand).use(cliCommand).use(auditCommand).use(doctorCommand).use(migrateCommand).use(revenueCommand).use(warehouseCommand).use(selfDrivingCommand).use(slackCommand).use(uploadSourcemapsCommand).use(skillCommand).init();
|
|
5499
|
+
Wizard.use(basicIntegrationCommand).use(mcpCommand).use(mcpAnalyticsCommand).use(cliCommand).use(auditCommand).use(doctorCommand).use(migrateCommand).use(revenueCommand).use(warehouseCommand).use(selfDrivingCommand).use(slackCommand).use(uploadSourcemapsCommand).use(skillCommand).init();
|
|
5450
5500
|
//#endregion
|
|
5451
5501
|
export { getDetectedWarehouseSources as _, ConfirmButton as a, STRIPE_SDKS as b, runWizard as c, getProgramConfig as d, AUTOMATABLE_VARIANTS as f, fetchHealthIssues as g, getKindMeta as h, useKeyboardHintsContext as i, PROGRAM_REGISTRY as l, SOURCE_MAPS_CONTEXT_KEYS as m, useKeyBindings as n, PromptLabel as o, DISPLAY_NAME as p, KeyboardHintsProvider as r, runWizardCI as s, PickerMenu as t, Program as u, getContentBlocks$2 as v, POSTHOG_SDKS as y };
|
|
5452
5502
|
|