@posthog/wizard 1.32.1 → 1.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/src/android/android-wizard-agent.js +2 -0
  2. package/dist/src/android/android-wizard-agent.js.map +1 -1
  3. package/dist/src/angular/angular-wizard-agent.js +2 -1
  4. package/dist/src/angular/angular-wizard-agent.js.map +1 -1
  5. package/dist/src/astro/astro-wizard-agent.js +2 -1
  6. package/dist/src/astro/astro-wizard-agent.js.map +1 -1
  7. package/dist/src/django/django-wizard-agent.js +4 -1
  8. package/dist/src/django/django-wizard-agent.js.map +1 -1
  9. package/dist/src/fastapi/fastapi-wizard-agent.js +4 -1
  10. package/dist/src/fastapi/fastapi-wizard-agent.js.map +1 -1
  11. package/dist/src/flask/flask-wizard-agent.js +4 -1
  12. package/dist/src/flask/flask-wizard-agent.js.map +1 -1
  13. package/dist/src/laravel/laravel-wizard-agent.js +2 -0
  14. package/dist/src/laravel/laravel-wizard-agent.js.map +1 -1
  15. package/dist/src/lib/__tests__/package-manager-detection.test.d.ts +1 -0
  16. package/dist/src/lib/__tests__/package-manager-detection.test.js +195 -0
  17. package/dist/src/lib/__tests__/package-manager-detection.test.js.map +1 -0
  18. package/dist/src/lib/__tests__/wizard-tools.test.d.ts +1 -0
  19. package/dist/src/lib/__tests__/wizard-tools.test.js +200 -0
  20. package/dist/src/lib/__tests__/wizard-tools.test.js.map +1 -0
  21. package/dist/src/lib/agent-interface.d.ts +2 -0
  22. package/dist/src/lib/agent-interface.js +12 -9
  23. package/dist/src/lib/agent-interface.js.map +1 -1
  24. package/dist/src/lib/agent-runner.js +7 -4
  25. package/dist/src/lib/agent-runner.js.map +1 -1
  26. package/dist/src/lib/framework-config.d.ts +15 -2
  27. package/dist/src/lib/framework-config.js +8 -1
  28. package/dist/src/lib/framework-config.js.map +1 -1
  29. package/dist/src/lib/package-manager-detection.d.ts +36 -0
  30. package/dist/src/lib/package-manager-detection.js +166 -0
  31. package/dist/src/lib/package-manager-detection.js.map +1 -0
  32. package/dist/src/lib/wizard-tools.d.ts +40 -0
  33. package/dist/src/lib/{env-file-tools.js → wizard-tools.js} +95 -46
  34. package/dist/src/lib/wizard-tools.js.map +1 -0
  35. package/dist/src/nextjs/nextjs-wizard-agent.js +2 -1
  36. package/dist/src/nextjs/nextjs-wizard-agent.js.map +1 -1
  37. package/dist/src/nuxt/nuxt-wizard-agent.js +2 -1
  38. package/dist/src/nuxt/nuxt-wizard-agent.js.map +1 -1
  39. package/dist/src/python/python-wizard-agent.js +4 -1
  40. package/dist/src/python/python-wizard-agent.js.map +1 -1
  41. package/dist/src/react-native/react-native-wizard-agent.js +2 -1
  42. package/dist/src/react-native/react-native-wizard-agent.js.map +1 -1
  43. package/dist/src/react-router/react-router-wizard-agent.js +2 -1
  44. package/dist/src/react-router/react-router-wizard-agent.js.map +1 -1
  45. package/dist/src/run.js +13 -3
  46. package/dist/src/run.js.map +1 -1
  47. package/dist/src/svelte/svelte-wizard-agent.js +2 -1
  48. package/dist/src/svelte/svelte-wizard-agent.js.map +1 -1
  49. package/dist/src/swift/swift-wizard-agent.js +2 -0
  50. package/dist/src/swift/swift-wizard-agent.js.map +1 -1
  51. package/dist/src/tanstack-router/tanstack-router-wizard-agent.js +2 -1
  52. package/dist/src/tanstack-router/tanstack-router-wizard-agent.js.map +1 -1
  53. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js +2 -1
  54. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +1 -1
  55. package/dist/src/vue/vue-wizard-agent.js +2 -1
  56. package/dist/src/vue/vue-wizard-agent.js.map +1 -1
  57. package/package.json +1 -1
  58. package/dist/src/lib/env-file-tools.d.ts +0 -11
  59. package/dist/src/lib/env-file-tools.js.map +0 -1
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-ecosystem package manager detection.
4
+ *
5
+ * Provides a common interface (PackageManagerDetector) that each FrameworkConfig
6
+ * implements, plus shared helpers for Node.js, Python, PHP, and Swift ecosystems.
7
+ * The MCP tool in wizard-tools.ts delegates to whatever detector the
8
+ * current framework supplies.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.detectNodePackageManagers = detectNodePackageManagers;
12
+ exports.detectPythonPackageManagers = detectPythonPackageManagers;
13
+ exports.composerPackageManager = composerPackageManager;
14
+ exports.swiftPackageManager = swiftPackageManager;
15
+ exports.gradlePackageManager = gradlePackageManager;
16
+ const package_manager_1 = require("../utils/package-manager");
17
+ const utils_1 = require("../python/utils");
18
+ // ---------------------------------------------------------------------------
19
+ // Node.js helper
20
+ // ---------------------------------------------------------------------------
21
+ function serializeNodePM(pm) {
22
+ return {
23
+ name: pm.name,
24
+ label: pm.label,
25
+ installCommand: pm.installCommand,
26
+ runCommand: pm.runScriptCommand,
27
+ };
28
+ }
29
+ /**
30
+ * Detect Node.js package managers via lockfiles.
31
+ * Wraps the existing detectAllPackageManagers() from utils/package-manager.ts.
32
+ */
33
+ function detectNodePackageManagers(installDir) {
34
+ const detected = (0, package_manager_1.detectAllPackageManagers)({ installDir }).map(serializeNodePM);
35
+ if (detected.length === 0) {
36
+ return Promise.resolve({
37
+ detected: [],
38
+ primary: null,
39
+ recommendation: 'No lockfile found. Default to npm (npm add, npm run).',
40
+ });
41
+ }
42
+ const primary = detected[0];
43
+ return Promise.resolve({
44
+ detected,
45
+ primary,
46
+ recommendation: detected.length === 1
47
+ ? `Use ${primary.label} (${primary.installCommand}).`
48
+ : `Multiple package managers detected. Prefer ${primary.label} (${primary.installCommand}).`,
49
+ });
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Python helper
53
+ // ---------------------------------------------------------------------------
54
+ const PYTHON_PM_INFO = {
55
+ [utils_1.PythonPackageManager.UV]: {
56
+ name: 'uv',
57
+ label: 'uv',
58
+ installCommand: 'uv add',
59
+ runCommand: 'uv run',
60
+ },
61
+ [utils_1.PythonPackageManager.POETRY]: {
62
+ name: 'poetry',
63
+ label: 'Poetry',
64
+ installCommand: 'poetry add',
65
+ runCommand: 'poetry run',
66
+ },
67
+ [utils_1.PythonPackageManager.PDM]: {
68
+ name: 'pdm',
69
+ label: 'PDM',
70
+ installCommand: 'pdm add',
71
+ runCommand: 'pdm run',
72
+ },
73
+ [utils_1.PythonPackageManager.HATCH]: {
74
+ name: 'hatch',
75
+ label: 'Hatch',
76
+ installCommand: 'hatch add',
77
+ runCommand: 'hatch run',
78
+ },
79
+ [utils_1.PythonPackageManager.RYE]: {
80
+ name: 'rye',
81
+ label: 'Rye',
82
+ installCommand: 'rye add',
83
+ runCommand: 'rye run',
84
+ },
85
+ [utils_1.PythonPackageManager.PIPENV]: {
86
+ name: 'pipenv',
87
+ label: 'Pipenv',
88
+ installCommand: 'pipenv install',
89
+ runCommand: 'pipenv run',
90
+ },
91
+ [utils_1.PythonPackageManager.CONDA]: {
92
+ name: 'conda',
93
+ label: 'Conda',
94
+ installCommand: 'conda install',
95
+ runCommand: 'conda run',
96
+ },
97
+ [utils_1.PythonPackageManager.PIP]: {
98
+ name: 'pip',
99
+ label: 'pip',
100
+ installCommand: 'pip install',
101
+ },
102
+ [utils_1.PythonPackageManager.UNKNOWN]: {
103
+ name: 'pip',
104
+ label: 'pip (default)',
105
+ installCommand: 'pip install',
106
+ },
107
+ };
108
+ /**
109
+ * Detect Python package managers via lockfiles and config files.
110
+ * Wraps the existing detectPackageManager() from python/utils.ts.
111
+ */
112
+ async function detectPythonPackageManagers(installDir) {
113
+ const pm = await (0, utils_1.detectPackageManager)({ installDir });
114
+ const info = PYTHON_PM_INFO[pm];
115
+ return {
116
+ detected: [info],
117
+ primary: info,
118
+ recommendation: `Use ${info.label} (${info.installCommand}).`,
119
+ };
120
+ }
121
+ // ---------------------------------------------------------------------------
122
+ // PHP (Composer) helper
123
+ // ---------------------------------------------------------------------------
124
+ const COMPOSER = {
125
+ name: 'composer',
126
+ label: 'Composer',
127
+ installCommand: 'composer require',
128
+ };
129
+ function composerPackageManager() {
130
+ return Promise.resolve({
131
+ detected: [COMPOSER],
132
+ primary: COMPOSER,
133
+ recommendation: 'Use Composer (composer require).',
134
+ });
135
+ }
136
+ // ---------------------------------------------------------------------------
137
+ // Swift (SPM) helper
138
+ // ---------------------------------------------------------------------------
139
+ const SPM = {
140
+ name: 'spm',
141
+ label: 'Swift Package Manager',
142
+ installCommand: 'swift package add-dependency',
143
+ };
144
+ function swiftPackageManager() {
145
+ return Promise.resolve({
146
+ detected: [SPM],
147
+ primary: SPM,
148
+ recommendation: 'Use Swift Package Manager. Add the dependency to Package.swift or via Xcode.',
149
+ });
150
+ }
151
+ // ---------------------------------------------------------------------------
152
+ // Android (Gradle) helper
153
+ // ---------------------------------------------------------------------------
154
+ const GRADLE = {
155
+ name: 'gradle',
156
+ label: 'Gradle',
157
+ installCommand: 'implementation',
158
+ };
159
+ function gradlePackageManager() {
160
+ return Promise.resolve({
161
+ detected: [GRADLE],
162
+ primary: GRADLE,
163
+ recommendation: 'Add dependencies to build.gradle(.kts) using implementation().',
164
+ });
165
+ }
166
+ //# sourceMappingURL=package-manager-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager-detection.js","sourceRoot":"","sources":["../../../src/lib/package-manager-detection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cross-ecosystem package manager detection.\n *\n * Provides a common interface (PackageManagerDetector) that each FrameworkConfig\n * implements, plus shared helpers for Node.js, Python, PHP, and Swift ecosystems.\n * The MCP tool in wizard-tools.ts delegates to whatever detector the\n * current framework supplies.\n */\n\nimport {\n detectAllPackageManagers,\n type PackageManager,\n} from '../utils/package-manager';\nimport {\n detectPackageManager as detectPythonPM,\n PythonPackageManager,\n} from '../python/utils';\n\n// ---------------------------------------------------------------------------\n// Common types\n// ---------------------------------------------------------------------------\n\n/** Structured package manager info the agent can act on */\nexport interface DetectedPackageManager {\n name: string;\n label: string;\n installCommand: string;\n runCommand?: string;\n}\n\n/** Result returned by every detector */\nexport interface PackageManagerInfo {\n detected: DetectedPackageManager[];\n primary: DetectedPackageManager | null;\n recommendation: string;\n}\n\n/** Signature each framework implements */\nexport type PackageManagerDetector = (\n installDir: string,\n) => Promise<PackageManagerInfo>;\n\n// ---------------------------------------------------------------------------\n// Node.js helper\n// ---------------------------------------------------------------------------\n\nfunction serializeNodePM(pm: PackageManager): DetectedPackageManager {\n return {\n name: pm.name,\n label: pm.label,\n installCommand: pm.installCommand,\n runCommand: pm.runScriptCommand,\n };\n}\n\n/**\n * Detect Node.js package managers via lockfiles.\n * Wraps the existing detectAllPackageManagers() from utils/package-manager.ts.\n */\nexport function detectNodePackageManagers(\n installDir: string,\n): Promise<PackageManagerInfo> {\n const detected = detectAllPackageManagers({ installDir }).map(\n serializeNodePM,\n );\n\n if (detected.length === 0) {\n return Promise.resolve({\n detected: [],\n primary: null,\n recommendation: 'No lockfile found. Default to npm (npm add, npm run).',\n });\n }\n\n const primary = detected[0];\n return Promise.resolve({\n detected,\n primary,\n recommendation:\n detected.length === 1\n ? `Use ${primary.label} (${primary.installCommand}).`\n : `Multiple package managers detected. Prefer ${primary.label} (${primary.installCommand}).`,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Python helper\n// ---------------------------------------------------------------------------\n\nconst PYTHON_PM_INFO: Record<PythonPackageManager, DetectedPackageManager> = {\n [PythonPackageManager.UV]: {\n name: 'uv',\n label: 'uv',\n installCommand: 'uv add',\n runCommand: 'uv run',\n },\n [PythonPackageManager.POETRY]: {\n name: 'poetry',\n label: 'Poetry',\n installCommand: 'poetry add',\n runCommand: 'poetry run',\n },\n [PythonPackageManager.PDM]: {\n name: 'pdm',\n label: 'PDM',\n installCommand: 'pdm add',\n runCommand: 'pdm run',\n },\n [PythonPackageManager.HATCH]: {\n name: 'hatch',\n label: 'Hatch',\n installCommand: 'hatch add',\n runCommand: 'hatch run',\n },\n [PythonPackageManager.RYE]: {\n name: 'rye',\n label: 'Rye',\n installCommand: 'rye add',\n runCommand: 'rye run',\n },\n [PythonPackageManager.PIPENV]: {\n name: 'pipenv',\n label: 'Pipenv',\n installCommand: 'pipenv install',\n runCommand: 'pipenv run',\n },\n [PythonPackageManager.CONDA]: {\n name: 'conda',\n label: 'Conda',\n installCommand: 'conda install',\n runCommand: 'conda run',\n },\n [PythonPackageManager.PIP]: {\n name: 'pip',\n label: 'pip',\n installCommand: 'pip install',\n },\n [PythonPackageManager.UNKNOWN]: {\n name: 'pip',\n label: 'pip (default)',\n installCommand: 'pip install',\n },\n};\n\n/**\n * Detect Python package managers via lockfiles and config files.\n * Wraps the existing detectPackageManager() from python/utils.ts.\n */\nexport async function detectPythonPackageManagers(\n installDir: string,\n): Promise<PackageManagerInfo> {\n const pm = await detectPythonPM({ installDir } as any);\n const info = PYTHON_PM_INFO[pm];\n\n return {\n detected: [info],\n primary: info,\n recommendation: `Use ${info.label} (${info.installCommand}).`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// PHP (Composer) helper\n// ---------------------------------------------------------------------------\n\nconst COMPOSER: DetectedPackageManager = {\n name: 'composer',\n label: 'Composer',\n installCommand: 'composer require',\n};\n\nexport function composerPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [COMPOSER],\n primary: COMPOSER,\n recommendation: 'Use Composer (composer require).',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Swift (SPM) helper\n// ---------------------------------------------------------------------------\n\nconst SPM: DetectedPackageManager = {\n name: 'spm',\n label: 'Swift Package Manager',\n installCommand: 'swift package add-dependency',\n};\n\nexport function swiftPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [SPM],\n primary: SPM,\n recommendation:\n 'Use Swift Package Manager. Add the dependency to Package.swift or via Xcode.',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Android (Gradle) helper\n// ---------------------------------------------------------------------------\n\nconst GRADLE: DetectedPackageManager = {\n name: 'gradle',\n label: 'Gradle',\n installCommand: 'implementation',\n};\n\nexport function gradlePackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [GRADLE],\n primary: GRADLE,\n recommendation:\n 'Add dependencies to build.gradle(.kts) using implementation().',\n });\n}\n"]}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Unified in-process MCP server for the PostHog wizard.
3
+ *
4
+ * Provides tools that run locally (secret values never leave the machine):
5
+ * - check_env_keys: Check which env var keys exist in a .env file
6
+ * - set_env_values: Create/update env vars in a .env file
7
+ * - detect_package_manager: Detect the project's package manager(s)
8
+ */
9
+ import type { PackageManagerDetector } from './package-manager-detection';
10
+ export interface WizardToolsOptions {
11
+ /** Root directory of the project being analyzed */
12
+ workingDirectory: string;
13
+ /** Framework-specific package manager detector */
14
+ detectPackageManager: PackageManagerDetector;
15
+ }
16
+ /**
17
+ * Resolve filePath relative to workingDirectory, rejecting path traversal.
18
+ */
19
+ export declare function resolveEnvPath(workingDirectory: string, filePath: string): string;
20
+ /**
21
+ * Ensure the given env file basename is covered by .gitignore in the working directory.
22
+ * Creates .gitignore if it doesn't exist; appends the entry if missing.
23
+ */
24
+ export declare function ensureGitignoreCoverage(workingDirectory: string, envFileName: string): void;
25
+ /**
26
+ * Parse a .env file's content and return the set of defined key names.
27
+ */
28
+ export declare function parseEnvKeys(content: string): Set<string>;
29
+ /**
30
+ * Merge key-value pairs into existing .env content.
31
+ * Updates existing keys in-place, appends new keys at the end.
32
+ */
33
+ export declare function mergeEnvValues(content: string, values: Record<string, string>): string;
34
+ /**
35
+ * Create the unified in-process MCP server with all wizard tools.
36
+ * Must be called asynchronously because the SDK is an ESM module loaded via dynamic import.
37
+ */
38
+ export declare function createWizardToolsServer(options: WizardToolsOptions): Promise<any>;
39
+ /** Tool names exposed by the wizard-tools server, for use in allowedTools */
40
+ export declare const WIZARD_TOOL_NAMES: string[];
@@ -1,19 +1,29 @@
1
1
  "use strict";
2
2
  /**
3
- * In-process MCP server that reads/writes .env files locally.
4
- * Secret values never leave the machine.
3
+ * Unified in-process MCP server for the PostHog wizard.
4
+ *
5
+ * Provides tools that run locally (secret values never leave the machine):
6
+ * - check_env_keys: Check which env var keys exist in a .env file
7
+ * - set_env_values: Create/update env vars in a .env file
8
+ * - detect_package_manager: Detect the project's package manager(s)
5
9
  */
6
10
  var __importDefault = (this && this.__importDefault) || function (mod) {
7
11
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
12
  };
9
13
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.ENV_FILE_TOOL_NAMES = void 0;
11
- exports.createEnvFileServer = createEnvFileServer;
14
+ exports.WIZARD_TOOL_NAMES = void 0;
15
+ exports.resolveEnvPath = resolveEnvPath;
16
+ exports.ensureGitignoreCoverage = ensureGitignoreCoverage;
17
+ exports.parseEnvKeys = parseEnvKeys;
18
+ exports.mergeEnvValues = mergeEnvValues;
19
+ exports.createWizardToolsServer = createWizardToolsServer;
12
20
  const path_1 = __importDefault(require("path"));
13
21
  const fs_1 = __importDefault(require("fs"));
14
22
  const zod_1 = require("zod");
15
23
  const debug_1 = require("../utils/debug");
16
- // Dynamic import cache for ESM module (same pattern as agent-interface.ts)
24
+ // ---------------------------------------------------------------------------
25
+ // SDK dynamic import (ESM module loaded once, cached)
26
+ // ---------------------------------------------------------------------------
17
27
  let _sdkModule = null;
18
28
  async function getSDKModule() {
19
29
  if (!_sdkModule) {
@@ -21,6 +31,9 @@ async function getSDKModule() {
21
31
  }
22
32
  return _sdkModule;
23
33
  }
34
+ // ---------------------------------------------------------------------------
35
+ // Env file helpers
36
+ // ---------------------------------------------------------------------------
24
37
  /**
25
38
  * Resolve filePath relative to workingDirectory, rejecting path traversal.
26
39
  */
@@ -54,12 +67,56 @@ function ensureGitignoreCoverage(workingDirectory, envFileName) {
54
67
  }
55
68
  }
56
69
  /**
57
- * Create an in-process MCP server with env file tools.
70
+ * Parse a .env file's content and return the set of defined key names.
71
+ */
72
+ function parseEnvKeys(content) {
73
+ const keys = new Set();
74
+ for (const line of content.split('\n')) {
75
+ const match = line.match(/^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=/);
76
+ if (match) {
77
+ keys.add(match[1]);
78
+ }
79
+ }
80
+ return keys;
81
+ }
82
+ /**
83
+ * Merge key-value pairs into existing .env content.
84
+ * Updates existing keys in-place, appends new keys at the end.
85
+ */
86
+ function mergeEnvValues(content, values) {
87
+ let result = content;
88
+ const updatedKeys = new Set();
89
+ for (const [key, value] of Object.entries(values)) {
90
+ const regex = new RegExp(`^(\\s*${key}\\s*=).*$`, 'm');
91
+ if (regex.test(result)) {
92
+ result = result.replace(regex, `$1${value}`);
93
+ updatedKeys.add(key);
94
+ }
95
+ }
96
+ const newKeys = Object.entries(values).filter(([key]) => !updatedKeys.has(key));
97
+ if (newKeys.length > 0) {
98
+ if (result.length > 0 && !result.endsWith('\n')) {
99
+ result += '\n';
100
+ }
101
+ for (const [key, value] of newKeys) {
102
+ result += `${key}=${value}\n`;
103
+ }
104
+ }
105
+ return result;
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // Server factory
109
+ // ---------------------------------------------------------------------------
110
+ const SERVER_NAME = 'wizard-tools';
111
+ /**
112
+ * Create the unified in-process MCP server with all wizard tools.
58
113
  * Must be called asynchronously because the SDK is an ESM module loaded via dynamic import.
59
114
  */
60
- async function createEnvFileServer(workingDirectory) {
115
+ async function createWizardToolsServer(options) {
116
+ const { workingDirectory, detectPackageManager } = options;
61
117
  const sdk = await getSDKModule();
62
118
  const { tool, createSdkMcpServer } = sdk;
119
+ // -- check_env_keys -------------------------------------------------------
63
120
  const checkEnvKeys = tool('check_env_keys', 'Check which environment variable keys are present or missing in a .env file. Never reveals values.', {
64
121
  filePath: zod_1.z
65
122
  .string()
@@ -70,16 +127,9 @@ async function createEnvFileServer(workingDirectory) {
70
127
  }, (args) => {
71
128
  const resolved = resolveEnvPath(workingDirectory, args.filePath);
72
129
  (0, debug_1.logToFile)(`check_env_keys: ${resolved}, keys: ${args.keys.join(', ')}`);
73
- const existingKeys = new Set();
74
- if (fs_1.default.existsSync(resolved)) {
75
- const content = fs_1.default.readFileSync(resolved, 'utf8');
76
- for (const line of content.split('\n')) {
77
- const match = line.match(/^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=/);
78
- if (match) {
79
- existingKeys.add(match[1]);
80
- }
81
- }
82
- }
130
+ const existingKeys = fs_1.default.existsSync(resolved)
131
+ ? parseEnvKeys(fs_1.default.readFileSync(resolved, 'utf8'))
132
+ : new Set();
83
133
  const results = {};
84
134
  for (const key of args.keys) {
85
135
  results[key] = existingKeys.has(key) ? 'present' : 'missing';
@@ -90,6 +140,7 @@ async function createEnvFileServer(workingDirectory) {
90
140
  ],
91
141
  };
92
142
  });
143
+ // -- set_env_values -------------------------------------------------------
93
144
  const setEnvValues = tool('set_env_values', 'Create or update environment variable keys in a .env file. Creates the file if it does not exist. Ensures .gitignore coverage.', {
94
145
  filePath: zod_1.z
95
146
  .string()
@@ -100,28 +151,10 @@ async function createEnvFileServer(workingDirectory) {
100
151
  }, (args) => {
101
152
  const resolved = resolveEnvPath(workingDirectory, args.filePath);
102
153
  (0, debug_1.logToFile)(`set_env_values: ${resolved}, keys: ${Object.keys(args.values).join(', ')}`);
103
- let content = '';
104
- if (fs_1.default.existsSync(resolved)) {
105
- content = fs_1.default.readFileSync(resolved, 'utf8');
106
- }
107
- const updatedKeys = new Set();
108
- for (const [key, value] of Object.entries(args.values)) {
109
- const regex = new RegExp(`^(\\s*${key}\\s*=).*$`, 'm');
110
- if (regex.test(content)) {
111
- content = content.replace(regex, `$1${value}`);
112
- updatedKeys.add(key);
113
- }
114
- }
115
- // Append keys that weren't already in the file
116
- const newKeys = Object.entries(args.values).filter(([key]) => !updatedKeys.has(key));
117
- if (newKeys.length > 0) {
118
- if (content.length > 0 && !content.endsWith('\n')) {
119
- content += '\n';
120
- }
121
- for (const [key, value] of newKeys) {
122
- content += `${key}=${value}\n`;
123
- }
124
- }
154
+ const existing = fs_1.default.existsSync(resolved)
155
+ ? fs_1.default.readFileSync(resolved, 'utf8')
156
+ : '';
157
+ const content = mergeEnvValues(existing, args.values);
125
158
  // Ensure parent directory exists
126
159
  const dir = path_1.default.dirname(resolved);
127
160
  if (!fs_1.default.existsSync(dir)) {
@@ -140,15 +173,31 @@ async function createEnvFileServer(workingDirectory) {
140
173
  ],
141
174
  };
142
175
  });
176
+ // -- detect_package_manager -----------------------------------------------
177
+ const detectPM = tool('detect_package_manager', 'Detect which package manager(s) the project uses. Returns the name, install command, and run command for each detected package manager. Call this before running any install commands.', {}, async () => {
178
+ (0, debug_1.logToFile)(`detect_package_manager: scanning ${workingDirectory}`);
179
+ const result = await detectPackageManager(workingDirectory);
180
+ (0, debug_1.logToFile)(`detect_package_manager: detected ${result.detected.length} package manager(s)`);
181
+ return {
182
+ content: [
183
+ {
184
+ type: 'text',
185
+ text: JSON.stringify(result, null, 2),
186
+ },
187
+ ],
188
+ };
189
+ });
190
+ // -- Assemble server ------------------------------------------------------
143
191
  return createSdkMcpServer({
144
- name: 'env-file-tools',
192
+ name: SERVER_NAME,
145
193
  version: '1.0.0',
146
- tools: [checkEnvKeys, setEnvValues],
194
+ tools: [checkEnvKeys, setEnvValues, detectPM],
147
195
  });
148
196
  }
149
- /** Tool names exposed by the env file server, for use in allowedTools */
150
- exports.ENV_FILE_TOOL_NAMES = [
151
- 'env-file-tools:check_env_keys',
152
- 'env-file-tools:set_env_values',
197
+ /** Tool names exposed by the wizard-tools server, for use in allowedTools */
198
+ exports.WIZARD_TOOL_NAMES = [
199
+ `${SERVER_NAME}:check_env_keys`,
200
+ `${SERVER_NAME}:set_env_values`,
201
+ `${SERVER_NAME}:detect_package_manager`,
153
202
  ];
154
- //# sourceMappingURL=env-file-tools.js.map
203
+ //# sourceMappingURL=wizard-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard-tools.js","sourceRoot":"","sources":["../../../src/lib/wizard-tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Unified in-process MCP server for the PostHog wizard.\n *\n * Provides tools that run locally (secret values never leave the machine):\n * - check_env_keys: Check which env var keys exist in a .env file\n * - set_env_values: Create/update env vars in a .env file\n * - detect_package_manager: Detect the project's package manager(s)\n */\n\nimport path from 'path';\nimport fs from 'fs';\nimport { z } from 'zod';\nimport { logToFile } from '../utils/debug';\nimport type { PackageManagerDetector } from './package-manager-detection';\n\n// ---------------------------------------------------------------------------\n// SDK dynamic import (ESM module loaded once, cached)\n// ---------------------------------------------------------------------------\n\nlet _sdkModule: any = null;\nasync function getSDKModule(): Promise<any> {\n if (!_sdkModule) {\n _sdkModule = await import('@anthropic-ai/claude-agent-sdk');\n }\n return _sdkModule;\n}\n\n// ---------------------------------------------------------------------------\n// Options for creating the wizard tools server\n// ---------------------------------------------------------------------------\n\nexport interface WizardToolsOptions {\n /** Root directory of the project being analyzed */\n workingDirectory: string;\n\n /** Framework-specific package manager detector */\n detectPackageManager: PackageManagerDetector;\n}\n\n// ---------------------------------------------------------------------------\n// Env file helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve filePath relative to workingDirectory, rejecting path traversal.\n */\nexport function resolveEnvPath(\n workingDirectory: string,\n filePath: string,\n): string {\n const resolved = path.resolve(workingDirectory, filePath);\n if (\n !resolved.startsWith(workingDirectory + path.sep) &&\n resolved !== workingDirectory\n ) {\n throw new Error(\n `Path traversal rejected: \"${filePath}\" resolves outside working directory`,\n );\n }\n return resolved;\n}\n\n/**\n * Ensure the given env file basename is covered by .gitignore in the working directory.\n * Creates .gitignore if it doesn't exist; appends the entry if missing.\n */\nexport function ensureGitignoreCoverage(\n workingDirectory: string,\n envFileName: string,\n): void {\n const gitignorePath = path.join(workingDirectory, '.gitignore');\n\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf8');\n // Check if the file (or a glob covering it) is already listed\n if (content.split('\\n').some((line) => line.trim() === envFileName)) {\n return;\n }\n const newContent = content.endsWith('\\n')\n ? `${content}${envFileName}\\n`\n : `${content}\\n${envFileName}\\n`;\n fs.writeFileSync(gitignorePath, newContent, 'utf8');\n } else {\n fs.writeFileSync(gitignorePath, `${envFileName}\\n`, 'utf8');\n }\n}\n\n/**\n * Parse a .env file's content and return the set of defined key names.\n */\nexport function parseEnvKeys(content: string): Set<string> {\n const keys = new Set<string>();\n for (const line of content.split('\\n')) {\n const match = line.match(/^\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*=/);\n if (match) {\n keys.add(match[1]);\n }\n }\n return keys;\n}\n\n/**\n * Merge key-value pairs into existing .env content.\n * Updates existing keys in-place, appends new keys at the end.\n */\nexport function mergeEnvValues(\n content: string,\n values: Record<string, string>,\n): string {\n let result = content;\n const updatedKeys = new Set<string>();\n\n for (const [key, value] of Object.entries(values)) {\n const regex = new RegExp(`^(\\\\s*${key}\\\\s*=).*$`, 'm');\n if (regex.test(result)) {\n result = result.replace(regex, `$1${value}`);\n updatedKeys.add(key);\n }\n }\n\n const newKeys = Object.entries(values).filter(\n ([key]) => !updatedKeys.has(key),\n );\n if (newKeys.length > 0) {\n if (result.length > 0 && !result.endsWith('\\n')) {\n result += '\\n';\n }\n for (const [key, value] of newKeys) {\n result += `${key}=${value}\\n`;\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Server factory\n// ---------------------------------------------------------------------------\n\nconst SERVER_NAME = 'wizard-tools';\n\n/**\n * Create the unified in-process MCP server with all wizard tools.\n * Must be called asynchronously because the SDK is an ESM module loaded via dynamic import.\n */\nexport async function createWizardToolsServer(options: WizardToolsOptions) {\n const { workingDirectory, detectPackageManager } = options;\n const sdk = await getSDKModule();\n const { tool, createSdkMcpServer } = sdk;\n\n // -- check_env_keys -------------------------------------------------------\n\n const checkEnvKeys = tool(\n 'check_env_keys',\n 'Check which environment variable keys are present or missing in a .env file. Never reveals values.',\n {\n filePath: z\n .string()\n .describe('Path to the .env file, relative to the project root'),\n keys: z\n .array(z.string())\n .describe('Environment variable key names to check'),\n },\n (args: { filePath: string; keys: string[] }) => {\n const resolved = resolveEnvPath(workingDirectory, args.filePath);\n logToFile(`check_env_keys: ${resolved}, keys: ${args.keys.join(', ')}`);\n\n const existingKeys: Set<string> = fs.existsSync(resolved)\n ? parseEnvKeys(fs.readFileSync(resolved, 'utf8'))\n : new Set<string>();\n\n const results: Record<string, 'present' | 'missing'> = {};\n for (const key of args.keys) {\n results[key] = existingKeys.has(key) ? 'present' : 'missing';\n }\n\n return {\n content: [\n { type: 'text' as const, text: JSON.stringify(results, null, 2) },\n ],\n };\n },\n );\n\n // -- set_env_values -------------------------------------------------------\n\n const setEnvValues = tool(\n 'set_env_values',\n 'Create or update environment variable keys in a .env file. Creates the file if it does not exist. Ensures .gitignore coverage.',\n {\n filePath: z\n .string()\n .describe('Path to the .env file, relative to the project root'),\n values: z\n .record(z.string(), z.string())\n .describe('Key-value pairs to set'),\n },\n (args: { filePath: string; values: Record<string, string> }) => {\n const resolved = resolveEnvPath(workingDirectory, args.filePath);\n logToFile(\n `set_env_values: ${resolved}, keys: ${Object.keys(args.values).join(\n ', ',\n )}`,\n );\n\n const existing = fs.existsSync(resolved)\n ? fs.readFileSync(resolved, 'utf8')\n : '';\n const content = mergeEnvValues(existing, args.values);\n\n // Ensure parent directory exists\n const dir = path.dirname(resolved);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.writeFileSync(resolved, content, 'utf8');\n\n // Ensure .gitignore coverage for this env file\n const envFileName = path.basename(resolved);\n ensureGitignoreCoverage(workingDirectory, envFileName);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Updated ${Object.keys(args.values).length} key(s) in ${\n args.filePath\n }`,\n },\n ],\n };\n },\n );\n\n // -- detect_package_manager -----------------------------------------------\n\n const detectPM = tool(\n 'detect_package_manager',\n 'Detect which package manager(s) the project uses. Returns the name, install command, and run command for each detected package manager. Call this before running any install commands.',\n {},\n async () => {\n logToFile(`detect_package_manager: scanning ${workingDirectory}`);\n\n const result = await detectPackageManager(workingDirectory);\n\n logToFile(\n `detect_package_manager: detected ${result.detected.length} package manager(s)`,\n );\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n\n // -- Assemble server ------------------------------------------------------\n\n return createSdkMcpServer({\n name: SERVER_NAME,\n version: '1.0.0',\n tools: [checkEnvKeys, setEnvValues, detectPM],\n });\n}\n\n/** Tool names exposed by the wizard-tools server, for use in allowedTools */\nexport const WIZARD_TOOL_NAMES = [\n `${SERVER_NAME}:check_env_keys`,\n `${SERVER_NAME}:set_env_values`,\n `${SERVER_NAME}:detect_package_manager`,\n];\n"]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NEXTJS_AGENT_CONFIG = void 0;
4
+ const package_manager_detection_1 = require("../lib/package-manager-detection");
4
5
  const constants_1 = require("../lib/constants");
5
6
  const package_json_1 = require("../utils/package-json");
6
7
  const clack_utils_1 = require("../utils/clack-utils");
@@ -30,6 +31,7 @@ exports.NEXTJS_AGENT_CONFIG = {
30
31
  const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
31
32
  return packageJson ? (0, package_json_1.hasPackageInstalled)('next', packageJson) : false;
32
33
  },
34
+ detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
33
35
  },
34
36
  environment: {
35
37
  uploadToHosting: true,
@@ -45,7 +47,6 @@ exports.NEXTJS_AGENT_CONFIG = {
45
47
  },
46
48
  prompts: {
47
49
  projectTypeDetection: 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',
48
- packageInstallation: 'Look for lockfiles to determine the package manager (npm, yarn, pnpm, bun). Do not manually edit package.json.',
49
50
  getAdditionalContextLines: (context) => {
50
51
  const routerType = context.router === utils_1.NextJsRouter.APP_ROUTER ? 'app' : 'pages';
51
52
  return [`Router: ${routerType}`];
@@ -1 +1 @@
1
- {"version":3,"file":"nextjs-wizard-agent.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard-agent.ts"],"names":[],"mappings":";;;AAGA,gDAA+C;AAC/C,wDAI+B;AAC/B,sDAA4E;AAC5E,mCAKiB;AAMJ,QAAA,mBAAmB,GAAmC;IACjE,QAAQ,EAAE;QACR,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,uBAAW,CAAC,MAAM;QAC/B,OAAO,EAAE,4CAA4C;QACrD,yBAAyB,EAAE,4CAA4C;QACvE,aAAa,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YAC9C,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAe,EAAC,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC;KACF;IAED,SAAS,EAAE;QACT,WAAW,EAAE,MAAM;QACnB,kBAAkB,EAAE,SAAS;QAC7B,UAAU,EAAE,CAAC,WAAoB,EAAE,EAAE,CACnC,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAA6B,CAAC;QAC1D,gBAAgB,EAAE,8BAAsB;QACxC,cAAc,EAAE,QAAQ;QACxB,mBAAmB,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YACpD,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,WAAW,CAAC,CAAC,CAAC,IAAA,kCAAmB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxE,CAAC;KACF;IAED,WAAW,EAAE;QACX,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;YAC7C,uBAAuB,EAAE,MAAM;YAC/B,wBAAwB,EAAE,IAAI;SAC/B,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,oBAAY,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;SACrE,CAAC;KACH;IAED,OAAO,EAAE;QACP,oBAAoB,EAClB,oJAAoJ;QACtJ,mBAAmB,EACjB,gHAAgH;QAClH,yBAAyB,EAAE,CAAC,OAAO,EAAE,EAAE;YACrC,MAAM,UAAU,GACd,OAAO,CAAC,MAAM,KAAK,oBAAY,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/D,OAAO,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;QACnC,CAAC;KACF;IAED,EAAE,EAAE;QACF,cAAc,EAAE,8BAA8B;QAC9C,wBAAwB,EAAE,CAAC;QAC3B,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,oBAAY,CAAC,UAAU,CAAC;YACzD,MAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,MAAM,CAAC,CAAC;YAC/C,OAAO;gBACL,4CAA4C,UAAU,GAAG;gBACzD,6CAA6C;gBAC7C,0CAA0C;aAC3C,CAAC;QACJ,CAAC;QACD,iBAAiB,EAAE,GAAG,EAAE;YACtB,OAAO;gBACL,wDAAwD;gBACxD,qDAAqD;aACtD,CAAC;QACJ,CAAC;KACF;CACF,CAAC","sourcesContent":["/* Simplified Next.js wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../utils/types';\nimport type { FrameworkConfig } from '../lib/framework-config';\nimport { Integration } from '../lib/constants';\nimport {\n getPackageVersion,\n hasPackageInstalled,\n type PackageDotJson,\n} from '../utils/package-json';\nimport { getPackageDotJson, tryGetPackageJson } from '../utils/clack-utils';\nimport {\n getNextJsRouter,\n getNextJsVersionBucket,\n getNextJsRouterName,\n NextJsRouter,\n} from './utils';\n\ntype NextjsContext = {\n router?: NextJsRouter;\n};\n\nexport const NEXTJS_AGENT_CONFIG: FrameworkConfig<NextjsContext> = {\n metadata: {\n name: 'Next.js',\n integration: Integration.nextjs,\n docsUrl: 'https://posthog.com/docs/libraries/next-js',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/next-js',\n gatherContext: async (options: WizardOptions) => {\n const router = await getNextJsRouter(options);\n return { router };\n },\n },\n\n detection: {\n packageName: 'next',\n packageDisplayName: 'Next.js',\n getVersion: (packageJson: unknown) =>\n getPackageVersion('next', packageJson as PackageDotJson),\n getVersionBucket: getNextJsVersionBucket,\n minimumVersion: '15.3.0',\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await getPackageDotJson(options);\n return getPackageVersion('next', packageJson);\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson ? hasPackageInstalled('next', packageJson) : false;\n },\n },\n\n environment: {\n uploadToHosting: true,\n getEnvVars: (apiKey: string, host: string) => ({\n NEXT_PUBLIC_POSTHOG_KEY: apiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n router: context.router === NextJsRouter.APP_ROUTER ? 'app' : 'pages',\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',\n packageInstallation:\n 'Look for lockfiles to determine the package manager (npm, yarn, pnpm, bun). Do not manually edit package.json.',\n getAdditionalContextLines: (context) => {\n const routerType =\n context.router === NextJsRouter.APP_ROUTER ? 'app' : 'pages';\n return [`Router: ${routerType}`];\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 8,\n getOutroChanges: (context) => {\n const router = context.router ?? NextJsRouter.APP_ROUTER;\n const routerName = getNextJsRouterName(router);\n return [\n `Analyzed your Next.js project structure (${routerName})`,\n `Created and configured PostHog initializers`,\n `Integrated PostHog into your application`,\n ];\n },\n getOutroNextSteps: () => {\n return [\n 'Start your development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n ];\n },\n },\n};\n"]}
1
+ {"version":3,"file":"nextjs-wizard-agent.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard-agent.ts"],"names":[],"mappings":";;;AAGA,gFAA6E;AAC7E,gDAA+C;AAC/C,wDAI+B;AAC/B,sDAA4E;AAC5E,mCAKiB;AAMJ,QAAA,mBAAmB,GAAmC;IACjE,QAAQ,EAAE;QACR,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,uBAAW,CAAC,MAAM;QAC/B,OAAO,EAAE,4CAA4C;QACrD,yBAAyB,EAAE,4CAA4C;QACvE,aAAa,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YAC9C,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAe,EAAC,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC;KACF;IAED,SAAS,EAAE;QACT,WAAW,EAAE,MAAM;QACnB,kBAAkB,EAAE,SAAS;QAC7B,UAAU,EAAE,CAAC,WAAoB,EAAE,EAAE,CACnC,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAA6B,CAAC;QAC1D,gBAAgB,EAAE,8BAAsB;QACxC,cAAc,EAAE,QAAQ;QACxB,mBAAmB,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YACpD,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,WAAW,CAAC,CAAC,CAAC,IAAA,kCAAmB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxE,CAAC;QACD,oBAAoB,EAAE,qDAAyB;KAChD;IAED,WAAW,EAAE;QACX,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;YAC7C,uBAAuB,EAAE,MAAM;YAC/B,wBAAwB,EAAE,IAAI;SAC/B,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,oBAAY,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;SACrE,CAAC;KACH;IAED,OAAO,EAAE;QACP,oBAAoB,EAClB,oJAAoJ;QACtJ,yBAAyB,EAAE,CAAC,OAAO,EAAE,EAAE;YACrC,MAAM,UAAU,GACd,OAAO,CAAC,MAAM,KAAK,oBAAY,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/D,OAAO,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;QACnC,CAAC;KACF;IAED,EAAE,EAAE;QACF,cAAc,EAAE,8BAA8B;QAC9C,wBAAwB,EAAE,CAAC;QAC3B,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,oBAAY,CAAC,UAAU,CAAC;YACzD,MAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,MAAM,CAAC,CAAC;YAC/C,OAAO;gBACL,4CAA4C,UAAU,GAAG;gBACzD,6CAA6C;gBAC7C,0CAA0C;aAC3C,CAAC;QACJ,CAAC;QACD,iBAAiB,EAAE,GAAG,EAAE;YACtB,OAAO;gBACL,wDAAwD;gBACxD,qDAAqD;aACtD,CAAC;QACJ,CAAC;KACF;CACF,CAAC","sourcesContent":["/* Simplified Next.js wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../utils/types';\nimport type { FrameworkConfig } from '../lib/framework-config';\nimport { detectNodePackageManagers } from '../lib/package-manager-detection';\nimport { Integration } from '../lib/constants';\nimport {\n getPackageVersion,\n hasPackageInstalled,\n type PackageDotJson,\n} from '../utils/package-json';\nimport { getPackageDotJson, tryGetPackageJson } from '../utils/clack-utils';\nimport {\n getNextJsRouter,\n getNextJsVersionBucket,\n getNextJsRouterName,\n NextJsRouter,\n} from './utils';\n\ntype NextjsContext = {\n router?: NextJsRouter;\n};\n\nexport const NEXTJS_AGENT_CONFIG: FrameworkConfig<NextjsContext> = {\n metadata: {\n name: 'Next.js',\n integration: Integration.nextjs,\n docsUrl: 'https://posthog.com/docs/libraries/next-js',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/next-js',\n gatherContext: async (options: WizardOptions) => {\n const router = await getNextJsRouter(options);\n return { router };\n },\n },\n\n detection: {\n packageName: 'next',\n packageDisplayName: 'Next.js',\n getVersion: (packageJson: unknown) =>\n getPackageVersion('next', packageJson as PackageDotJson),\n getVersionBucket: getNextJsVersionBucket,\n minimumVersion: '15.3.0',\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await getPackageDotJson(options);\n return getPackageVersion('next', packageJson);\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson ? hasPackageInstalled('next', packageJson) : false;\n },\n detectPackageManager: detectNodePackageManagers,\n },\n\n environment: {\n uploadToHosting: true,\n getEnvVars: (apiKey: string, host: string) => ({\n NEXT_PUBLIC_POSTHOG_KEY: apiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n router: context.router === NextJsRouter.APP_ROUTER ? 'app' : 'pages',\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',\n getAdditionalContextLines: (context) => {\n const routerType =\n context.router === NextJsRouter.APP_ROUTER ? 'app' : 'pages';\n return [`Router: ${routerType}`];\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 8,\n getOutroChanges: (context) => {\n const router = context.router ?? NextJsRouter.APP_ROUTER;\n const routerName = getNextJsRouterName(router);\n return [\n `Analyzed your Next.js project structure (${routerName})`,\n `Created and configured PostHog initializers`,\n `Integrated PostHog into your application`,\n ];\n },\n getOutroNextSteps: () => {\n return [\n 'Start your development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n ];\n },\n },\n};\n"]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NUXT_AGENT_CONFIG = void 0;
4
+ const package_manager_detection_1 = require("../lib/package-manager-detection");
4
5
  const constants_1 = require("../lib/constants");
5
6
  const package_json_1 = require("../utils/package-json");
6
7
  const clack_utils_1 = require("../utils/clack-utils");
@@ -32,6 +33,7 @@ exports.NUXT_AGENT_CONFIG = {
32
33
  const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
33
34
  return packageJson ? (0, package_json_1.hasPackageInstalled)('nuxt', packageJson) : false;
34
35
  },
36
+ detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
35
37
  },
36
38
  environment: {
37
39
  uploadToHosting: true,
@@ -49,7 +51,6 @@ exports.NUXT_AGENT_CONFIG = {
49
51
  },
50
52
  prompts: {
51
53
  projectTypeDetection: 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',
52
- packageInstallation: 'Look for lockfiles to determine the package manager (npm, yarn, pnpm, bun). Do not manually edit package.json.',
53
54
  getAdditionalContextLines: (context) => {
54
55
  const lines = [];
55
56
  if (context.versionBucket) {
@@ -1 +1 @@
1
- {"version":3,"file":"nuxt-wizard-agent.js","sourceRoot":"","sources":["../../../src/nuxt/nuxt-wizard-agent.ts"],"names":[],"mappings":";;;AAGA,gDAA+C;AAC/C,wDAI+B;AAC/B,sDAA4E;AAC5E,4CAAsD;AAEtD,MAAM,oBAAoB,GAAG,IAAA,4BAAmB,GAAE,CAAC;AAMtC,QAAA,iBAAiB,GAAiC;IAC7D,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,uBAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,yCAAyC;QAClD,IAAI,EAAE,IAAI;QACV,aAAa,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YAC9C,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACpD,OAAO,EAAE,aAAa,EAAE,CAAC;QAC3B,CAAC;KACF;IAED,SAAS,EAAE;QACT,WAAW,EAAE,MAAM;QACnB,kBAAkB,EAAE,MAAM;QAC1B,UAAU,EAAE,CAAC,WAAoB,EAAE,EAAE,CACnC,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAA6B,CAAC;QAC1D,gBAAgB,EAAE,oBAAoB;QACtC,mBAAmB,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YACpD,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,WAAW,CAAC,CAAC,CAAC,IAAA,kCAAmB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxE,CAAC;KACF;IAED,WAAW,EAAE;QACX,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;YAC7C,uBAAuB,EAAE,MAAM;YAC/B,wBAAwB,EAAE,IAAI;SAC/B,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrB,GAAG,CAAC,OAAO,CAAC,aAAa;gBACvB,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE;gBAC1C,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;KACH;IAED,OAAO,EAAE;QACP,oBAAoB,EAClB,oJAAoJ;QACtJ,mBAAmB,EACjB,gHAAgH;QAClH,yBAAyB,EAAE,CAAC,OAAO,EAAE,EAAE;YACrC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,CAAC;YAC3B,KAAK,CAAC,IAAI,CACR,sBAAsB,WAAW,mCAAmC,WAAW,qBAAqB,CACrG,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;KACF;IAED,EAAE,EAAE;QACF,cAAc,EAAE,8BAA8B;QAC9C,wBAAwB,EAAE,CAAC;QAC3B,eAAe,EAAE,GAAG,EAAE,CAAC;YACrB,sCAAsC;YACtC,kCAAkC;YAClC,0CAA0C;SAC3C;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACvB,wDAAwD;YACxD,qDAAqD;SACtD;KACF;CACF,CAAC","sourcesContent":["/* Nuxt wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../utils/types';\nimport type { FrameworkConfig } from '../lib/framework-config';\nimport { Integration } from '../lib/constants';\nimport {\n getPackageVersion,\n hasPackageInstalled,\n type PackageDotJson,\n} from '../utils/package-json';\nimport { getPackageDotJson, tryGetPackageJson } from '../utils/clack-utils';\nimport { createVersionBucket } from '../utils/semver';\n\nconst getNuxtVersionBucket = createVersionBucket();\n\ntype NuxtContext = {\n versionBucket?: string;\n};\n\nexport const NUXT_AGENT_CONFIG: FrameworkConfig<NuxtContext> = {\n metadata: {\n name: 'Nuxt',\n integration: Integration.nuxt,\n docsUrl: 'https://posthog.com/docs/libraries/nuxt',\n beta: true,\n gatherContext: async (options: WizardOptions) => {\n const packageJson = await getPackageDotJson(options);\n const version = getPackageVersion('nuxt', packageJson);\n const versionBucket = getNuxtVersionBucket(version);\n return { versionBucket };\n },\n },\n\n detection: {\n packageName: 'nuxt',\n packageDisplayName: 'Nuxt',\n getVersion: (packageJson: unknown) =>\n getPackageVersion('nuxt', packageJson as PackageDotJson),\n getVersionBucket: getNuxtVersionBucket,\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await getPackageDotJson(options);\n return getPackageVersion('nuxt', packageJson);\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson ? hasPackageInstalled('nuxt', packageJson) : false;\n },\n },\n\n environment: {\n uploadToHosting: true,\n getEnvVars: (apiKey: string, host: string) => ({\n NUXT_PUBLIC_POSTHOG_KEY: apiKey,\n NUXT_PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n ...(context.versionBucket\n ? { versionBucket: context.versionBucket }\n : {}),\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',\n packageInstallation:\n 'Look for lockfiles to determine the package manager (npm, yarn, pnpm, bun). Do not manually edit package.json.',\n getAdditionalContextLines: (context) => {\n const lines: string[] = [];\n if (context.versionBucket) {\n lines.push(`Nuxt version: ${context.versionBucket}`);\n }\n const frameworkId = 'nuxt';\n lines.push(\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n );\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 5,\n getOutroChanges: () => [\n 'Analyzed your Nuxt project structure',\n 'Configured PostHog module/plugin',\n 'Integrated PostHog into your application',\n ],\n getOutroNextSteps: () => [\n 'Start your development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n ],\n },\n};\n"]}
1
+ {"version":3,"file":"nuxt-wizard-agent.js","sourceRoot":"","sources":["../../../src/nuxt/nuxt-wizard-agent.ts"],"names":[],"mappings":";;;AAGA,gFAA6E;AAC7E,gDAA+C;AAC/C,wDAI+B;AAC/B,sDAA4E;AAC5E,4CAAsD;AAEtD,MAAM,oBAAoB,GAAG,IAAA,4BAAmB,GAAE,CAAC;AAMtC,QAAA,iBAAiB,GAAiC;IAC7D,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,uBAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,yCAAyC;QAClD,IAAI,EAAE,IAAI;QACV,aAAa,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YAC9C,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACpD,OAAO,EAAE,aAAa,EAAE,CAAC;QAC3B,CAAC;KACF;IAED,SAAS,EAAE;QACT,WAAW,EAAE,MAAM;QACnB,kBAAkB,EAAE,MAAM;QAC1B,UAAU,EAAE,CAAC,WAAoB,EAAE,EAAE,CACnC,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAA6B,CAAC;QAC1D,gBAAgB,EAAE,oBAAoB;QACtC,mBAAmB,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YACpD,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,WAAW,CAAC,CAAC,CAAC,IAAA,kCAAmB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxE,CAAC;QACD,oBAAoB,EAAE,qDAAyB;KAChD;IAED,WAAW,EAAE;QACX,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;YAC7C,uBAAuB,EAAE,MAAM;YAC/B,wBAAwB,EAAE,IAAI;SAC/B,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrB,GAAG,CAAC,OAAO,CAAC,aAAa;gBACvB,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE;gBAC1C,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;KACH;IAED,OAAO,EAAE;QACP,oBAAoB,EAClB,oJAAoJ;QACtJ,yBAAyB,EAAE,CAAC,OAAO,EAAE,EAAE;YACrC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,CAAC;YAC3B,KAAK,CAAC,IAAI,CACR,sBAAsB,WAAW,mCAAmC,WAAW,qBAAqB,CACrG,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;KACF;IAED,EAAE,EAAE;QACF,cAAc,EAAE,8BAA8B;QAC9C,wBAAwB,EAAE,CAAC;QAC3B,eAAe,EAAE,GAAG,EAAE,CAAC;YACrB,sCAAsC;YACtC,kCAAkC;YAClC,0CAA0C;SAC3C;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACvB,wDAAwD;YACxD,qDAAqD;SACtD;KACF;CACF,CAAC","sourcesContent":["/* Nuxt wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../utils/types';\nimport type { FrameworkConfig } from '../lib/framework-config';\nimport { detectNodePackageManagers } from '../lib/package-manager-detection';\nimport { Integration } from '../lib/constants';\nimport {\n getPackageVersion,\n hasPackageInstalled,\n type PackageDotJson,\n} from '../utils/package-json';\nimport { getPackageDotJson, tryGetPackageJson } from '../utils/clack-utils';\nimport { createVersionBucket } from '../utils/semver';\n\nconst getNuxtVersionBucket = createVersionBucket();\n\ntype NuxtContext = {\n versionBucket?: string;\n};\n\nexport const NUXT_AGENT_CONFIG: FrameworkConfig<NuxtContext> = {\n metadata: {\n name: 'Nuxt',\n integration: Integration.nuxt,\n docsUrl: 'https://posthog.com/docs/libraries/nuxt',\n beta: true,\n gatherContext: async (options: WizardOptions) => {\n const packageJson = await getPackageDotJson(options);\n const version = getPackageVersion('nuxt', packageJson);\n const versionBucket = getNuxtVersionBucket(version);\n return { versionBucket };\n },\n },\n\n detection: {\n packageName: 'nuxt',\n packageDisplayName: 'Nuxt',\n getVersion: (packageJson: unknown) =>\n getPackageVersion('nuxt', packageJson as PackageDotJson),\n getVersionBucket: getNuxtVersionBucket,\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await getPackageDotJson(options);\n return getPackageVersion('nuxt', packageJson);\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson ? hasPackageInstalled('nuxt', packageJson) : false;\n },\n detectPackageManager: detectNodePackageManagers,\n },\n\n environment: {\n uploadToHosting: true,\n getEnvVars: (apiKey: string, host: string) => ({\n NUXT_PUBLIC_POSTHOG_KEY: apiKey,\n NUXT_PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n ...(context.versionBucket\n ? { versionBucket: context.versionBucket }\n : {}),\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',\n getAdditionalContextLines: (context) => {\n const lines: string[] = [];\n if (context.versionBucket) {\n lines.push(`Nuxt version: ${context.versionBucket}`);\n }\n const frameworkId = 'nuxt';\n lines.push(\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n );\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 5,\n getOutroChanges: () => [\n 'Analyzed your Nuxt project structure',\n 'Configured PostHog module/plugin',\n 'Integrated PostHog into your application',\n ],\n getOutroNextSteps: () => [\n 'Start your development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n ],\n },\n};\n"]}
@@ -37,6 +37,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.PYTHON_AGENT_CONFIG = void 0;
40
+ const framework_config_1 = require("../lib/framework-config");
41
+ const package_manager_detection_1 = require("../lib/package-manager-detection");
40
42
  const constants_1 = require("../lib/constants");
41
43
  const fast_glob_1 = __importDefault(require("fast-glob"));
42
44
  const fs = __importStar(require("node:fs"));
@@ -133,6 +135,7 @@ exports.PYTHON_AGENT_CONFIG = {
133
135
  // If we have Python config files but it's not Django or Flask, it's a generic Python project
134
136
  return true;
135
137
  },
138
+ detectPackageManager: package_manager_detection_1.detectPythonPackageManagers,
136
139
  },
137
140
  environment: {
138
141
  uploadToHosting: false,
@@ -152,8 +155,8 @@ exports.PYTHON_AGENT_CONFIG = {
152
155
  },
153
156
  },
154
157
  prompts: {
158
+ packageInstallation: framework_config_1.PYTHON_PACKAGE_INSTALLATION,
155
159
  projectTypeDetection: 'This is a generic Python project. Look for requirements.txt, pyproject.toml, setup.py, or Pipfile to confirm.',
156
- packageInstallation: 'Use pip, poetry, or pipenv based on existing config files (requirements.txt, pyproject.toml, Pipfile). Do not pin the posthog version - just add "posthog" without version constraints.',
157
160
  getAdditionalContextLines: (context) => {
158
161
  const packageManagerName = context.packageManager
159
162
  ? (0, utils_1.getPackageManagerName)(context.packageManager)