@posthog/wizard 1.31.1 → 1.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +2 -1
  2. package/dist/bin.js +14 -1
  3. package/dist/bin.js.map +1 -1
  4. package/dist/src/__tests__/run.test.js +5 -5
  5. package/dist/src/__tests__/run.test.js.map +1 -1
  6. package/dist/src/android/android-wizard-agent.d.ts +6 -0
  7. package/dist/src/android/android-wizard-agent.js +140 -0
  8. package/dist/src/android/android-wizard-agent.js.map +1 -0
  9. package/dist/src/android/utils.d.ts +11 -0
  10. package/dist/src/android/utils.js +97 -0
  11. package/dist/src/android/utils.js.map +1 -0
  12. package/dist/src/angular/angular-wizard-agent.d.ts +4 -0
  13. package/dist/src/angular/angular-wizard-agent.js +67 -0
  14. package/dist/src/angular/angular-wizard-agent.js.map +1 -0
  15. package/dist/src/angular/utils.d.ts +4 -0
  16. package/dist/src/angular/utils.js +9 -0
  17. package/dist/src/angular/utils.js.map +1 -0
  18. package/dist/src/astro/astro-wizard-agent.d.ts +7 -0
  19. package/dist/src/astro/astro-wizard-agent.js +102 -0
  20. package/dist/src/astro/astro-wizard-agent.js.map +1 -0
  21. package/dist/src/astro/utils.d.ts +17 -0
  22. package/dist/src/astro/utils.js +163 -0
  23. package/dist/src/astro/utils.js.map +1 -0
  24. package/dist/src/django/django-wizard-agent.d.ts +8 -5
  25. package/dist/src/django/django-wizard-agent.js +62 -51
  26. package/dist/src/django/django-wizard-agent.js.map +1 -1
  27. package/dist/src/django/utils.d.ts +1 -1
  28. package/dist/src/django/utils.js +3 -22
  29. package/dist/src/django/utils.js.map +1 -1
  30. package/dist/src/fastapi/fastapi-wizard-agent.d.ts +7 -0
  31. package/dist/src/fastapi/fastapi-wizard-agent.js +217 -0
  32. package/dist/src/fastapi/fastapi-wizard-agent.js.map +1 -0
  33. package/dist/src/fastapi/utils.d.ts +26 -0
  34. package/dist/src/fastapi/utils.js +258 -0
  35. package/dist/src/fastapi/utils.js.map +1 -0
  36. package/dist/src/flask/flask-wizard-agent.d.ts +8 -5
  37. package/dist/src/flask/flask-wizard-agent.js +67 -51
  38. package/dist/src/flask/flask-wizard-agent.js.map +1 -1
  39. package/dist/src/flask/utils.d.ts +1 -1
  40. package/dist/src/flask/utils.js +3 -22
  41. package/dist/src/flask/utils.js.map +1 -1
  42. package/dist/src/laravel/laravel-wizard-agent.d.ts +10 -5
  43. package/dist/src/laravel/laravel-wizard-agent.js +50 -53
  44. package/dist/src/laravel/laravel-wizard-agent.js.map +1 -1
  45. package/dist/src/laravel/utils.d.ts +1 -1
  46. package/dist/src/laravel/utils.js +3 -22
  47. package/dist/src/laravel/utils.js.map +1 -1
  48. package/dist/src/lib/__tests__/agent-interface.test.js +1 -0
  49. package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
  50. package/dist/src/lib/agent-interface.d.ts +4 -1
  51. package/dist/src/lib/agent-interface.js +36 -3
  52. package/dist/src/lib/agent-interface.js.map +1 -1
  53. package/dist/src/lib/agent-runner.js +69 -6
  54. package/dist/src/lib/agent-runner.js.map +1 -1
  55. package/dist/src/lib/api.d.ts +4 -4
  56. package/dist/src/lib/constants.d.ts +15 -14
  57. package/dist/src/lib/constants.js +17 -40
  58. package/dist/src/lib/constants.js.map +1 -1
  59. package/dist/src/lib/env-file-tools.d.ts +11 -0
  60. package/dist/src/lib/env-file-tools.js +154 -0
  61. package/dist/src/lib/env-file-tools.js.map +1 -0
  62. package/dist/src/lib/framework-config.d.ts +34 -16
  63. package/dist/src/lib/framework-config.js.map +1 -1
  64. package/dist/src/lib/registry.d.ts +3 -0
  65. package/dist/src/lib/registry.js +41 -0
  66. package/dist/src/lib/registry.js.map +1 -0
  67. package/dist/src/nextjs/nextjs-wizard-agent.d.ts +7 -5
  68. package/dist/src/nextjs/nextjs-wizard-agent.js +16 -79
  69. package/dist/src/nextjs/nextjs-wizard-agent.js.map +1 -1
  70. package/dist/src/nextjs/utils.d.ts +1 -1
  71. package/dist/src/nextjs/utils.js +3 -22
  72. package/dist/src/nextjs/utils.js.map +1 -1
  73. package/dist/src/nuxt/nuxt-wizard-agent.d.ts +6 -0
  74. package/dist/src/nuxt/nuxt-wizard-agent.js +77 -0
  75. package/dist/src/nuxt/nuxt-wizard-agent.js.map +1 -0
  76. package/dist/src/python/python-wizard-agent.d.ts +7 -0
  77. package/dist/src/python/python-wizard-agent.js +269 -0
  78. package/dist/src/python/python-wizard-agent.js.map +1 -0
  79. package/dist/src/python/utils.d.ts +28 -0
  80. package/dist/src/python/utils.js +147 -0
  81. package/dist/src/python/utils.js.map +1 -0
  82. package/dist/src/react-native/react-native-wizard-agent.d.ts +7 -0
  83. package/dist/src/react-native/react-native-wizard-agent.js +91 -0
  84. package/dist/src/react-native/react-native-wizard-agent.js.map +1 -0
  85. package/dist/src/react-native/utils.d.ts +8 -0
  86. package/dist/src/react-native/utils.js +31 -0
  87. package/dist/src/react-native/utils.js.map +1 -0
  88. package/dist/src/react-router/react-router-wizard-agent.d.ts +7 -5
  89. package/dist/src/react-router/react-router-wizard-agent.js +18 -80
  90. package/dist/src/react-router/react-router-wizard-agent.js.map +1 -1
  91. package/dist/src/react-router/utils.d.ts +1 -1
  92. package/dist/src/react-router/utils.js +3 -21
  93. package/dist/src/react-router/utils.js.map +1 -1
  94. package/dist/src/run.d.ts +1 -0
  95. package/dist/src/run.js +28 -76
  96. package/dist/src/run.js.map +1 -1
  97. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +6 -6
  98. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +6 -6
  99. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +6 -6
  100. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +6 -6
  101. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +6 -6
  102. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +6 -6
  103. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +6 -6
  104. package/dist/src/svelte/svelte-wizard-agent.d.ts +4 -0
  105. package/dist/src/svelte/svelte-wizard-agent.js +60 -0
  106. package/dist/src/svelte/svelte-wizard-agent.js.map +1 -0
  107. package/dist/src/swift/swift-wizard-agent.d.ts +7 -0
  108. package/dist/src/swift/swift-wizard-agent.js +141 -0
  109. package/dist/src/swift/swift-wizard-agent.js.map +1 -0
  110. package/dist/src/swift/utils.d.ts +8 -0
  111. package/dist/src/swift/utils.js +105 -0
  112. package/dist/src/swift/utils.js.map +1 -0
  113. package/dist/src/tanstack-router/tanstack-router-wizard-agent.d.ts +7 -0
  114. package/dist/src/tanstack-router/tanstack-router-wizard-agent.js +93 -0
  115. package/dist/src/tanstack-router/tanstack-router-wizard-agent.js.map +1 -0
  116. package/dist/src/tanstack-router/utils.d.ts +17 -0
  117. package/dist/src/tanstack-router/utils.js +192 -0
  118. package/dist/src/tanstack-router/utils.js.map +1 -0
  119. package/dist/src/tanstack-start/tanstack-start-wizard-agent.d.ts +4 -0
  120. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js +66 -0
  121. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +1 -0
  122. package/dist/src/tanstack-start/utils.d.ts +4 -0
  123. package/dist/src/tanstack-start/utils.js +9 -0
  124. package/dist/src/tanstack-start/utils.js.map +1 -0
  125. package/dist/src/utils/__tests__/semver.test.d.ts +1 -0
  126. package/dist/src/utils/__tests__/semver.test.js +117 -0
  127. package/dist/src/utils/__tests__/semver.test.js.map +1 -0
  128. package/dist/src/utils/clack-utils.js +3 -5
  129. package/dist/src/utils/clack-utils.js.map +1 -1
  130. package/dist/src/utils/debug.d.ts +2 -0
  131. package/dist/src/utils/debug.js +17 -5
  132. package/dist/src/utils/debug.js.map +1 -1
  133. package/dist/src/utils/file-utils.d.ts +1 -31
  134. package/dist/src/utils/file-utils.js +0 -163
  135. package/dist/src/utils/file-utils.js.map +1 -1
  136. package/dist/src/utils/semver.d.ts +16 -0
  137. package/dist/src/utils/semver.js +37 -0
  138. package/dist/src/utils/semver.js.map +1 -1
  139. package/dist/src/utils/types.d.ts +4 -0
  140. package/dist/src/utils/types.js.map +1 -1
  141. package/dist/src/vue/vue-wizard-agent.d.ts +4 -0
  142. package/dist/src/vue/vue-wizard-agent.js +64 -0
  143. package/dist/src/vue/vue-wizard-agent.js.map +1 -0
  144. package/package.json +1 -1
  145. package/dist/src/astro/astro-wizard.d.ts +0 -2
  146. package/dist/src/astro/astro-wizard.js +0 -89
  147. package/dist/src/astro/astro-wizard.js.map +0 -1
  148. package/dist/src/astro/docs.d.ts +0 -4
  149. package/dist/src/astro/docs.js +0 -101
  150. package/dist/src/astro/docs.js.map +0 -1
  151. package/dist/src/lib/config.d.ts +0 -104
  152. package/dist/src/lib/config.js +0 -368
  153. package/dist/src/lib/config.js.map +0 -1
  154. package/dist/src/lib/messages.d.ts +0 -16
  155. package/dist/src/lib/messages.js +0 -66
  156. package/dist/src/lib/messages.js.map +0 -1
  157. package/dist/src/lib/prompts.d.ts +0 -16
  158. package/dist/src/lib/prompts.js +0 -83
  159. package/dist/src/lib/prompts.js.map +0 -1
  160. package/dist/src/react/docs.d.ts +0 -4
  161. package/dist/src/react/docs.js +0 -49
  162. package/dist/src/react/docs.js.map +0 -1
  163. package/dist/src/react/react-wizard.d.ts +0 -2
  164. package/dist/src/react/react-wizard.js +0 -121
  165. package/dist/src/react/react-wizard.js.map +0 -1
  166. package/dist/src/react-native/docs.d.ts +0 -5
  167. package/dist/src/react-native/docs.js +0 -31
  168. package/dist/src/react-native/docs.js.map +0 -1
  169. package/dist/src/react-native/react-native-wizard.d.ts +0 -2
  170. package/dist/src/react-native/react-native-wizard.js +0 -128
  171. package/dist/src/react-native/react-native-wizard.js.map +0 -1
  172. package/dist/src/svelte/docs.d.ts +0 -3
  173. package/dist/src/svelte/docs.js +0 -111
  174. package/dist/src/svelte/docs.js.map +0 -1
  175. package/dist/src/svelte/svelte-wizard.d.ts +0 -2
  176. package/dist/src/svelte/svelte-wizard.js +0 -121
  177. package/dist/src/svelte/svelte-wizard.js.map +0 -1
  178. package/dist/src/utils/errors.d.ts +0 -3
  179. package/dist/src/utils/errors.js +0 -11
  180. package/dist/src/utils/errors.js.map +0 -1
  181. package/dist/src/utils/query.d.ts +0 -11
  182. package/dist/src/utils/query.js +0 -115
  183. package/dist/src/utils/query.js.map +0 -1
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ASTRO_AGENT_CONFIG = void 0;
4
+ const constants_1 = require("../lib/constants");
5
+ const package_json_1 = require("../utils/package-json");
6
+ const clack_utils_1 = require("../utils/clack-utils");
7
+ const utils_1 = require("./utils");
8
+ exports.ASTRO_AGENT_CONFIG = {
9
+ metadata: {
10
+ name: 'Astro',
11
+ integration: constants_1.Integration.astro,
12
+ docsUrl: 'https://posthog.com/docs/libraries/astro',
13
+ gatherContext: async (options) => {
14
+ const renderingMode = await (0, utils_1.getAstroRenderingMode)(options);
15
+ return { renderingMode };
16
+ },
17
+ },
18
+ detection: {
19
+ packageName: 'astro',
20
+ packageDisplayName: 'Astro',
21
+ getVersion: (packageJson) => (0, package_json_1.getPackageVersion)('astro', packageJson),
22
+ getVersionBucket: utils_1.getAstroVersionBucket,
23
+ minimumVersion: '4.0.0',
24
+ getInstalledVersion: async (options) => {
25
+ const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
26
+ return (0, package_json_1.getPackageVersion)('astro', packageJson);
27
+ },
28
+ detect: async (options) => {
29
+ const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
30
+ return packageJson ? (0, package_json_1.hasPackageInstalled)('astro', packageJson) : false;
31
+ },
32
+ },
33
+ environment: {
34
+ uploadToHosting: true,
35
+ getEnvVars: (apiKey, host) => ({
36
+ PUBLIC_POSTHOG_KEY: apiKey,
37
+ PUBLIC_POSTHOG_HOST: host,
38
+ }),
39
+ },
40
+ analytics: {
41
+ getTags: (context) => ({
42
+ 'rendering-mode': context.renderingMode ?? 'static',
43
+ }),
44
+ },
45
+ prompts: {
46
+ 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.',
47
+ packageInstallation: 'Look for lockfiles to determine the package manager (npm, yarn, pnpm, bun). Do not manually edit package.json.',
48
+ getAdditionalContextLines: (context) => {
49
+ const modeName = (0, utils_1.getAstroRenderingModeName)(context.renderingMode ?? utils_1.AstroRenderingMode.STATIC);
50
+ // Map rendering mode to framework ID for MCP docs resource
51
+ const frameworkIdMap = {
52
+ [utils_1.AstroRenderingMode.STATIC]: 'astro-static',
53
+ [utils_1.AstroRenderingMode.VIEW_TRANSITIONS]: 'astro-view-transitions',
54
+ [utils_1.AstroRenderingMode.SSR]: 'astro-ssr',
55
+ [utils_1.AstroRenderingMode.HYBRID]: 'astro-hybrid',
56
+ };
57
+ const frameworkId = frameworkIdMap[context.renderingMode ?? utils_1.AstroRenderingMode.STATIC];
58
+ const lines = [
59
+ `Rendering mode: ${modeName}`,
60
+ `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,
61
+ ];
62
+ // Add mode-specific guidance
63
+ if (context.renderingMode === utils_1.AstroRenderingMode.VIEW_TRANSITIONS) {
64
+ lines.push('IMPORTANT: Use window.__posthog_initialized guard to prevent re-initialization during soft navigation');
65
+ lines.push("IMPORTANT: Set capture_pageview: 'history_change' for automatic pageview tracking");
66
+ }
67
+ if (context.renderingMode === utils_1.AstroRenderingMode.SSR ||
68
+ context.renderingMode === utils_1.AstroRenderingMode.HYBRID) {
69
+ lines.push('IMPORTANT: Use posthog-node for server-side tracking in API routes');
70
+ lines.push('IMPORTANT: Create a singleton pattern for the posthog-node client');
71
+ }
72
+ return lines;
73
+ },
74
+ },
75
+ ui: {
76
+ successMessage: 'PostHog integration complete',
77
+ estimatedDurationMinutes: 6,
78
+ getOutroChanges: (context) => {
79
+ const modeName = (0, utils_1.getAstroRenderingModeName)(context.renderingMode ?? utils_1.AstroRenderingMode.STATIC);
80
+ const changes = [
81
+ `Analyzed your Astro project structure (${modeName})`,
82
+ `Created PostHog component with is:inline script`,
83
+ `Integrated PostHog into your layout`,
84
+ ];
85
+ if (context.renderingMode === utils_1.AstroRenderingMode.SSR ||
86
+ context.renderingMode === utils_1.AstroRenderingMode.HYBRID) {
87
+ changes.push(`Set up posthog-node for server-side tracking`);
88
+ }
89
+ if (context.renderingMode === utils_1.AstroRenderingMode.VIEW_TRANSITIONS) {
90
+ changes.push(`Added initialization guard for view transitions compatibility`);
91
+ }
92
+ return changes;
93
+ },
94
+ getOutroNextSteps: () => {
95
+ return [
96
+ 'Start your development server to see PostHog in action',
97
+ 'Visit your PostHog dashboard to see incoming events',
98
+ ];
99
+ },
100
+ },
101
+ };
102
+ //# sourceMappingURL=astro-wizard-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-wizard-agent.js","sourceRoot":"","sources":["../../../src/astro/astro-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Astro 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 getAstroRenderingMode,\n getAstroVersionBucket,\n getAstroRenderingModeName,\n AstroRenderingMode,\n} from './utils';\n\ntype AstroContext = {\n renderingMode?: AstroRenderingMode;\n};\n\nexport const ASTRO_AGENT_CONFIG: FrameworkConfig<AstroContext> = {\n metadata: {\n name: 'Astro',\n integration: Integration.astro,\n docsUrl: 'https://posthog.com/docs/libraries/astro',\n gatherContext: async (options: WizardOptions) => {\n const renderingMode = await getAstroRenderingMode(options);\n return { renderingMode };\n },\n },\n\n detection: {\n packageName: 'astro',\n packageDisplayName: 'Astro',\n getVersion: (packageJson: unknown) =>\n getPackageVersion('astro', packageJson as PackageDotJson),\n getVersionBucket: getAstroVersionBucket,\n minimumVersion: '4.0.0',\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await getPackageDotJson(options);\n return getPackageVersion('astro', packageJson);\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson ? hasPackageInstalled('astro', packageJson) : false;\n },\n },\n\n environment: {\n uploadToHosting: true,\n getEnvVars: (apiKey: string, host: string) => ({\n PUBLIC_POSTHOG_KEY: apiKey,\n PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n 'rendering-mode': context.renderingMode ?? 'static',\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 modeName = getAstroRenderingModeName(\n context.renderingMode ?? AstroRenderingMode.STATIC,\n );\n\n // Map rendering mode to framework ID for MCP docs resource\n const frameworkIdMap: Record<AstroRenderingMode, string> = {\n [AstroRenderingMode.STATIC]: 'astro-static',\n [AstroRenderingMode.VIEW_TRANSITIONS]: 'astro-view-transitions',\n [AstroRenderingMode.SSR]: 'astro-ssr',\n [AstroRenderingMode.HYBRID]: 'astro-hybrid',\n };\n\n const frameworkId =\n frameworkIdMap[context.renderingMode ?? AstroRenderingMode.STATIC];\n\n const lines = [\n `Rendering mode: ${modeName}`,\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n\n // Add mode-specific guidance\n if (context.renderingMode === AstroRenderingMode.VIEW_TRANSITIONS) {\n lines.push(\n 'IMPORTANT: Use window.__posthog_initialized guard to prevent re-initialization during soft navigation',\n );\n lines.push(\n \"IMPORTANT: Set capture_pageview: 'history_change' for automatic pageview tracking\",\n );\n }\n\n if (\n context.renderingMode === AstroRenderingMode.SSR ||\n context.renderingMode === AstroRenderingMode.HYBRID\n ) {\n lines.push(\n 'IMPORTANT: Use posthog-node for server-side tracking in API routes',\n );\n lines.push(\n 'IMPORTANT: Create a singleton pattern for the posthog-node client',\n );\n }\n\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 6,\n getOutroChanges: (context) => {\n const modeName = getAstroRenderingModeName(\n context.renderingMode ?? AstroRenderingMode.STATIC,\n );\n const changes = [\n `Analyzed your Astro project structure (${modeName})`,\n `Created PostHog component with is:inline script`,\n `Integrated PostHog into your layout`,\n ];\n\n if (\n context.renderingMode === AstroRenderingMode.SSR ||\n context.renderingMode === AstroRenderingMode.HYBRID\n ) {\n changes.push(`Set up posthog-node for server-side tracking`);\n }\n\n if (context.renderingMode === AstroRenderingMode.VIEW_TRANSITIONS) {\n changes.push(\n `Added initialization guard for view transitions compatibility`,\n );\n }\n\n return changes;\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"]}
@@ -0,0 +1,17 @@
1
+ import type { WizardOptions } from '../utils/types';
2
+ export declare const getAstroVersionBucket: (version: string | undefined) => string;
3
+ export declare enum AstroRenderingMode {
4
+ STATIC = "static",
5
+ SSR = "ssr",
6
+ HYBRID = "hybrid",
7
+ VIEW_TRANSITIONS = "view-transitions"
8
+ }
9
+ export declare const IGNORE_PATTERNS: string[];
10
+ /**
11
+ * Detect the Astro rendering mode by analyzing:
12
+ * 1. astro.config.* for output mode
13
+ * 2. Package.json for adapters
14
+ * 3. Source files for view transitions usage
15
+ */
16
+ export declare function getAstroRenderingMode({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<AstroRenderingMode>;
17
+ export declare const getAstroRenderingModeName: (mode: AstroRenderingMode) => string;
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getAstroRenderingModeName = exports.IGNORE_PATTERNS = exports.AstroRenderingMode = exports.getAstroVersionBucket = void 0;
7
+ exports.getAstroRenderingMode = getAstroRenderingMode;
8
+ const fast_glob_1 = __importDefault(require("fast-glob"));
9
+ const promises_1 = __importDefault(require("fs/promises"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const clack_utils_1 = require("../utils/clack-utils");
12
+ const clack_1 = __importDefault(require("../utils/clack"));
13
+ const constants_1 = require("../lib/constants");
14
+ const semver_1 = require("../utils/semver");
15
+ exports.getAstroVersionBucket = (0, semver_1.createVersionBucket)();
16
+ var AstroRenderingMode;
17
+ (function (AstroRenderingMode) {
18
+ AstroRenderingMode["STATIC"] = "static";
19
+ AstroRenderingMode["SSR"] = "ssr";
20
+ AstroRenderingMode["HYBRID"] = "hybrid";
21
+ AstroRenderingMode["VIEW_TRANSITIONS"] = "view-transitions";
22
+ })(AstroRenderingMode || (exports.AstroRenderingMode = AstroRenderingMode = {}));
23
+ exports.IGNORE_PATTERNS = [
24
+ '**/node_modules/**',
25
+ '**/dist/**',
26
+ '**/.astro/**',
27
+ ];
28
+ /**
29
+ * Detect the Astro rendering mode by analyzing:
30
+ * 1. astro.config.* for output mode
31
+ * 2. Package.json for adapters
32
+ * 3. Source files for view transitions usage
33
+ */
34
+ async function getAstroRenderingMode({ installDir, }) {
35
+ // Check for astro config file
36
+ const configMatches = await (0, fast_glob_1.default)('astro.config.@(mjs|ts|js)', {
37
+ dot: true,
38
+ cwd: installDir,
39
+ ignore: exports.IGNORE_PATTERNS,
40
+ });
41
+ let hasAdapter = false;
42
+ let outputMode = null;
43
+ let usesViewTransitions = false;
44
+ // Check package.json for adapters
45
+ try {
46
+ const packageJsonPath = path_1.default.join(installDir, 'package.json');
47
+ const packageJsonContent = await promises_1.default.readFile(packageJsonPath, 'utf-8');
48
+ const packageJson = JSON.parse(packageJsonContent);
49
+ const allDeps = {
50
+ ...packageJson.dependencies,
51
+ ...packageJson.devDependencies,
52
+ };
53
+ // Check for Astro adapters (node, vercel, netlify, cloudflare, etc.)
54
+ hasAdapter = Object.keys(allDeps).some((dep) => dep.startsWith('@astrojs/') &&
55
+ (dep.includes('node') ||
56
+ dep.includes('vercel') ||
57
+ dep.includes('netlify') ||
58
+ dep.includes('cloudflare') ||
59
+ dep.includes('deno')));
60
+ }
61
+ catch {
62
+ // package.json not found or invalid
63
+ }
64
+ // Parse astro config for output mode
65
+ if (configMatches.length > 0) {
66
+ try {
67
+ const configPath = path_1.default.join(installDir, configMatches[0]);
68
+ const configContent = await promises_1.default.readFile(configPath, 'utf-8');
69
+ // Simple regex to detect output mode
70
+ const outputMatch = configContent.match(/output:\s*['"](\w+)['"]/);
71
+ if (outputMatch) {
72
+ outputMode = outputMatch[1];
73
+ }
74
+ }
75
+ catch {
76
+ // Config file not readable
77
+ }
78
+ }
79
+ // Check for view transitions usage
80
+ const viewTransitionMatches = await (0, fast_glob_1.default)('**/*.@(astro|ts|tsx|js|jsx)', {
81
+ dot: true,
82
+ cwd: installDir,
83
+ ignore: exports.IGNORE_PATTERNS,
84
+ });
85
+ for (const file of viewTransitionMatches.slice(0, 20)) {
86
+ // Check first 20 files
87
+ try {
88
+ const filePath = path_1.default.join(installDir, file);
89
+ const content = await promises_1.default.readFile(filePath, 'utf-8');
90
+ if (content.includes('ClientRouter') ||
91
+ content.includes('ViewTransitions') ||
92
+ content.includes('astro:transitions')) {
93
+ usesViewTransitions = true;
94
+ break;
95
+ }
96
+ }
97
+ catch {
98
+ // File not readable
99
+ }
100
+ }
101
+ // Determine rendering mode based on findings
102
+ if (usesViewTransitions) {
103
+ clack_1.default.log.info(`Detected Astro with View Transitions (ClientRouter) 🔄`);
104
+ return AstroRenderingMode.VIEW_TRANSITIONS;
105
+ }
106
+ if (outputMode === 'server' && hasAdapter) {
107
+ clack_1.default.log.info(`Detected Astro SSR mode 🖥️`);
108
+ return AstroRenderingMode.SSR;
109
+ }
110
+ // In Astro 5, 'static' is the default and supports per-page SSR opt-in when an adapter is present
111
+ // This is the "hybrid" pattern even if output mode isn't explicitly set
112
+ if (hasAdapter) {
113
+ clack_1.default.log.info(`Detected Astro hybrid mode 🔀`);
114
+ return AstroRenderingMode.HYBRID;
115
+ }
116
+ if (!hasAdapter) {
117
+ clack_1.default.log.info(`Detected Astro static mode 📄`);
118
+ return AstroRenderingMode.STATIC;
119
+ }
120
+ // If detection is ambiguous, ask the user
121
+ const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
122
+ message: 'What rendering mode is your Astro project using?',
123
+ options: [
124
+ {
125
+ label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.STATIC),
126
+ value: AstroRenderingMode.STATIC,
127
+ hint: 'Pre-rendered static HTML (default)',
128
+ },
129
+ {
130
+ label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.VIEW_TRANSITIONS),
131
+ value: AstroRenderingMode.VIEW_TRANSITIONS,
132
+ hint: 'Static with ClientRouter for SPA-like navigation',
133
+ },
134
+ {
135
+ label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.HYBRID),
136
+ value: AstroRenderingMode.HYBRID,
137
+ hint: 'Mostly static with some SSR pages',
138
+ },
139
+ {
140
+ label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.SSR),
141
+ value: AstroRenderingMode.SSR,
142
+ hint: 'Full server-side rendering',
143
+ },
144
+ ],
145
+ }), constants_1.Integration.astro);
146
+ return result;
147
+ }
148
+ const getAstroRenderingModeName = (mode) => {
149
+ switch (mode) {
150
+ case AstroRenderingMode.STATIC:
151
+ return 'Static (SSG)';
152
+ case AstroRenderingMode.VIEW_TRANSITIONS:
153
+ return 'View Transitions';
154
+ case AstroRenderingMode.SSR:
155
+ return 'Server (SSR)';
156
+ case AstroRenderingMode.HYBRID:
157
+ return 'Hybrid';
158
+ default:
159
+ return 'Static';
160
+ }
161
+ };
162
+ exports.getAstroRenderingModeName = getAstroRenderingModeName;
163
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/astro/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import fg from 'fast-glob';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { abortIfCancelled } from '../utils/clack-utils';\nimport clack from '../utils/clack';\nimport type { WizardOptions } from '../utils/types';\nimport { Integration } from '../lib/constants';\nimport { createVersionBucket } from '../utils/semver';\n\nexport const getAstroVersionBucket = createVersionBucket();\n\nexport enum AstroRenderingMode {\n STATIC = 'static',\n SSR = 'ssr',\n HYBRID = 'hybrid',\n VIEW_TRANSITIONS = 'view-transitions',\n}\n\nexport const IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/.astro/**',\n];\n\n/**\n * Detect the Astro rendering mode by analyzing:\n * 1. astro.config.* for output mode\n * 2. Package.json for adapters\n * 3. Source files for view transitions usage\n */\nexport async function getAstroRenderingMode({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<AstroRenderingMode> {\n // Check for astro config file\n const configMatches = await fg('astro.config.@(mjs|ts|js)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n let hasAdapter = false;\n let outputMode: string | null = null;\n let usesViewTransitions = false;\n\n // Check package.json for adapters\n try {\n const packageJsonPath = path.join(installDir, 'package.json');\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n // Check for Astro adapters (node, vercel, netlify, cloudflare, etc.)\n hasAdapter = Object.keys(allDeps).some(\n (dep) =>\n dep.startsWith('@astrojs/') &&\n (dep.includes('node') ||\n dep.includes('vercel') ||\n dep.includes('netlify') ||\n dep.includes('cloudflare') ||\n dep.includes('deno')),\n );\n } catch {\n // package.json not found or invalid\n }\n\n // Parse astro config for output mode\n if (configMatches.length > 0) {\n try {\n const configPath = path.join(installDir, configMatches[0]);\n const configContent = await fs.readFile(configPath, 'utf-8');\n\n // Simple regex to detect output mode\n const outputMatch = configContent.match(/output:\\s*['\"](\\w+)['\"]/);\n if (outputMatch) {\n outputMode = outputMatch[1];\n }\n } catch {\n // Config file not readable\n }\n }\n\n // Check for view transitions usage\n const viewTransitionMatches = await fg('**/*.@(astro|ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const file of viewTransitionMatches.slice(0, 20)) {\n // Check first 20 files\n try {\n const filePath = path.join(installDir, file);\n const content = await fs.readFile(filePath, 'utf-8');\n if (\n content.includes('ClientRouter') ||\n content.includes('ViewTransitions') ||\n content.includes('astro:transitions')\n ) {\n usesViewTransitions = true;\n break;\n }\n } catch {\n // File not readable\n }\n }\n\n // Determine rendering mode based on findings\n if (usesViewTransitions) {\n clack.log.info(`Detected Astro with View Transitions (ClientRouter) 🔄`);\n return AstroRenderingMode.VIEW_TRANSITIONS;\n }\n\n if (outputMode === 'server' && hasAdapter) {\n clack.log.info(`Detected Astro SSR mode 🖥️`);\n return AstroRenderingMode.SSR;\n }\n\n // In Astro 5, 'static' is the default and supports per-page SSR opt-in when an adapter is present\n // This is the \"hybrid\" pattern even if output mode isn't explicitly set\n if (hasAdapter) {\n clack.log.info(`Detected Astro hybrid mode 🔀`);\n return AstroRenderingMode.HYBRID;\n }\n\n if (!hasAdapter) {\n clack.log.info(`Detected Astro static mode 📄`);\n return AstroRenderingMode.STATIC;\n }\n\n // If detection is ambiguous, ask the user\n const result: AstroRenderingMode = await abortIfCancelled(\n clack.select({\n message: 'What rendering mode is your Astro project using?',\n options: [\n {\n label: getAstroRenderingModeName(AstroRenderingMode.STATIC),\n value: AstroRenderingMode.STATIC,\n hint: 'Pre-rendered static HTML (default)',\n },\n {\n label: getAstroRenderingModeName(AstroRenderingMode.VIEW_TRANSITIONS),\n value: AstroRenderingMode.VIEW_TRANSITIONS,\n hint: 'Static with ClientRouter for SPA-like navigation',\n },\n {\n label: getAstroRenderingModeName(AstroRenderingMode.HYBRID),\n value: AstroRenderingMode.HYBRID,\n hint: 'Mostly static with some SSR pages',\n },\n {\n label: getAstroRenderingModeName(AstroRenderingMode.SSR),\n value: AstroRenderingMode.SSR,\n hint: 'Full server-side rendering',\n },\n ],\n }),\n Integration.astro,\n );\n\n return result;\n}\n\nexport const getAstroRenderingModeName = (mode: AstroRenderingMode): string => {\n switch (mode) {\n case AstroRenderingMode.STATIC:\n return 'Static (SSG)';\n case AstroRenderingMode.VIEW_TRANSITIONS:\n return 'View Transitions';\n case AstroRenderingMode.SSR:\n return 'Server (SSR)';\n case AstroRenderingMode.HYBRID:\n return 'Hybrid';\n default:\n return 'Static';\n }\n};\n"]}
@@ -1,5 +1,8 @@
1
- import type { WizardOptions } from '../utils/types';
2
- /**
3
- * Django wizard powered by the universal agent runner.
4
- */
5
- export declare function runDjangoWizardAgent(options: WizardOptions): Promise<void>;
1
+ import type { FrameworkConfig } from '../lib/framework-config';
2
+ import { DjangoProjectType } from './utils';
3
+ type DjangoContext = {
4
+ projectType?: DjangoProjectType;
5
+ settingsFile?: string;
6
+ };
7
+ export declare const DJANGO_AGENT_CONFIG: FrameworkConfig<DjangoContext>;
8
+ export {};
@@ -36,22 +36,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.runDjangoWizardAgent = runDjangoWizardAgent;
40
- const debug_1 = require("../utils/debug");
41
- const agent_runner_1 = require("../lib/agent-runner");
39
+ exports.DJANGO_AGENT_CONFIG = void 0;
42
40
  const constants_1 = require("../lib/constants");
43
- const clack_1 = __importDefault(require("../utils/clack"));
44
- const chalk_1 = __importDefault(require("chalk"));
45
- const semver = __importStar(require("semver"));
41
+ const fast_glob_1 = __importDefault(require("fast-glob"));
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
46
44
  const utils_1 = require("./utils");
47
- /**
48
- * Django framework configuration for the universal agent runner
49
- */
50
- const MINIMUM_DJANGO_VERSION = '3.0.0';
51
- const DJANGO_AGENT_CONFIG = {
45
+ exports.DJANGO_AGENT_CONFIG = {
52
46
  metadata: {
53
47
  name: 'Django',
54
48
  integration: constants_1.Integration.django,
49
+ beta: true,
55
50
  docsUrl: 'https://posthog.com/docs/libraries/django',
56
51
  unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/python',
57
52
  gatherContext: async (options) => {
@@ -64,12 +59,53 @@ const DJANGO_AGENT_CONFIG = {
64
59
  packageName: 'django',
65
60
  packageDisplayName: 'Django',
66
61
  usesPackageJson: false,
67
- getVersion: (_packageJson) => {
68
- // For Django, we don't use package.json. Version is extracted separately
69
- // from requirements.txt or pyproject.toml in the wizard entry point
70
- return undefined;
71
- },
62
+ getVersion: () => undefined,
72
63
  getVersionBucket: utils_1.getDjangoVersionBucket,
64
+ minimumVersion: '3.0.0',
65
+ getInstalledVersion: (options) => (0, utils_1.getDjangoVersion)(options),
66
+ detect: async (options) => {
67
+ const { installDir } = options;
68
+ const managePyMatches = await (0, fast_glob_1.default)('**/manage.py', {
69
+ cwd: installDir,
70
+ ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],
71
+ });
72
+ if (managePyMatches.length > 0) {
73
+ for (const match of managePyMatches) {
74
+ try {
75
+ const content = fs.readFileSync(path.join(installDir, match), 'utf-8');
76
+ // Check for actual Django imports and usage
77
+ if (content.includes('from django') ||
78
+ content.includes('import django') ||
79
+ content.includes('DJANGO_SETTINGS_MODULE') ||
80
+ /execute_from_command_line/.test(content)) {
81
+ return true;
82
+ }
83
+ }
84
+ catch {
85
+ continue;
86
+ }
87
+ }
88
+ }
89
+ const requirementsFiles = await (0, fast_glob_1.default)(['**/requirements*.txt', '**/pyproject.toml', '**/setup.py'], {
90
+ cwd: installDir,
91
+ ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],
92
+ });
93
+ for (const reqFile of requirementsFiles) {
94
+ try {
95
+ const content = fs.readFileSync(path.join(installDir, reqFile), 'utf-8');
96
+ // Match Django as a package requirement, not in comments or other text
97
+ // Look for: django, django>=, django==, django~=, Django (capitalized)
98
+ if (/^django([>=~!<\s]|$)/im.test(content) ||
99
+ /["']django["']/i.test(content)) {
100
+ return true;
101
+ }
102
+ }
103
+ catch {
104
+ continue;
105
+ }
106
+ }
107
+ return false;
108
+ },
73
109
  },
74
110
  environment: {
75
111
  uploadToHosting: false,
@@ -79,20 +115,16 @@ const DJANGO_AGENT_CONFIG = {
79
115
  }),
80
116
  },
81
117
  analytics: {
82
- getTags: (context) => {
83
- const projectType = context.projectType;
84
- return {
85
- projectType: projectType || 'unknown',
86
- };
87
- },
118
+ getTags: (context) => ({
119
+ projectType: context.projectType || 'unknown',
120
+ }),
88
121
  },
89
122
  prompts: {
90
123
  projectTypeDetection: 'This is a Python/Django project. Look for requirements.txt, pyproject.toml, setup.py, Pipfile, or manage.py to confirm.',
91
124
  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.',
92
125
  getAdditionalContextLines: (context) => {
93
- const projectType = context.projectType;
94
- const projectTypeName = projectType
95
- ? (0, utils_1.getDjangoProjectTypeName)(projectType)
126
+ const projectTypeName = context.projectType
127
+ ? (0, utils_1.getDjangoProjectTypeName)(context.projectType)
96
128
  : 'unknown';
97
129
  // Map project type to framework ID for MCP docs resource
98
130
  const frameworkIdMap = {
@@ -101,7 +133,9 @@ const DJANGO_AGENT_CONFIG = {
101
133
  [utils_1.DjangoProjectType.WAGTAIL]: 'django',
102
134
  [utils_1.DjangoProjectType.CHANNELS]: 'django',
103
135
  };
104
- const frameworkId = projectType ? frameworkIdMap[projectType] : 'django';
136
+ const frameworkId = context.projectType
137
+ ? frameworkIdMap[context.projectType]
138
+ : 'django';
105
139
  const lines = [
106
140
  `Project type: ${projectTypeName}`,
107
141
  `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,
@@ -116,9 +150,8 @@ const DJANGO_AGENT_CONFIG = {
116
150
  successMessage: 'PostHog integration complete',
117
151
  estimatedDurationMinutes: 5,
118
152
  getOutroChanges: (context) => {
119
- const projectType = context.projectType;
120
- const projectTypeName = projectType
121
- ? (0, utils_1.getDjangoProjectTypeName)(projectType)
153
+ const projectTypeName = context.projectType
154
+ ? (0, utils_1.getDjangoProjectTypeName)(context.projectType)
122
155
  : 'Django';
123
156
  return [
124
157
  `Analyzed your ${projectTypeName} project structure`,
@@ -134,26 +167,4 @@ const DJANGO_AGENT_CONFIG = {
134
167
  ],
135
168
  },
136
169
  };
137
- /**
138
- * Django wizard powered by the universal agent runner.
139
- */
140
- async function runDjangoWizardAgent(options) {
141
- if (options.debug) {
142
- (0, debug_1.enableDebugLogs)();
143
- }
144
- // Check Django version - agent wizard requires >= 3.0.0
145
- const djangoVersion = await (0, utils_1.getDjangoVersion)(options);
146
- if (djangoVersion) {
147
- const coercedVersion = semver.coerce(djangoVersion);
148
- if (coercedVersion && semver.lt(coercedVersion, MINIMUM_DJANGO_VERSION)) {
149
- const docsUrl = DJANGO_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ??
150
- DJANGO_AGENT_CONFIG.metadata.docsUrl;
151
- clack_1.default.log.warn(`Sorry: the wizard can't help you with Django ${djangoVersion}. Upgrade to Django ${MINIMUM_DJANGO_VERSION} or later, or check out the manual setup guide.`);
152
- clack_1.default.log.info(`Setup Django manually: ${chalk_1.default.cyan(docsUrl)}`);
153
- clack_1.default.outro('PostHog wizard will see you next time!');
154
- return;
155
- }
156
- }
157
- await (0, agent_runner_1.runAgentWizard)(DJANGO_AGENT_CONFIG, options);
158
- }
159
170
  //# sourceMappingURL=django-wizard-agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"django-wizard-agent.js","sourceRoot":"","sources":["../../../src/django/django-wizard-agent.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6HA,oDA2BC;AArJD,0CAAiD;AACjD,sDAAqD;AACrD,gDAA+C;AAC/C,2DAAmC;AACnC,kDAA0B;AAC1B,+CAAiC;AACjC,mCAOiB;AAEjB;;GAEG;AACH,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAEvC,MAAM,mBAAmB,GAAoB;IAC3C,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uBAAW,CAAC,MAAM;QAC/B,OAAO,EAAE,2CAA2C;QACpD,yBAAyB,EAAE,2CAA2C;QACtE,aAAa,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YAC9C,MAAM,WAAW,GAAG,MAAM,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;YACxD,MAAM,YAAY,GAAG,MAAM,IAAA,8BAAsB,EAAC,OAAO,CAAC,CAAC;YAC3D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;QACvC,CAAC;KACF;IAED,SAAS,EAAE;QACT,WAAW,EAAE,QAAQ;QACrB,kBAAkB,EAAE,QAAQ;QAC5B,eAAe,EAAE,KAAK;QACtB,UAAU,EAAE,CAAC,YAAiB,EAAE,EAAE;YAChC,yEAAyE;YACzE,oEAAoE;YACpE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,gBAAgB,EAAE,8BAAsB;KACzC;IAED,WAAW,EAAE;QACX,eAAe,EAAE,KAAK;QACtB,UAAU,EAAE,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;YAC7C,eAAe,EAAE,MAAM;YACvB,YAAY,EAAE,IAAI;SACnB,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,CAAC,OAAY,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAgC,CAAC;YAC7D,OAAO;gBACL,WAAW,EAAE,WAAW,IAAI,SAAS;aACtC,CAAC;QACJ,CAAC;KACF;IAED,OAAO,EAAE;QACP,oBAAoB,EAClB,yHAAyH;QAC3H,mBAAmB,EACjB,yLAAyL;QAC3L,yBAAyB,EAAE,CAAC,OAAY,EAAE,EAAE;YAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAgC,CAAC;YAC7D,MAAM,eAAe,GAAG,WAAW;gBACjC,CAAC,CAAC,IAAA,gCAAwB,EAAC,WAAW,CAAC;gBACvC,CAAC,CAAC,SAAS,CAAC;YAEd,yDAAyD;YACzD,MAAM,cAAc,GAAsC;gBACxD,CAAC,yBAAiB,CAAC,QAAQ,CAAC,EAAE,QAAQ;gBACtC,CAAC,yBAAiB,CAAC,GAAG,CAAC,EAAE,QAAQ;gBACjC,CAAC,yBAAiB,CAAC,OAAO,CAAC,EAAE,QAAQ;gBACrC,CAAC,yBAAiB,CAAC,QAAQ,CAAC,EAAE,QAAQ;aACvC,CAAC;YAEF,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAEzE,MAAM,KAAK,GAAG;gBACZ,iBAAiB,eAAe,EAAE;gBAClC,sBAAsB,WAAW,mCAAmC,WAAW,qBAAqB;aACrG,CAAC;YAEF,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KACF;IAED,EAAE,EAAE;QACF,cAAc,EAAE,8BAA8B;QAC9C,wBAAwB,EAAE,CAAC;QAC3B,eAAe,EAAE,CAAC,OAAY,EAAE,EAAE;YAChC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAgC,CAAC;YAC7D,MAAM,eAAe,GAAG,WAAW;gBACjC,CAAC,CAAC,IAAA,gCAAwB,EAAC,WAAW,CAAC;gBACvC,CAAC,CAAC,QAAQ,CAAC;YACb,OAAO;gBACL,iBAAiB,eAAe,oBAAoB;gBACpD,sCAAsC;gBACtC,4CAA4C;gBAC5C,uDAAuD;aACxD,CAAC;QACJ,CAAC;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACvB,+DAA+D;YAC/D,qDAAqD;YACrD,4EAA4E;SAC7E;KACF;CACF,CAAC;AAEF;;GAEG;AACI,KAAK,UAAU,oBAAoB,CACxC,OAAsB;IAEtB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAA,uBAAe,GAAE,CAAC;IACpB,CAAC;IAED,wDAAwD;IACxD,MAAM,aAAa,GAAG,MAAM,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAC;IAEtD,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,cAAc,IAAI,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,sBAAsB,CAAC,EAAE,CAAC;YACxE,MAAM,OAAO,GACX,mBAAmB,CAAC,QAAQ,CAAC,yBAAyB;gBACtD,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC;YAEvC,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,gDAAgD,aAAa,uBAAuB,sBAAsB,iDAAiD,CAC5J,CAAC;YACF,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChE,eAAK,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,IAAA,6BAAc,EAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC","sourcesContent":["/* Django wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../utils/types';\nimport type { FrameworkConfig } from '../lib/framework-config';\nimport { enableDebugLogs } from '../utils/debug';\nimport { runAgentWizard } from '../lib/agent-runner';\nimport { Integration } from '../lib/constants';\nimport clack from '../utils/clack';\nimport chalk from 'chalk';\nimport * as semver from 'semver';\nimport {\n getDjangoVersion,\n getDjangoProjectType,\n getDjangoProjectTypeName,\n getDjangoVersionBucket,\n DjangoProjectType,\n findDjangoSettingsFile,\n} from './utils';\n\n/**\n * Django framework configuration for the universal agent runner\n */\nconst MINIMUM_DJANGO_VERSION = '3.0.0';\n\nconst DJANGO_AGENT_CONFIG: FrameworkConfig = {\n metadata: {\n name: 'Django',\n integration: Integration.django,\n docsUrl: 'https://posthog.com/docs/libraries/django',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/python',\n gatherContext: async (options: WizardOptions) => {\n const projectType = await getDjangoProjectType(options);\n const settingsFile = await findDjangoSettingsFile(options);\n return { projectType, settingsFile };\n },\n },\n\n detection: {\n packageName: 'django',\n packageDisplayName: 'Django',\n usesPackageJson: false,\n getVersion: (_packageJson: any) => {\n // For Django, we don't use package.json. Version is extracted separately\n // from requirements.txt or pyproject.toml in the wizard entry point\n return undefined;\n },\n getVersionBucket: getDjangoVersionBucket,\n },\n\n environment: {\n uploadToHosting: false,\n getEnvVars: (apiKey: string, host: string) => ({\n POSTHOG_API_KEY: apiKey,\n POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context: any) => {\n const projectType = context.projectType as DjangoProjectType;\n return {\n projectType: projectType || 'unknown',\n };\n },\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a Python/Django project. Look for requirements.txt, pyproject.toml, setup.py, Pipfile, or manage.py to confirm.',\n packageInstallation:\n '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.',\n getAdditionalContextLines: (context: any) => {\n const projectType = context.projectType as DjangoProjectType;\n const projectTypeName = projectType\n ? getDjangoProjectTypeName(projectType)\n : 'unknown';\n\n // Map project type to framework ID for MCP docs resource\n const frameworkIdMap: Record<DjangoProjectType, string> = {\n [DjangoProjectType.STANDARD]: 'django',\n [DjangoProjectType.DRF]: 'django',\n [DjangoProjectType.WAGTAIL]: 'django',\n [DjangoProjectType.CHANNELS]: 'django',\n };\n\n const frameworkId = projectType ? frameworkIdMap[projectType] : 'django';\n\n const lines = [\n `Project type: ${projectTypeName}`,\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n\n if (context.settingsFile) {\n lines.push(`Settings file: ${context.settingsFile}`);\n }\n\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 5,\n getOutroChanges: (context: any) => {\n const projectType = context.projectType as DjangoProjectType;\n const projectTypeName = projectType\n ? getDjangoProjectTypeName(projectType)\n : 'Django';\n return [\n `Analyzed your ${projectTypeName} project structure`,\n `Installed the PostHog Python package`,\n `Configured PostHog in your Django settings`,\n `Added PostHog middleware for automatic event tracking`,\n ];\n },\n getOutroNextSteps: () => [\n 'Start your Django development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n 'Use identify_context() within new_context() to associate events with users',\n ],\n },\n};\n\n/**\n * Django wizard powered by the universal agent runner.\n */\nexport async function runDjangoWizardAgent(\n options: WizardOptions,\n): Promise<void> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n // Check Django version - agent wizard requires >= 3.0.0\n const djangoVersion = await getDjangoVersion(options);\n\n if (djangoVersion) {\n const coercedVersion = semver.coerce(djangoVersion);\n if (coercedVersion && semver.lt(coercedVersion, MINIMUM_DJANGO_VERSION)) {\n const docsUrl =\n DJANGO_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ??\n DJANGO_AGENT_CONFIG.metadata.docsUrl;\n\n clack.log.warn(\n `Sorry: the wizard can't help you with Django ${djangoVersion}. Upgrade to Django ${MINIMUM_DJANGO_VERSION} or later, or check out the manual setup guide.`,\n );\n clack.log.info(`Setup Django manually: ${chalk.cyan(docsUrl)}`);\n clack.outro('PostHog wizard will see you next time!');\n return;\n }\n }\n\n await runAgentWizard(DJANGO_AGENT_CONFIG, options);\n}\n"]}
1
+ {"version":3,"file":"django-wizard-agent.js","sourceRoot":"","sources":["../../../src/django/django-wizard-agent.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,gDAA+C;AAC/C,0DAA2B;AAC3B,4CAA8B;AAC9B,gDAAkC;AAClC,mCAOiB;AAOJ,QAAA,mBAAmB,GAAmC;IACjE,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uBAAW,CAAC,MAAM;QAC/B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,2CAA2C;QACpD,yBAAyB,EAAE,2CAA2C;QACtE,aAAa,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YAC9C,MAAM,WAAW,GAAG,MAAM,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;YACxD,MAAM,YAAY,GAAG,MAAM,IAAA,8BAAsB,EAAC,OAAO,CAAC,CAAC;YAC3D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;QACvC,CAAC;KACF;IAED,SAAS,EAAE;QACT,WAAW,EAAE,QAAQ;QACrB,kBAAkB,EAAE,QAAQ;QAC5B,eAAe,EAAE,KAAK;QACtB,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS;QAC3B,gBAAgB,EAAE,8BAAsB;QACxC,cAAc,EAAE,OAAO;QACvB,mBAAmB,EAAE,CAAC,OAAsB,EAAE,EAAE,CAAC,IAAA,wBAAgB,EAAC,OAAO,CAAC;QAC1E,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;YAE/B,MAAM,eAAe,GAAG,MAAM,IAAA,mBAAE,EAAC,cAAc,EAAE;gBAC/C,GAAG,EAAE,UAAU;gBACf,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,CAAC;aACjE,CAAC,CAAC;YAEH,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAC5B,OAAO,CACR,CAAC;wBACF,4CAA4C;wBAC5C,IACE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;4BAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;4BACjC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC;4BAC1C,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,EACzC,CAAC;4BACD,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,SAAS;oBACX,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,iBAAiB,GAAG,MAAM,IAAA,mBAAE,EAChC,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,aAAa,CAAC,EAC5D;gBACE,GAAG,EAAE,UAAU;gBACf,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,CAAC;aACjE,CACF,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;gBACxC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAC9B,OAAO,CACR,CAAC;oBACF,uEAAuE;oBACvE,uEAAuE;oBACvE,IACE,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC;wBACtC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAC/B,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KACF;IAED,WAAW,EAAE;QACX,eAAe,EAAE,KAAK;QACtB,UAAU,EAAE,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;YAC7C,eAAe,EAAE,MAAM;YACvB,YAAY,EAAE,IAAI;SACnB,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,SAAS;SAC9C,CAAC;KACH;IAED,OAAO,EAAE;QACP,oBAAoB,EAClB,yHAAyH;QAC3H,mBAAmB,EACjB,yLAAyL;QAC3L,yBAAyB,EAAE,CAAC,OAAO,EAAE,EAAE;YACrC,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW;gBACzC,CAAC,CAAC,IAAA,gCAAwB,EAAC,OAAO,CAAC,WAAW,CAAC;gBAC/C,CAAC,CAAC,SAAS,CAAC;YAEd,yDAAyD;YACzD,MAAM,cAAc,GAAsC;gBACxD,CAAC,yBAAiB,CAAC,QAAQ,CAAC,EAAE,QAAQ;gBACtC,CAAC,yBAAiB,CAAC,GAAG,CAAC,EAAE,QAAQ;gBACjC,CAAC,yBAAiB,CAAC,OAAO,CAAC,EAAE,QAAQ;gBACrC,CAAC,yBAAiB,CAAC,QAAQ,CAAC,EAAE,QAAQ;aACvC,CAAC;YAEF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW;gBACrC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC;gBACrC,CAAC,CAAC,QAAQ,CAAC;YAEb,MAAM,KAAK,GAAG;gBACZ,iBAAiB,eAAe,EAAE;gBAClC,sBAAsB,WAAW,mCAAmC,WAAW,qBAAqB;aACrG,CAAC;YAEF,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KACF;IAED,EAAE,EAAE;QACF,cAAc,EAAE,8BAA8B;QAC9C,wBAAwB,EAAE,CAAC;QAC3B,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE;YAC3B,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW;gBACzC,CAAC,CAAC,IAAA,gCAAwB,EAAC,OAAO,CAAC,WAAW,CAAC;gBAC/C,CAAC,CAAC,QAAQ,CAAC;YACb,OAAO;gBACL,iBAAiB,eAAe,oBAAoB;gBACpD,sCAAsC;gBACtC,4CAA4C;gBAC5C,uDAAuD;aACxD,CAAC;QACJ,CAAC;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACvB,+DAA+D;YAC/D,qDAAqD;YACrD,4EAA4E;SAC7E;KACF;CACF,CAAC","sourcesContent":["/* Django 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 fg from 'fast-glob';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport {\n getDjangoVersion,\n getDjangoProjectType,\n getDjangoProjectTypeName,\n getDjangoVersionBucket,\n DjangoProjectType,\n findDjangoSettingsFile,\n} from './utils';\n\ntype DjangoContext = {\n projectType?: DjangoProjectType;\n settingsFile?: string;\n};\n\nexport const DJANGO_AGENT_CONFIG: FrameworkConfig<DjangoContext> = {\n metadata: {\n name: 'Django',\n integration: Integration.django,\n beta: true,\n docsUrl: 'https://posthog.com/docs/libraries/django',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/python',\n gatherContext: async (options: WizardOptions) => {\n const projectType = await getDjangoProjectType(options);\n const settingsFile = await findDjangoSettingsFile(options);\n return { projectType, settingsFile };\n },\n },\n\n detection: {\n packageName: 'django',\n packageDisplayName: 'Django',\n usesPackageJson: false,\n getVersion: () => undefined,\n getVersionBucket: getDjangoVersionBucket,\n minimumVersion: '3.0.0',\n getInstalledVersion: (options: WizardOptions) => getDjangoVersion(options),\n detect: async (options) => {\n const { installDir } = options;\n\n const managePyMatches = await fg('**/manage.py', {\n cwd: installDir,\n ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],\n });\n\n if (managePyMatches.length > 0) {\n for (const match of managePyMatches) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, match),\n 'utf-8',\n );\n // Check for actual Django imports and usage\n if (\n content.includes('from django') ||\n content.includes('import django') ||\n content.includes('DJANGO_SETTINGS_MODULE') ||\n /execute_from_command_line/.test(content)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n }\n\n const requirementsFiles = await fg(\n ['**/requirements*.txt', '**/pyproject.toml', '**/setup.py'],\n {\n cwd: installDir,\n ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],\n },\n );\n\n for (const reqFile of requirementsFiles) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, reqFile),\n 'utf-8',\n );\n // Match Django as a package requirement, not in comments or other text\n // Look for: django, django>=, django==, django~=, Django (capitalized)\n if (\n /^django([>=~!<\\s]|$)/im.test(content) ||\n /[\"']django[\"']/i.test(content)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n },\n },\n\n environment: {\n uploadToHosting: false,\n getEnvVars: (apiKey: string, host: string) => ({\n POSTHOG_API_KEY: apiKey,\n POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n projectType: context.projectType || 'unknown',\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a Python/Django project. Look for requirements.txt, pyproject.toml, setup.py, Pipfile, or manage.py to confirm.',\n packageInstallation:\n '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.',\n getAdditionalContextLines: (context) => {\n const projectTypeName = context.projectType\n ? getDjangoProjectTypeName(context.projectType)\n : 'unknown';\n\n // Map project type to framework ID for MCP docs resource\n const frameworkIdMap: Record<DjangoProjectType, string> = {\n [DjangoProjectType.STANDARD]: 'django',\n [DjangoProjectType.DRF]: 'django',\n [DjangoProjectType.WAGTAIL]: 'django',\n [DjangoProjectType.CHANNELS]: 'django',\n };\n\n const frameworkId = context.projectType\n ? frameworkIdMap[context.projectType]\n : 'django';\n\n const lines = [\n `Project type: ${projectTypeName}`,\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n\n if (context.settingsFile) {\n lines.push(`Settings file: ${context.settingsFile}`);\n }\n\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 5,\n getOutroChanges: (context) => {\n const projectTypeName = context.projectType\n ? getDjangoProjectTypeName(context.projectType)\n : 'Django';\n return [\n `Analyzed your ${projectTypeName} project structure`,\n `Installed the PostHog Python package`,\n `Configured PostHog in your Django settings`,\n `Added PostHog middleware for automatic event tracking`,\n ];\n },\n getOutroNextSteps: () => [\n 'Start your Django development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n 'Use identify_context() within new_context() to associate events with users',\n ],\n },\n};\n"]}
@@ -8,7 +8,7 @@ export declare enum DjangoProjectType {
8
8
  /**
9
9
  * Get Django version bucket for analytics
10
10
  */
11
- export declare function getDjangoVersionBucket(version: string | undefined): string;
11
+ export declare const getDjangoVersionBucket: (version: string | undefined) => string;
12
12
  /**
13
13
  * Extract Django version from requirements files or pyproject.toml
14
14
  */
@@ -36,16 +36,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.DjangoProjectType = void 0;
40
- exports.getDjangoVersionBucket = getDjangoVersionBucket;
39
+ exports.getDjangoVersionBucket = exports.DjangoProjectType = void 0;
41
40
  exports.getDjangoVersion = getDjangoVersion;
42
41
  exports.getDjangoProjectType = getDjangoProjectType;
43
42
  exports.getDjangoProjectTypeName = getDjangoProjectTypeName;
44
43
  exports.findDjangoSettingsFile = findDjangoSettingsFile;
45
44
  exports.findDjangoUrlsFile = findDjangoUrlsFile;
46
- const semver_1 = require("semver");
47
45
  const fast_glob_1 = __importDefault(require("fast-glob"));
48
46
  const clack_1 = __importDefault(require("../utils/clack"));
47
+ const semver_1 = require("../utils/semver");
49
48
  const fs = __importStar(require("node:fs"));
50
49
  const path = __importStar(require("node:path"));
51
50
  var DjangoProjectType;
@@ -69,25 +68,7 @@ const IGNORE_PATTERNS = [
69
68
  /**
70
69
  * Get Django version bucket for analytics
71
70
  */
72
- function getDjangoVersionBucket(version) {
73
- if (!version) {
74
- return 'none';
75
- }
76
- try {
77
- const minVer = (0, semver_1.minVersion)(version);
78
- if (!minVer) {
79
- return 'invalid';
80
- }
81
- const majorVersion = (0, semver_1.major)(minVer);
82
- if (majorVersion >= 3) {
83
- return `${majorVersion}.x`;
84
- }
85
- return `<3.0.0`;
86
- }
87
- catch {
88
- return 'unknown';
89
- }
90
- }
71
+ exports.getDjangoVersionBucket = (0, semver_1.createVersionBucket)();
91
72
  /**
92
73
  * Extract Django version from requirements files or pyproject.toml
93
74
  */