@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.
- package/dist/src/android/android-wizard-agent.js +2 -0
- package/dist/src/android/android-wizard-agent.js.map +1 -1
- package/dist/src/angular/angular-wizard-agent.js +2 -1
- package/dist/src/angular/angular-wizard-agent.js.map +1 -1
- package/dist/src/astro/astro-wizard-agent.js +2 -1
- package/dist/src/astro/astro-wizard-agent.js.map +1 -1
- package/dist/src/django/django-wizard-agent.js +4 -1
- package/dist/src/django/django-wizard-agent.js.map +1 -1
- package/dist/src/fastapi/fastapi-wizard-agent.js +4 -1
- package/dist/src/fastapi/fastapi-wizard-agent.js.map +1 -1
- package/dist/src/flask/flask-wizard-agent.js +4 -1
- package/dist/src/flask/flask-wizard-agent.js.map +1 -1
- package/dist/src/laravel/laravel-wizard-agent.js +2 -0
- package/dist/src/laravel/laravel-wizard-agent.js.map +1 -1
- package/dist/src/lib/__tests__/package-manager-detection.test.d.ts +1 -0
- package/dist/src/lib/__tests__/package-manager-detection.test.js +195 -0
- package/dist/src/lib/__tests__/package-manager-detection.test.js.map +1 -0
- package/dist/src/lib/__tests__/wizard-tools.test.d.ts +1 -0
- package/dist/src/lib/__tests__/wizard-tools.test.js +200 -0
- package/dist/src/lib/__tests__/wizard-tools.test.js.map +1 -0
- package/dist/src/lib/agent-interface.d.ts +2 -0
- package/dist/src/lib/agent-interface.js +12 -9
- package/dist/src/lib/agent-interface.js.map +1 -1
- package/dist/src/lib/agent-runner.js +7 -4
- package/dist/src/lib/agent-runner.js.map +1 -1
- package/dist/src/lib/framework-config.d.ts +15 -2
- package/dist/src/lib/framework-config.js +8 -1
- package/dist/src/lib/framework-config.js.map +1 -1
- package/dist/src/lib/package-manager-detection.d.ts +36 -0
- package/dist/src/lib/package-manager-detection.js +166 -0
- package/dist/src/lib/package-manager-detection.js.map +1 -0
- package/dist/src/lib/wizard-tools.d.ts +40 -0
- package/dist/src/lib/{env-file-tools.js → wizard-tools.js} +95 -46
- package/dist/src/lib/wizard-tools.js.map +1 -0
- package/dist/src/nextjs/nextjs-wizard-agent.js +2 -1
- package/dist/src/nextjs/nextjs-wizard-agent.js.map +1 -1
- package/dist/src/nuxt/nuxt-wizard-agent.js +2 -1
- package/dist/src/nuxt/nuxt-wizard-agent.js.map +1 -1
- package/dist/src/python/python-wizard-agent.js +4 -1
- package/dist/src/python/python-wizard-agent.js.map +1 -1
- package/dist/src/react-native/react-native-wizard-agent.js +2 -1
- package/dist/src/react-native/react-native-wizard-agent.js.map +1 -1
- package/dist/src/react-router/react-router-wizard-agent.js +2 -1
- package/dist/src/react-router/react-router-wizard-agent.js.map +1 -1
- package/dist/src/run.js +13 -3
- package/dist/src/run.js.map +1 -1
- package/dist/src/svelte/svelte-wizard-agent.js +2 -1
- package/dist/src/svelte/svelte-wizard-agent.js.map +1 -1
- package/dist/src/swift/swift-wizard-agent.js +2 -0
- package/dist/src/swift/swift-wizard-agent.js.map +1 -1
- package/dist/src/tanstack-router/tanstack-router-wizard-agent.js +2 -1
- package/dist/src/tanstack-router/tanstack-router-wizard-agent.js.map +1 -1
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.js +2 -1
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +1 -1
- package/dist/src/vue/vue-wizard-agent.js +2 -1
- package/dist/src/vue/vue-wizard-agent.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/lib/env-file-tools.d.ts +0 -11
- 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
|
-
*
|
|
4
|
-
*
|
|
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.
|
|
11
|
-
exports.
|
|
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
|
-
//
|
|
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
|
-
*
|
|
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
|
|
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 =
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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:
|
|
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
|
|
150
|
-
exports.
|
|
151
|
-
|
|
152
|
-
|
|
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=
|
|
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;
|
|
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;
|
|
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)
|