@posthog/wizard 1.0.0 → 1.2.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 +2 -2
- package/dist/bin.js +62 -6
- package/dist/bin.js.map +1 -1
- package/dist/src/lib/helper-functions.d.ts +1 -0
- package/dist/src/lib/helper-functions.js +6 -0
- package/dist/src/lib/helper-functions.js.map +1 -0
- package/dist/src/mcp.d.ts +9 -0
- package/dist/src/mcp.js +70 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/nextjs/docs.js +2 -0
- package/dist/src/nextjs/docs.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +6 -4
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/react/docs.js +1 -0
- package/dist/src/react/docs.js.map +1 -1
- package/dist/src/react/react-wizard.js +5 -2
- package/dist/src/react/react-wizard.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +5 -2
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/run.d.ts +1 -1
- package/dist/src/run.js +1 -4
- package/dist/src/run.js.map +1 -1
- package/dist/src/steps/__tests__/add-editor-rules.test.js +0 -10
- package/dist/src/steps/__tests__/add-editor-rules.test.js.map +1 -1
- package/dist/src/steps/add-editor-rules.d.ts +1 -2
- package/dist/src/steps/add-editor-rules.js +1 -22
- package/dist/src/steps/add-editor-rules.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +7 -0
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +8 -0
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.d.ts +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js +318 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.d.ts +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.js +443 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +40 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +119 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +40 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +112 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +35 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js +29 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +15 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.js +145 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -0
- package/dist/src/steps/index.d.ts +2 -0
- package/dist/src/steps/index.js +2 -0
- package/dist/src/steps/index.js.map +1 -1
- package/dist/src/svelte/docs.js +2 -1
- package/dist/src/svelte/docs.js.map +1 -1
- package/dist/src/svelte/svelte-wizard.js +5 -2
- package/dist/src/svelte/svelte-wizard.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +1 -1
- package/dist/src/utils/clack-utils.js +3 -3
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/claude.ts"],"names":[],"mappings":"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","sourcesContent":["import { MCPClient } from '../MCPClient';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DefaultMCPClientConfig, getDefaultServerConfig } from '../defaults';\nimport { z } from 'zod';\nimport { merge } from 'lodash';\n\nexport const ClaudeMCPConfig = DefaultMCPClientConfig;\n\nexport type ClaudeMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class ClaudeMCPClient extends MCPClient {\n name = 'Claude Desktop';\n\n constructor() {\n super();\n }\n\n isClientSupported(): boolean {\n return process.platform === 'darwin' || process.platform === 'win32';\n }\n\n private getConfigPath(): string {\n const homeDir = os.homedir();\n const isWindows = process.platform === 'win32';\n const isMac = process.platform === 'darwin';\n\n if (isMac) {\n return path.join(\n homeDir,\n 'Library',\n 'Application Support',\n 'Claude',\n 'claude_desktop_config.json',\n );\n }\n\n if (isWindows) {\n return path.join(\n process.env.APPDATA || '',\n 'Claude',\n 'claude_desktop_config.json',\n );\n }\n\n throw new Error(`Unsupported platform: ${process.platform}`);\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const configPath = 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 = ClaudeMCPConfig.parse(JSON.parse(configContent));\n\n return 'posthog' in config.mcpServers;\n } catch {\n return false;\n }\n }\n\n async addServer(apiKey: string): Promise<void> {\n const configPath = this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n await fs.promises.mkdir(configDir, { recursive: true });\n\n let existingConfig: ClaudeMCPConfig = { mcpServers: {} };\n\n if (fs.existsSync(configPath)) {\n try {\n const existingContent = await fs.promises.readFile(configPath, 'utf8');\n existingConfig = ClaudeMCPConfig.parse(JSON.parse(existingContent));\n } catch {\n existingConfig = { mcpServers: {} };\n }\n }\n\n const newServerConfig = {\n mcpServers: {\n posthog: getDefaultServerConfig(apiKey),\n },\n };\n\n const mergedConfig = merge({}, existingConfig, newServerConfig);\n\n await fs.promises.writeFile(\n configPath,\n JSON.stringify(mergedConfig, null, 2),\n 'utf8',\n );\n }\n\n async removeServer(): Promise<void> {\n const configPath = this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return;\n }\n\n try {\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = ClaudeMCPConfig.parse(JSON.parse(configContent));\n\n if (config.mcpServers && 'posthog' in config.mcpServers) {\n delete config.mcpServers.posthog;\n\n await fs.promises.writeFile(\n configPath,\n JSON.stringify(config, null, 2),\n 'utf8',\n );\n }\n } catch {\n // If we can't read or parse the config, there's nothing to remove\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { MCPClient } from '../MCPClient';
|
|
2
|
+
import { DefaultMCPClientConfig } from '../defaults';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export declare const CursorMCPConfig: z.ZodObject<{
|
|
5
|
+
mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
6
|
+
command: z.ZodString;
|
|
7
|
+
args: z.ZodArray<z.ZodString, "many">;
|
|
8
|
+
env: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
command: string;
|
|
11
|
+
args: string[];
|
|
12
|
+
env: Record<string, string>;
|
|
13
|
+
}, {
|
|
14
|
+
command: string;
|
|
15
|
+
args: string[];
|
|
16
|
+
env: Record<string, string>;
|
|
17
|
+
}>>;
|
|
18
|
+
}, "strip", z.ZodTypeAny, {
|
|
19
|
+
mcpServers: Record<string, {
|
|
20
|
+
command: string;
|
|
21
|
+
args: string[];
|
|
22
|
+
env: Record<string, string>;
|
|
23
|
+
}>;
|
|
24
|
+
}, {
|
|
25
|
+
mcpServers: Record<string, {
|
|
26
|
+
command: string;
|
|
27
|
+
args: string[];
|
|
28
|
+
env: Record<string, string>;
|
|
29
|
+
}>;
|
|
30
|
+
}>;
|
|
31
|
+
export type CursorMCPConfig = z.infer<typeof DefaultMCPClientConfig>;
|
|
32
|
+
export declare class CursorMCPClient extends MCPClient {
|
|
33
|
+
name: string;
|
|
34
|
+
constructor();
|
|
35
|
+
isClientSupported(): boolean;
|
|
36
|
+
private getConfigPath;
|
|
37
|
+
isServerInstalled(): Promise<boolean>;
|
|
38
|
+
addServer(apiKey: string): Promise<void>;
|
|
39
|
+
removeServer(): Promise<void>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CursorMCPClient = exports.CursorMCPConfig = void 0;
|
|
37
|
+
const MCPClient_1 = require("../MCPClient");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const defaults_1 = require("../defaults");
|
|
42
|
+
const lodash_1 = require("lodash");
|
|
43
|
+
exports.CursorMCPConfig = defaults_1.DefaultMCPClientConfig;
|
|
44
|
+
class CursorMCPClient extends MCPClient_1.MCPClient {
|
|
45
|
+
name = 'Cursor';
|
|
46
|
+
constructor() {
|
|
47
|
+
super();
|
|
48
|
+
}
|
|
49
|
+
isClientSupported() {
|
|
50
|
+
return process.platform === 'darwin' || process.platform === 'win32';
|
|
51
|
+
}
|
|
52
|
+
getConfigPath() {
|
|
53
|
+
return path.join(os.homedir(), '.cursor', 'mcp.json');
|
|
54
|
+
}
|
|
55
|
+
async isServerInstalled() {
|
|
56
|
+
try {
|
|
57
|
+
const configPath = this.getConfigPath();
|
|
58
|
+
if (!fs.existsSync(configPath)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const configContent = await fs.promises.readFile(configPath, 'utf8');
|
|
62
|
+
const config = exports.CursorMCPConfig.parse(JSON.parse(configContent));
|
|
63
|
+
return 'posthog' in config.mcpServers;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async addServer(apiKey) {
|
|
70
|
+
const configPath = this.getConfigPath();
|
|
71
|
+
const configDir = path.dirname(configPath);
|
|
72
|
+
await fs.promises.mkdir(configDir, { recursive: true });
|
|
73
|
+
let existingConfig = { mcpServers: {} };
|
|
74
|
+
if (fs.existsSync(configPath)) {
|
|
75
|
+
try {
|
|
76
|
+
const existingContent = await fs.promises.readFile(configPath, 'utf8');
|
|
77
|
+
existingConfig = exports.CursorMCPConfig.parse(JSON.parse(existingContent));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
existingConfig = { mcpServers: {} };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const newServerConfig = {
|
|
84
|
+
mcpServers: {
|
|
85
|
+
posthog: (0, defaults_1.getDefaultServerConfig)(apiKey),
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
const mergedConfig = (0, lodash_1.merge)({}, existingConfig, newServerConfig);
|
|
89
|
+
await fs.promises.writeFile(configPath, JSON.stringify(mergedConfig, null, 2), 'utf8');
|
|
90
|
+
}
|
|
91
|
+
async removeServer() {
|
|
92
|
+
const configPath = this.getConfigPath();
|
|
93
|
+
if (!fs.existsSync(configPath)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
let config;
|
|
97
|
+
try {
|
|
98
|
+
const configContent = await fs.promises.readFile(configPath, 'utf8');
|
|
99
|
+
config = exports.CursorMCPConfig.parse(JSON.parse(configContent));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// If we can't read or parse the config, there's nothing to remove
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (config.mcpServers && 'posthog' in config.mcpServers) {
|
|
106
|
+
delete config.mcpServers.posthog;
|
|
107
|
+
await fs.promises.writeFile(configPath, JSON.stringify(config, null, 2), 'utf8');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.CursorMCPClient = CursorMCPClient;
|
|
112
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/cursor.ts"],"names":[],"mappings":"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","sourcesContent":["import { MCPClient } from '../MCPClient';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DefaultMCPClientConfig, getDefaultServerConfig } from '../defaults';\nimport { z } from 'zod';\nimport { merge } from 'lodash';\n\nexport const CursorMCPConfig = DefaultMCPClientConfig;\n\nexport type CursorMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CursorMCPClient extends MCPClient {\n name = 'Cursor';\n\n constructor() {\n super();\n }\n\n isClientSupported(): boolean {\n return process.platform === 'darwin' || process.platform === 'win32';\n }\n\n private getConfigPath(): string {\n return path.join(os.homedir(), '.cursor', 'mcp.json');\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const configPath = 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 = CursorMCPConfig.parse(JSON.parse(configContent));\n\n return 'posthog' in config.mcpServers;\n } catch {\n return false;\n }\n }\n\n async addServer(apiKey: string): Promise<void> {\n const configPath = this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n await fs.promises.mkdir(configDir, { recursive: true });\n\n let existingConfig: CursorMCPConfig = { mcpServers: {} };\n\n if (fs.existsSync(configPath)) {\n try {\n const existingContent = await fs.promises.readFile(configPath, 'utf8');\n existingConfig = CursorMCPConfig.parse(JSON.parse(existingContent));\n } catch {\n existingConfig = { mcpServers: {} };\n }\n }\n\n const newServerConfig = {\n mcpServers: {\n posthog: getDefaultServerConfig(apiKey),\n },\n };\n\n const mergedConfig = merge({}, existingConfig, newServerConfig);\n\n await fs.promises.writeFile(\n configPath,\n JSON.stringify(mergedConfig, null, 2),\n 'utf8',\n );\n }\n\n async removeServer(): Promise<void> {\n const configPath = this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return;\n }\n\n let config: CursorMCPConfig;\n\n try {\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n config = CursorMCPConfig.parse(JSON.parse(configContent));\n } catch {\n // If we can't read or parse the config, there's nothing to remove\n return;\n }\n\n if (config.mcpServers && 'posthog' in config.mcpServers) {\n delete config.mcpServers.posthog;\n\n await fs.promises.writeFile(\n configPath,\n JSON.stringify(config, null, 2),\n 'utf8',\n );\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import z from 'zod';
|
|
2
|
+
export declare const DefaultMCPClientConfig: z.ZodObject<{
|
|
3
|
+
mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
4
|
+
command: z.ZodString;
|
|
5
|
+
args: z.ZodArray<z.ZodString, "many">;
|
|
6
|
+
env: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
command: string;
|
|
9
|
+
args: string[];
|
|
10
|
+
env: Record<string, string>;
|
|
11
|
+
}, {
|
|
12
|
+
command: string;
|
|
13
|
+
args: string[];
|
|
14
|
+
env: Record<string, string>;
|
|
15
|
+
}>>;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
mcpServers: Record<string, {
|
|
18
|
+
command: string;
|
|
19
|
+
args: string[];
|
|
20
|
+
env: Record<string, string>;
|
|
21
|
+
}>;
|
|
22
|
+
}, {
|
|
23
|
+
mcpServers: Record<string, {
|
|
24
|
+
command: string;
|
|
25
|
+
args: string[];
|
|
26
|
+
env: Record<string, string>;
|
|
27
|
+
}>;
|
|
28
|
+
}>;
|
|
29
|
+
export declare const getDefaultServerConfig: (apiKey: string) => {
|
|
30
|
+
command: string;
|
|
31
|
+
args: string[];
|
|
32
|
+
env: {
|
|
33
|
+
POSTHOG_AUTH_HEADER: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getDefaultServerConfig = exports.DefaultMCPClientConfig = void 0;
|
|
7
|
+
const zod_1 = __importDefault(require("zod"));
|
|
8
|
+
exports.DefaultMCPClientConfig = zod_1.default.object({
|
|
9
|
+
mcpServers: zod_1.default.record(zod_1.default.string(), zod_1.default.object({
|
|
10
|
+
command: zod_1.default.string(),
|
|
11
|
+
args: zod_1.default.array(zod_1.default.string()),
|
|
12
|
+
env: zod_1.default.record(zod_1.default.string(), zod_1.default.string()),
|
|
13
|
+
})),
|
|
14
|
+
});
|
|
15
|
+
const getDefaultServerConfig = (apiKey) => ({
|
|
16
|
+
command: 'npx',
|
|
17
|
+
args: [
|
|
18
|
+
'-y',
|
|
19
|
+
'mcp-remote@latest',
|
|
20
|
+
'https://mcp.posthog.com/sse',
|
|
21
|
+
'--header',
|
|
22
|
+
`Authorization:\${POSTHOG_AUTH_HEADER}`,
|
|
23
|
+
],
|
|
24
|
+
env: {
|
|
25
|
+
POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
exports.getDefaultServerConfig = getDefaultServerConfig;
|
|
29
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/defaults.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEP,QAAA,sBAAsB,GAAG,aAAC,CAAC,MAAM,CAAC;IAC7C,UAAU,EAAE,aAAC,CAAC,MAAM,CAClB,aAAC,CAAC,MAAM,EAAE,EACV,aAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,aAAC,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,aAAC,CAAC,KAAK,CAAC,aAAC,CAAC,MAAM,EAAE,CAAC;QACzB,GAAG,EAAE,aAAC,CAAC,MAAM,CAAC,aAAC,CAAC,MAAM,EAAE,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC;KACtC,CAAC,CACH;CACF,CAAC,CAAC;AAEI,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,EAAE,KAAK;IACd,IAAI,EAAE;QACJ,IAAI;QACJ,mBAAmB;QACnB,6BAA6B;QAC7B,UAAU;QACV,uCAAuC;KACxC;IACD,GAAG,EAAE;QACH,mBAAmB,EAAE,UAAU,MAAM,EAAE;KACxC;CACF,CAAC,CAAC;AAZU,QAAA,sBAAsB,0BAYhC","sourcesContent":["import z from 'zod';\n\nexport const DefaultMCPClientConfig = z.object({\n mcpServers: z.record(\n z.string(),\n z.object({\n command: z.string(),\n args: z.array(z.string()),\n env: z.record(z.string(), z.string()),\n }),\n ),\n});\n\nexport const getDefaultServerConfig = (apiKey: string) => ({\n command: 'npx',\n args: [\n '-y',\n 'mcp-remote@latest',\n 'https://mcp.posthog.com/sse',\n '--header',\n `Authorization:\\${POSTHOG_AUTH_HEADER}`,\n ],\n env: {\n POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,\n },\n});\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Integration } from '../../lib/constants';
|
|
2
|
+
import { MCPClient } from './MCPClient';
|
|
3
|
+
import type { CloudRegion } from '../../utils/types';
|
|
4
|
+
export declare const getSupportedClients: () => MCPClient[];
|
|
5
|
+
export declare const addMCPServerToClientsStep: ({ integration, cloudRegion, askPermission, }: {
|
|
6
|
+
integration?: Integration;
|
|
7
|
+
cloudRegion?: CloudRegion;
|
|
8
|
+
askPermission?: boolean;
|
|
9
|
+
}) => Promise<string[]>;
|
|
10
|
+
export declare const removeMCPServerFromClientsStep: ({ integration, }: {
|
|
11
|
+
integration?: Integration;
|
|
12
|
+
}) => Promise<string[]>;
|
|
13
|
+
export declare const getInstalledClients: () => Promise<MCPClient[]>;
|
|
14
|
+
export declare const addMCPServer: (clients: MCPClient[], personalApiKey: string) => Promise<void>;
|
|
15
|
+
export declare const removeMCPServer: (clients: MCPClient[]) => Promise<void>;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.removeMCPServer = exports.addMCPServer = exports.getInstalledClients = exports.removeMCPServerFromClientsStep = exports.addMCPServerToClientsStep = exports.getSupportedClients = void 0;
|
|
7
|
+
const telemetry_1 = require("../../telemetry");
|
|
8
|
+
const analytics_1 = require("../../utils/analytics");
|
|
9
|
+
const clack_1 = __importDefault(require("../../utils/clack"));
|
|
10
|
+
const clack_utils_1 = require("../../utils/clack-utils");
|
|
11
|
+
const cursor_1 = require("./clients/cursor");
|
|
12
|
+
const claude_1 = require("./clients/claude");
|
|
13
|
+
const mcp_1 = require("../../mcp");
|
|
14
|
+
const getSupportedClients = () => {
|
|
15
|
+
return [new cursor_1.CursorMCPClient(), new claude_1.ClaudeMCPClient()].filter((client) => client.isClientSupported());
|
|
16
|
+
};
|
|
17
|
+
exports.getSupportedClients = getSupportedClients;
|
|
18
|
+
const addMCPServerToClientsStep = async ({ integration, cloudRegion, askPermission = true, }) => {
|
|
19
|
+
const hasPermission = askPermission
|
|
20
|
+
? await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
|
|
21
|
+
message: 'Would you like to install the PostHog MCP server to use PostHog in your editor?',
|
|
22
|
+
options: [
|
|
23
|
+
{ value: true, label: 'Yes' },
|
|
24
|
+
{ value: false, label: 'No' },
|
|
25
|
+
],
|
|
26
|
+
}), integration)
|
|
27
|
+
: true;
|
|
28
|
+
if (!hasPermission) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const clients = (0, exports.getSupportedClients)();
|
|
32
|
+
const installedClients = await (0, exports.getInstalledClients)();
|
|
33
|
+
if (installedClients.length > 0) {
|
|
34
|
+
clack_1.default.log.warn(`The PostHog MCP server is already configured for:
|
|
35
|
+
|
|
36
|
+
${installedClients.map((c) => `- ${c.name}`).join('\n ')}`);
|
|
37
|
+
const reinstall = await clack_1.default.select({
|
|
38
|
+
message: 'Would you like to reinstall it?',
|
|
39
|
+
options: [
|
|
40
|
+
{
|
|
41
|
+
value: true,
|
|
42
|
+
label: 'Yes',
|
|
43
|
+
hint: 'Reinstall the MCP server',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
value: false,
|
|
47
|
+
label: 'No',
|
|
48
|
+
hint: 'Keep the existing installation',
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
});
|
|
52
|
+
if (!reinstall) {
|
|
53
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
54
|
+
action: 'declined to reinstall mcp servers',
|
|
55
|
+
clients: installedClients.map((c) => c.name),
|
|
56
|
+
integration,
|
|
57
|
+
});
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
await (0, exports.removeMCPServer)(installedClients);
|
|
61
|
+
clack_1.default.log.info('Removed existing installation.');
|
|
62
|
+
}
|
|
63
|
+
const personalApiKey = await (0, mcp_1.getPersonalApiKey)({ region: cloudRegion });
|
|
64
|
+
await (0, telemetry_1.traceStep)('adding mcp servers', async () => {
|
|
65
|
+
await (0, exports.addMCPServer)(clients, personalApiKey);
|
|
66
|
+
});
|
|
67
|
+
clack_1.default.log.success(`Added the PostHog MCP server to:
|
|
68
|
+
${clients.map((c) => `- ${c.name}`).join('\n ')} `);
|
|
69
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
70
|
+
action: 'added mcp servers',
|
|
71
|
+
clients: clients.map((c) => c.name),
|
|
72
|
+
integration,
|
|
73
|
+
});
|
|
74
|
+
return clients.map((c) => c.name);
|
|
75
|
+
};
|
|
76
|
+
exports.addMCPServerToClientsStep = addMCPServerToClientsStep;
|
|
77
|
+
const removeMCPServerFromClientsStep = async ({ integration, }) => {
|
|
78
|
+
const installedClients = await (0, exports.getInstalledClients)();
|
|
79
|
+
if (installedClients.length === 0) {
|
|
80
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
81
|
+
action: 'no mcp servers to remove',
|
|
82
|
+
integration,
|
|
83
|
+
});
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
const removeServers = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
|
|
87
|
+
message: `Found the PostHog MCP server in ${installedClients.length} clients. Would you like to remove it?`,
|
|
88
|
+
options: [
|
|
89
|
+
{
|
|
90
|
+
value: true,
|
|
91
|
+
label: 'Yes',
|
|
92
|
+
hint: `Remove PostHog MCP server`,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
value: false,
|
|
96
|
+
label: 'No',
|
|
97
|
+
hint: 'Keep the MCP server configuration',
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
}), integration);
|
|
101
|
+
if (!removeServers) {
|
|
102
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
103
|
+
action: 'declined to remove mcp servers',
|
|
104
|
+
clients: installedClients.map((c) => c.name),
|
|
105
|
+
integration,
|
|
106
|
+
});
|
|
107
|
+
await (0, clack_utils_1.abort)('The MCP server was not removed.');
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
const results = await (0, telemetry_1.traceStep)('removing mcp servers', async () => {
|
|
111
|
+
await (0, exports.removeMCPServer)(installedClients);
|
|
112
|
+
return installedClients.map((c) => c.name);
|
|
113
|
+
});
|
|
114
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
115
|
+
action: 'removed mcp servers',
|
|
116
|
+
clients: results,
|
|
117
|
+
integration,
|
|
118
|
+
});
|
|
119
|
+
return results;
|
|
120
|
+
};
|
|
121
|
+
exports.removeMCPServerFromClientsStep = removeMCPServerFromClientsStep;
|
|
122
|
+
const getInstalledClients = async () => {
|
|
123
|
+
const clients = (0, exports.getSupportedClients)();
|
|
124
|
+
const installedClients = [];
|
|
125
|
+
for (const client of clients) {
|
|
126
|
+
if (await client.isServerInstalled()) {
|
|
127
|
+
installedClients.push(client);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return installedClients;
|
|
131
|
+
};
|
|
132
|
+
exports.getInstalledClients = getInstalledClients;
|
|
133
|
+
const addMCPServer = async (clients, personalApiKey) => {
|
|
134
|
+
for (const client of clients) {
|
|
135
|
+
await client.addServer(personalApiKey);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
exports.addMCPServer = addMCPServer;
|
|
139
|
+
const removeMCPServer = async (clients) => {
|
|
140
|
+
for (const client of clients) {
|
|
141
|
+
await client.removeServer();
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
exports.removeMCPServer = removeMCPServer;
|
|
145
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Integration } from '../../lib/constants';\nimport { traceStep } from '../../telemetry';\nimport { analytics } from '../../utils/analytics';\nimport clack from '../../utils/clack';\nimport { abort, abortIfCancelled } from '../../utils/clack-utils';\nimport { MCPClient } from './MCPClient';\nimport { CursorMCPClient } from './clients/cursor';\nimport { ClaudeMCPClient } from './clients/claude';\nimport { getPersonalApiKey } from '../../mcp';\nimport type { CloudRegion } from '../../utils/types';\n\nexport const getSupportedClients = (): MCPClient[] => {\n return [new CursorMCPClient(), new ClaudeMCPClient()].filter((client) =>\n client.isClientSupported(),\n );\n};\n\nexport const addMCPServerToClientsStep = async ({\n integration,\n cloudRegion,\n askPermission = true,\n}: {\n integration?: Integration;\n cloudRegion?: CloudRegion;\n askPermission?: boolean;\n}): Promise<string[]> => {\n const hasPermission = askPermission\n ? await abortIfCancelled(\n clack.select({\n message:\n 'Would you like to install the PostHog MCP server to use PostHog in your editor?',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ],\n }),\n integration,\n )\n : true;\n\n if (!hasPermission) {\n return [];\n }\n\n const clients = getSupportedClients();\n\n const installedClients = await getInstalledClients();\n\n if (installedClients.length > 0) {\n clack.log.warn(\n `The PostHog MCP server is already configured for:\n\n ${installedClients.map((c) => `- ${c.name}`).join('\\n ')}`,\n );\n\n const reinstall = await clack.select({\n message: 'Would you like to reinstall it?',\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Reinstall the MCP server',\n },\n {\n value: false,\n label: 'No',\n hint: 'Keep the existing installation',\n },\n ],\n });\n\n if (!reinstall) {\n analytics.capture('wizard interaction', {\n action: 'declined to reinstall mcp servers',\n clients: installedClients.map((c) => c.name),\n integration,\n });\n\n return [];\n }\n\n await removeMCPServer(installedClients);\n clack.log.info('Removed existing installation.');\n }\n\n const personalApiKey = await getPersonalApiKey({ region: cloudRegion });\n\n await traceStep('adding mcp servers', async () => {\n await addMCPServer(clients, personalApiKey);\n });\n\n clack.log.success(\n `Added the PostHog MCP server to:\n ${clients.map((c) => `- ${c.name}`).join('\\n ')} `,\n );\n\n analytics.capture('wizard interaction', {\n action: 'added mcp servers',\n clients: clients.map((c) => c.name),\n integration,\n });\n\n return clients.map((c) => c.name);\n};\n\nexport const removeMCPServerFromClientsStep = async ({\n integration,\n}: {\n integration?: Integration;\n}): Promise<string[]> => {\n const installedClients = await getInstalledClients();\n\n if (installedClients.length === 0) {\n analytics.capture('wizard interaction', {\n action: 'no mcp servers to remove',\n integration,\n });\n return [];\n }\n\n const removeServers: boolean = await abortIfCancelled(\n clack.select({\n message: `Found the PostHog MCP server in ${installedClients.length} clients. Would you like to remove it?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: `Remove PostHog MCP server`,\n },\n {\n value: false,\n label: 'No',\n hint: 'Keep the MCP server configuration',\n },\n ],\n }),\n integration,\n );\n\n if (!removeServers) {\n analytics.capture('wizard interaction', {\n action: 'declined to remove mcp servers',\n clients: installedClients.map((c) => c.name),\n integration,\n });\n\n await abort('The MCP server was not removed.');\n return [];\n }\n\n const results = await traceStep('removing mcp servers', async () => {\n await removeMCPServer(installedClients);\n\n return installedClients.map((c) => c.name);\n });\n\n analytics.capture('wizard interaction', {\n action: 'removed mcp servers',\n clients: results,\n integration,\n });\n\n return results;\n};\n\nexport const getInstalledClients = async (): Promise<MCPClient[]> => {\n const clients = getSupportedClients();\n\n const installedClients: MCPClient[] = [];\n\n for (const client of clients) {\n if (await client.isServerInstalled()) {\n installedClients.push(client);\n }\n }\n\n return installedClients;\n};\n\nexport const addMCPServer = async (\n clients: MCPClient[],\n personalApiKey: string,\n): Promise<void> => {\n for (const client of clients) {\n await client.addServer(personalApiKey);\n }\n};\n\nexport const removeMCPServer = async (clients: MCPClient[]): Promise<void> => {\n for (const client of clients) {\n await client.removeServer();\n }\n};\n"]}
|
package/dist/src/steps/index.js
CHANGED
|
@@ -18,4 +18,6 @@ __exportStar(require("./add-editor-rules"), exports);
|
|
|
18
18
|
__exportStar(require("./create-pr"), exports);
|
|
19
19
|
__exportStar(require("./run-prettier"), exports);
|
|
20
20
|
__exportStar(require("./add-or-update-environment-variables"), exports);
|
|
21
|
+
__exportStar(require("./add-mcp-server-to-clients"), exports);
|
|
22
|
+
__exportStar(require("./upload-environment-variables"), exports);
|
|
21
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,8CAA4B;AAC5B,iDAA+B;AAC/B,wEAAsD","sourcesContent":["export * from './add-editor-rules';\nexport * from './create-pr';\nexport * from './run-prettier';\nexport * from './add-or-update-environment-variables';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,8CAA4B;AAC5B,iDAA+B;AAC/B,wEAAsD;AACtD,8DAA4C;AAC5C,iEAA+C","sourcesContent":["export * from './add-editor-rules';\nexport * from './create-pr';\nexport * from './run-prettier';\nexport * from './add-or-update-environment-variables';\nexport * from './add-mcp-server-to-clients';\nexport * from './upload-environment-variables';\n"]}
|
package/dist/src/svelte/docs.js
CHANGED
|
@@ -23,7 +23,8 @@ export const load = async () => {
|
|
|
23
23
|
{
|
|
24
24
|
api_host: PUBLIC_POSTHOG_HOST,
|
|
25
25
|
capture_pageview: false,
|
|
26
|
-
capture_pageleave: false
|
|
26
|
+
capture_pageleave: false,
|
|
27
|
+
capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this
|
|
27
28
|
}
|
|
28
29
|
)
|
|
29
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/svelte/docs.ts"],"names":[],"mappings":";;;AAAO,MAAM,sBAAsB,GAAG,CAAC,EACrC,QAAQ,GAGT,EAAE,EAAE;IACH,OAAO;;oBAGL,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IACrC,6BAA6B,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;0EAElE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IACrC
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/svelte/docs.ts"],"names":[],"mappings":";;;AAAO,MAAM,sBAAsB,GAAG,CAAC,EACrC,QAAQ,GAGT,EAAE,EAAE;IACH,OAAO;;oBAGL,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IACrC,6BAA6B,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;0EAElE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oEAmDE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mDAkDiD,CAAC;AACpD,CAAC,CAAC;AAnHW,QAAA,sBAAsB,0BAmHjC","sourcesContent":["export const getSvelteDocumentation = ({\n language,\n}: {\n language: 'typescript' | 'javascript';\n}) => {\n return `\n==============================\nFILE: Root layout.${\n language === 'typescript' ? 'ts' : 'js'\n } file (e.g routes/+layout.${language === 'typescript' ? 'ts' : 'js'})\nLOCATION: Usually placed at the root of the app (e.g src/routes/+layout.${\n language === 'typescript' ? 'ts' : 'js'\n })\n==============================\nChanges:\n- Add a load function to initialize PostHog, checking if the browser is available to make sure it only initializes on the client\nExample:\n--------------------------------------------------\nimport posthog from 'posthog-js'\nimport { browser } from '$app/environment';\nimport { PUBLIC_POSTHOG_KEY } from '$env/static/public';\n\nexport const load = async () => {\n\n if (browser) {\n posthog.init(\n PUBLIC_POSTHOG_KEY,\n {\n api_host: PUBLIC_POSTHOG_HOST,\n capture_pageview: false,\n capture_pageleave: false,\n capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this\n }\n )\n }\n return\n};\n--------------------------------------------------\n\n==============================\nFile: Root layout .svelte file (e.g routes/+layout.svelte)\nLOCATION: Usually placed at the root of the app (e.g src/routes/+layout.svelte)\n==============================\nChanges:\n- Add pageview & pageleave tracking to the layout\n\nExample:\n--------------------------------------------------\n<script>\n import { browser } from '$app/environment';\n import { beforeNavigate, afterNavigate } from '$app/navigation';\n import posthog from 'posthog-js'\n\n if (browser) {\n beforeNavigate(() => posthog.capture('$pageleave'));\n afterNavigate(() => posthog.capture('$pageview'));\n }\n</script>\n--------------------------------------------------\n\n==============================\nFile: PostHog server initializion\nLOCATION: With other server-side code, e.g. src/lib/server/posthog${\n language === 'typescript' ? '.ts' : '.js'\n }\n==============================\nChanges:\n- Initialize a PostHog client for the server using posthog-node that can be used in other server-side code\nExample:\n--------------------------------------------------\nimport posthog, { PostHog } from 'posthog-node';\nimport { PUBLIC_POSTHOG_KEY, PUBLIC_POSTHOG_HOST } from '$env/static/public';\n\nlet _client: PostHog | null = null;\n\nexport function getPostHogClient() {\n if (!_client) {\n _client = new posthog.PostHog(PUBLIC_POSTHOG_KEY, {\n host: PUBLIC_POSTHOG_HOST,\n });\n }\n return _client;\n}\n--------------------------------------------------\n\n==============================\nFILE: Svelte Config (e.g svelte.config.js)\nLOCATION: Wherever the root of the app is\n==============================\nChanges:\n- Set config to not use relative asset paths\n\nExample:\n--------------------------------------------------\nimport adapter from '@sveltejs/adapter-auto';\nimport { vitePreprocess } from '@sveltejs/vite-plugin-svelte';\n\n/** @type {import('@sveltejs/kit').Config} */\nconst config = {\n\t// Consult https://svelte.dev/docs/kit/integrations\n\t// for more information about preprocessors\n\tpreprocess: vitePreprocess(),\n\n\tkit: {\n // ...\n paths: {\n relative: false, // Required for PostHog session replay to work correctly\n },\n // ...\n\t}\n};\n\nexport default config;\n\n--------------------------------------------------`;\n};\n"]}
|
|
@@ -18,7 +18,7 @@ const messages_1 = require("../lib/messages");
|
|
|
18
18
|
const steps_1 = require("../steps");
|
|
19
19
|
async function runSvelteWizard(options) {
|
|
20
20
|
(0, clack_utils_1.printWelcome)({
|
|
21
|
-
wizardName: 'PostHog Svelte
|
|
21
|
+
wizardName: 'PostHog Svelte wizard',
|
|
22
22
|
});
|
|
23
23
|
const aiConsent = await (0, clack_utils_1.askForAIConsent)(options);
|
|
24
24
|
if (!aiConsent) {
|
|
@@ -98,7 +98,10 @@ async function runSvelteWizard(options) {
|
|
|
98
98
|
installDir: options.installDir,
|
|
99
99
|
rulesName: 'svelte-rules.md',
|
|
100
100
|
integration: constants_1.Integration.svelte,
|
|
101
|
-
|
|
101
|
+
});
|
|
102
|
+
await (0, steps_1.addMCPServerToClientsStep)({
|
|
103
|
+
cloudRegion,
|
|
104
|
+
integration: constants_1.Integration.svelte,
|
|
102
105
|
});
|
|
103
106
|
const outroMessage = (0, messages_1.getOutroMessage)({
|
|
104
107
|
options,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svelte-wizard.js","sourceRoot":"","sources":["../../../src/svelte/svelte-wizard.ts"],"names":[],"mappings":";AAAA,8BAA8B;;;;;
|
|
1
|
+
{"version":3,"file":"svelte-wizard.js","sourceRoot":"","sources":["../../../src/svelte/svelte-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport { getSvelteDocumentation } from './docs';\nimport { analytics } from '../utils/analytics';\nimport {\n generateFileChangesForIntegration,\n getFilesToChange,\n getRelevantFilesForIntegration,\n} from '../utils/file-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { addEditorRulesStep } from '../steps/add-editor-rules';\nimport { getOutroMessage } from '../lib/messages';\nimport {\n addMCPServerToClientsStep,\n addOrUpdateEnvironmentVariablesStep,\n runPrettierStep,\n} from '../steps';\n\nexport async function runSvelteWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Svelte wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Svelte wizard requires AI to get setup right now. Please view the docs to setup Svelte manually instead: https://posthog.com/docs/libraries/svelte',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n\n await ensurePackageIsInstalled(packageJson, '@sveltejs/kit', '@sveltejs/kit');\n\n const svelteVersion = getPackageVersion('@sveltejs/kit', packageJson);\n\n if (svelteVersion) {\n analytics.setTag('svelte-version', svelteVersion);\n }\n\n const { projectApiKey, wizardHash, host } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n const sdkAlreadyInstalled = hasPackageInstalled('posthog-js', packageJson);\n\n analytics.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: 'posthog-js',\n packageNameDisplayLabel: 'posthog-js',\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-js'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n await installPackage({\n packageName: 'posthog-node',\n packageNameDisplayLabel: 'posthog-node',\n packageManager: packageManagerFromInstallStep,\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const installationDocumentation = getSvelteDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(`Reviewing PostHog documentation for Svelte`);\n\n const filesToChange = await getFilesToChange({\n integration: Integration.svelte,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.svelte,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n ['PUBLIC_POSTHOG_KEY']: projectApiKey,\n ['PUBLIC_POSTHOG_HOST']: host,\n },\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'svelte-rules.md',\n integration: Integration.svelte,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.svelte,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.svelte,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n uploadedEnvVars: [],\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n"]}
|
|
@@ -84,7 +84,7 @@ export declare function isUsingTypeScript({ installDir, }: Pick<WizardOptions, '
|
|
|
84
84
|
* @param options wizard options
|
|
85
85
|
* @returns project data (token, url)
|
|
86
86
|
*/
|
|
87
|
-
export declare function getOrAskForProjectData(_options: WizardOptions & {
|
|
87
|
+
export declare function getOrAskForProjectData(_options: Pick<WizardOptions, 'signup'> & {
|
|
88
88
|
cloudRegion: CloudRegion;
|
|
89
89
|
}): Promise<{
|
|
90
90
|
wizardHash: string;
|
|
@@ -198,7 +198,7 @@ async function confirmContinueIfPackageVersionNotSupported({ packageId, packageN
|
|
|
198
198
|
|
|
199
199
|
${packageId}@${packageVersion}`);
|
|
200
200
|
clack_1.default.note(note ??
|
|
201
|
-
`Please upgrade to ${acceptableVersions} if you wish to use the PostHog
|
|
201
|
+
`Please upgrade to ${acceptableVersions} if you wish to use the PostHog wizard.`);
|
|
202
202
|
const continueWithUnsupportedVersion = await abortIfCancelled(clack_1.default.confirm({
|
|
203
203
|
message: 'Do you want to continue anyway?',
|
|
204
204
|
}));
|
|
@@ -246,7 +246,7 @@ async function installPackage({ packageName, alreadyInstalled, askBeforeUpdating
|
|
|
246
246
|
}
|
|
247
247
|
catch (e) {
|
|
248
248
|
sdkInstallSpinner.stop('Installation failed.');
|
|
249
|
-
clack_1.default.log.error(`${chalk_1.default.red('Encountered the following error during installation:')}\n\n${e}\n\n${chalk_1.default.dim(`The wizard has created a \`posthog-wizard-installation-error-*.log\` file. If you think this issue is caused by the PostHog
|
|
249
|
+
clack_1.default.log.error(`${chalk_1.default.red('Encountered the following error during installation:')}\n\n${e}\n\n${chalk_1.default.dim(`The wizard has created a \`posthog-wizard-installation-error-*.log\` file. If you think this issue is caused by the PostHog wizard, create an issue on GitHub and include the log file's content:\n${constants_1.ISSUES_URL}`)}`);
|
|
250
250
|
await abort();
|
|
251
251
|
}
|
|
252
252
|
sdkInstallSpinner.stop(`${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk_1.default.bold.cyan(packageNameDisplayLabel ?? packageName)} with ${chalk_1.default.bold(pkgManager.label)}.`);
|
|
@@ -419,7 +419,7 @@ async function askForWizardLogin(options) {
|
|
|
419
419
|
clearInterval(pollingInterval);
|
|
420
420
|
loginSpinner.stop('Login timed out. No worries - it happens to the best of us.');
|
|
421
421
|
analytics_1.analytics.setTag('opened-wizard-link', false);
|
|
422
|
-
void abort('Please restart the
|
|
422
|
+
void abort('Please restart the wizard and log in to complete the setup.');
|
|
423
423
|
}, 180_000);
|
|
424
424
|
});
|
|
425
425
|
loginSpinner.stop(`Login complete. ${options.signup ? 'Welcome to PostHog! 🎉' : ''}`);
|