@posthog/wizard 1.31.2 → 1.32.1

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 +42 -4
  52. package/dist/src/lib/agent-interface.js.map +1 -1
  53. package/dist/src/lib/agent-runner.js +65 -3
  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 +2 -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,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TANSTACK_ROUTER_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.TANSTACK_ROUTER_AGENT_CONFIG = {
9
+ metadata: {
10
+ name: 'React (TanStack Router)',
11
+ integration: constants_1.Integration.tanstackRouter,
12
+ docsUrl: 'https://posthog.com/docs/libraries/react',
13
+ gatherContext: async (options) => {
14
+ const routerMode = await (0, utils_1.getTanStackRouterMode)(options);
15
+ return { routerMode };
16
+ },
17
+ },
18
+ detection: {
19
+ packageName: '@tanstack/react-router',
20
+ packageDisplayName: 'TanStack Router',
21
+ getVersion: (packageJson) => (0, package_json_1.getPackageVersion)('@tanstack/react-router', packageJson),
22
+ getVersionBucket: utils_1.getTanStackRouterVersionBucket,
23
+ minimumVersion: '1.0.0',
24
+ getInstalledVersion: async (options) => {
25
+ const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
26
+ return (0, package_json_1.getPackageVersion)('@tanstack/react-router', packageJson);
27
+ },
28
+ detect: async (options) => {
29
+ const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
30
+ if (!packageJson) {
31
+ return false;
32
+ }
33
+ // Exclude TanStack Start projects (they have their own integration)
34
+ if ((0, package_json_1.hasPackageInstalled)('@tanstack/react-start', packageJson)) {
35
+ return false;
36
+ }
37
+ return (0, package_json_1.hasPackageInstalled)('@tanstack/react-router', packageJson);
38
+ },
39
+ },
40
+ environment: {
41
+ uploadToHosting: false,
42
+ getEnvVars: (apiKey, host) => ({
43
+ VITE_PUBLIC_POSTHOG_KEY: apiKey,
44
+ VITE_PUBLIC_POSTHOG_HOST: host,
45
+ }),
46
+ },
47
+ analytics: {
48
+ getTags: (context) => ({
49
+ routerMode: context.routerMode || 'unknown',
50
+ }),
51
+ },
52
+ prompts: {
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.',
54
+ packageInstallation: 'Look for lockfiles to determine the package manager (npm, yarn, pnpm, bun). Do not manually edit package.json.',
55
+ getAdditionalContextLines: (context) => {
56
+ const routerMode = context.routerMode;
57
+ const modeName = routerMode
58
+ ? (0, utils_1.getTanStackRouterModeName)(routerMode)
59
+ : 'unknown';
60
+ // Map router mode to framework ID for MCP docs resource
61
+ const frameworkIdMap = {
62
+ [utils_1.TanStackRouterMode.FILE_BASED]: 'react-tanstack-router-file-based',
63
+ [utils_1.TanStackRouterMode.CODE_BASED]: 'react-tanstack-router-code-based',
64
+ };
65
+ const frameworkId = routerMode
66
+ ? frameworkIdMap[routerMode]
67
+ : 'react-tanstack-router-file-based';
68
+ return [
69
+ `Router mode: ${modeName}`,
70
+ `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,
71
+ ];
72
+ },
73
+ },
74
+ ui: {
75
+ successMessage: 'PostHog integration complete',
76
+ estimatedDurationMinutes: 8,
77
+ getOutroChanges: (context) => {
78
+ const modeName = context.routerMode
79
+ ? (0, utils_1.getTanStackRouterModeName)(context.routerMode)
80
+ : 'TanStack Router';
81
+ return [
82
+ `Analyzed your React (TanStack Router) project structure (${modeName})`,
83
+ `Created and configured PostHog initializers`,
84
+ `Integrated PostHog into your application`,
85
+ ];
86
+ },
87
+ getOutroNextSteps: () => [
88
+ 'Start your development server to see PostHog in action',
89
+ 'Visit your PostHog dashboard to see incoming events',
90
+ ],
91
+ },
92
+ };
93
+ //# sourceMappingURL=tanstack-router-wizard-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tanstack-router-wizard-agent.js","sourceRoot":"","sources":["../../../src/tanstack-router/tanstack-router-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* TanStack Router 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 getTanStackRouterMode,\n getTanStackRouterModeName,\n getTanStackRouterVersionBucket,\n TanStackRouterMode,\n} from './utils';\n\ntype TanStackRouterContext = {\n routerMode?: TanStackRouterMode;\n};\n\nexport const TANSTACK_ROUTER_AGENT_CONFIG: FrameworkConfig<TanStackRouterContext> =\n {\n metadata: {\n name: 'React (TanStack Router)',\n integration: Integration.tanstackRouter,\n docsUrl: 'https://posthog.com/docs/libraries/react',\n gatherContext: async (options: WizardOptions) => {\n const routerMode = await getTanStackRouterMode(options);\n return { routerMode };\n },\n },\n\n detection: {\n packageName: '@tanstack/react-router',\n packageDisplayName: 'TanStack Router',\n getVersion: (packageJson: unknown) =>\n getPackageVersion(\n '@tanstack/react-router',\n packageJson as PackageDotJson,\n ),\n getVersionBucket: getTanStackRouterVersionBucket,\n minimumVersion: '1.0.0',\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await getPackageDotJson(options);\n return getPackageVersion('@tanstack/react-router', packageJson);\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n if (!packageJson) {\n return false;\n }\n // Exclude TanStack Start projects (they have their own integration)\n if (hasPackageInstalled('@tanstack/react-start', packageJson)) {\n return false;\n }\n return hasPackageInstalled('@tanstack/react-router', packageJson);\n },\n },\n\n environment: {\n uploadToHosting: false,\n getEnvVars: (apiKey: string, host: string) => ({\n VITE_PUBLIC_POSTHOG_KEY: apiKey,\n VITE_PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n routerMode: context.routerMode || 'unknown',\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 routerMode = context.routerMode;\n const modeName = routerMode\n ? getTanStackRouterModeName(routerMode)\n : 'unknown';\n\n // Map router mode to framework ID for MCP docs resource\n const frameworkIdMap: Record<TanStackRouterMode, string> = {\n [TanStackRouterMode.FILE_BASED]: 'react-tanstack-router-file-based',\n [TanStackRouterMode.CODE_BASED]: 'react-tanstack-router-code-based',\n };\n\n const frameworkId = routerMode\n ? frameworkIdMap[routerMode]\n : 'react-tanstack-router-file-based';\n\n return [\n `Router mode: ${modeName}`,\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 8,\n getOutroChanges: (context) => {\n const modeName = context.routerMode\n ? getTanStackRouterModeName(context.routerMode)\n : 'TanStack Router';\n return [\n `Analyzed your React (TanStack Router) project structure (${modeName})`,\n `Created and configured PostHog initializers`,\n `Integrated PostHog into your application`,\n ];\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"]}
@@ -0,0 +1,17 @@
1
+ import type { WizardOptions } from '../utils/types';
2
+ export declare enum TanStackRouterMode {
3
+ FILE_BASED = "file-based",// Uses @tanstack/router-plugin with file-based route generation
4
+ CODE_BASED = "code-based"
5
+ }
6
+ /**
7
+ * Get TanStack Router version bucket for analytics
8
+ */
9
+ export declare const getTanStackRouterVersionBucket: (version: string | undefined) => string;
10
+ /**
11
+ * Detect TanStack Router mode (file-based vs code-based routing)
12
+ */
13
+ export declare function getTanStackRouterMode(options: WizardOptions): Promise<TanStackRouterMode>;
14
+ /**
15
+ * Get human-readable name for TanStack Router mode
16
+ */
17
+ export declare function getTanStackRouterModeName(mode: TanStackRouterMode): string;
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.getTanStackRouterVersionBucket = exports.TanStackRouterMode = void 0;
40
+ exports.getTanStackRouterMode = getTanStackRouterMode;
41
+ exports.getTanStackRouterModeName = getTanStackRouterModeName;
42
+ const fast_glob_1 = __importDefault(require("fast-glob"));
43
+ const clack_utils_1 = require("../utils/clack-utils");
44
+ const clack_1 = __importDefault(require("../utils/clack"));
45
+ const constants_1 = require("../lib/constants");
46
+ const package_json_1 = require("../utils/package-json");
47
+ const semver_1 = require("../utils/semver");
48
+ const fs = __importStar(require("node:fs"));
49
+ const path = __importStar(require("node:path"));
50
+ var TanStackRouterMode;
51
+ (function (TanStackRouterMode) {
52
+ TanStackRouterMode["FILE_BASED"] = "file-based";
53
+ TanStackRouterMode["CODE_BASED"] = "code-based";
54
+ })(TanStackRouterMode || (exports.TanStackRouterMode = TanStackRouterMode = {}));
55
+ const IGNORE_PATTERNS = [
56
+ '**/node_modules/**',
57
+ '**/dist/**',
58
+ '**/build/**',
59
+ '**/public/**',
60
+ '**/.vinxi/**',
61
+ '**/.output/**',
62
+ ];
63
+ /**
64
+ * Get TanStack Router version bucket for analytics
65
+ */
66
+ exports.getTanStackRouterVersionBucket = (0, semver_1.createVersionBucket)();
67
+ /**
68
+ * Check if the project uses file-based routing.
69
+ *
70
+ * Detection signals (in order of reliability):
71
+ * 1. Generated route tree file exists (routeTree.gen.ts) - definitive
72
+ * 2. Router plugin in package.json (@tanstack/router-plugin or @tanstack/router-vite-plugin)
73
+ * 3. createFileRoute usage in source files
74
+ */
75
+ async function hasFileBasedRouting({ installDir, }) {
76
+ // 1. Check for generated route tree file (most definitive signal)
77
+ const generatedFiles = await (0, fast_glob_1.default)('**/routeTree.gen.@(ts|tsx|js|jsx)', {
78
+ dot: true,
79
+ cwd: installDir,
80
+ ignore: IGNORE_PATTERNS,
81
+ });
82
+ if (generatedFiles.length > 0) {
83
+ return true;
84
+ }
85
+ // 2. Check package.json for the router plugin
86
+ try {
87
+ const packageJsonPath = path.join(installDir, 'package.json');
88
+ const content = fs.readFileSync(packageJsonPath, 'utf-8');
89
+ const packageJson = JSON.parse(content);
90
+ if ((0, package_json_1.hasPackageInstalled)('@tanstack/router-plugin', packageJson) ||
91
+ (0, package_json_1.hasPackageInstalled)('@tanstack/router-vite-plugin', packageJson)) {
92
+ return true;
93
+ }
94
+ }
95
+ catch {
96
+ // package.json not found or unreadable
97
+ }
98
+ // 3. Check for createFileRoute usage in source files
99
+ const sourceFiles = await (0, fast_glob_1.default)('**/*.@(ts|tsx|js|jsx)', {
100
+ dot: true,
101
+ cwd: installDir,
102
+ ignore: IGNORE_PATTERNS,
103
+ });
104
+ for (const file of sourceFiles) {
105
+ try {
106
+ const filePath = path.join(installDir, file);
107
+ const content = fs.readFileSync(filePath, 'utf-8');
108
+ if (content.includes('createFileRoute')) {
109
+ return true;
110
+ }
111
+ }
112
+ catch {
113
+ continue;
114
+ }
115
+ }
116
+ return false;
117
+ }
118
+ /**
119
+ * Check if the project uses code-based routing.
120
+ *
121
+ * Code-based routing uses createRoute() to manually define routes,
122
+ * as opposed to file-based routing which uses createFileRoute().
123
+ */
124
+ async function hasCodeBasedRouting({ installDir, }) {
125
+ const sourceFiles = await (0, fast_glob_1.default)('**/*.@(ts|tsx|js|jsx)', {
126
+ dot: true,
127
+ cwd: installDir,
128
+ ignore: IGNORE_PATTERNS,
129
+ });
130
+ let hasCreateRoute = false;
131
+ let hasCreateFileRoute = false;
132
+ for (const file of sourceFiles) {
133
+ try {
134
+ const filePath = path.join(installDir, file);
135
+ const content = fs.readFileSync(filePath, 'utf-8');
136
+ if (content.includes('createRoute(')) {
137
+ hasCreateRoute = true;
138
+ }
139
+ if (content.includes('createFileRoute')) {
140
+ hasCreateFileRoute = true;
141
+ }
142
+ }
143
+ catch {
144
+ continue;
145
+ }
146
+ }
147
+ // Code-based if createRoute is used without createFileRoute
148
+ return hasCreateRoute && !hasCreateFileRoute;
149
+ }
150
+ /**
151
+ * Detect TanStack Router mode (file-based vs code-based routing)
152
+ */
153
+ async function getTanStackRouterMode(options) {
154
+ const { installDir } = options;
155
+ const isFileBased = await hasFileBasedRouting({ installDir });
156
+ if (isFileBased) {
157
+ clack_1.default.log.info('Detected TanStack Router file-based routing');
158
+ return TanStackRouterMode.FILE_BASED;
159
+ }
160
+ const isCodeBased = await hasCodeBasedRouting({ installDir });
161
+ if (isCodeBased) {
162
+ clack_1.default.log.info('Detected TanStack Router code-based routing');
163
+ return TanStackRouterMode.CODE_BASED;
164
+ }
165
+ // If we can't detect, ask the user
166
+ const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
167
+ message: 'What TanStack Router routing mode are you using?',
168
+ options: [
169
+ {
170
+ label: 'File-based routing',
171
+ value: TanStackRouterMode.FILE_BASED,
172
+ },
173
+ {
174
+ label: 'Code-based routing',
175
+ value: TanStackRouterMode.CODE_BASED,
176
+ },
177
+ ],
178
+ }), constants_1.Integration.tanstackRouter);
179
+ return result;
180
+ }
181
+ /**
182
+ * Get human-readable name for TanStack Router mode
183
+ */
184
+ function getTanStackRouterModeName(mode) {
185
+ switch (mode) {
186
+ case TanStackRouterMode.FILE_BASED:
187
+ return 'File-based routing';
188
+ case TanStackRouterMode.CODE_BASED:
189
+ return 'Code-based routing';
190
+ }
191
+ }
192
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/tanstack-router/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkIA,sDAmCC;AAKD,8DAOC;AAjLD,0DAA2B;AAC3B,sDAAwD;AACxD,2DAAmC;AAEnC,gDAA+C;AAC/C,wDAA4D;AAC5D,4CAAsD;AACtD,4CAA8B;AAC9B,gDAAkC;AAElC,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,+CAAyB,CAAA;IACzB,+CAAyB,CAAA;AAC3B,CAAC,EAHW,kBAAkB,kCAAlB,kBAAkB,QAG7B;AAED,MAAM,eAAe,GAAG;IACtB,oBAAoB;IACpB,YAAY;IACZ,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;CAChB,CAAC;AAEF;;GAEG;AACU,QAAA,8BAA8B,GAAG,IAAA,4BAAmB,GAAE,CAAC;AAEpE;;;;;;;GAOG;AACH,KAAK,UAAU,mBAAmB,CAAC,EACjC,UAAU,GACwB;IAClC,kEAAkE;IAClE,MAAM,cAAc,GAAG,MAAM,IAAA,mBAAE,EAAC,mCAAmC,EAAE;QACnE,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,eAAe;KACxB,CAAC,CAAC;IAEH,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAEnE,IACE,IAAA,kCAAmB,EAAC,yBAAyB,EAAE,WAAW,CAAC;YAC3D,IAAA,kCAAmB,EAAC,8BAA8B,EAAE,WAAW,CAAC,EAChE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;IAED,qDAAqD;IACrD,MAAM,WAAW,GAAG,MAAM,IAAA,mBAAE,EAAC,uBAAuB,EAAE;QACpD,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,eAAe;KACxB,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,mBAAmB,CAAC,EACjC,UAAU,GACwB;IAClC,MAAM,WAAW,GAAG,MAAM,IAAA,mBAAE,EAAC,uBAAuB,EAAE;QACpD,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,eAAe;KACxB,CAAC,CAAC;IAEH,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEnD,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrC,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACxC,kBAAkB,GAAG,IAAI,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,OAAO,cAAc,IAAI,CAAC,kBAAkB,CAAC;AAC/C,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,qBAAqB,CACzC,OAAsB;IAEtB,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9D,IAAI,WAAW,EAAE,CAAC;QAChB,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC9D,OAAO,kBAAkB,CAAC,UAAU,CAAC;IACvC,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9D,IAAI,WAAW,EAAE,CAAC;QAChB,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC9D,OAAO,kBAAkB,CAAC,UAAU,CAAC;IACvC,CAAC;IAED,mCAAmC;IACnC,MAAM,MAAM,GAAuB,MAAM,IAAA,8BAAgB,EACvD,eAAK,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,kDAAkD;QAC3D,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,oBAAoB;gBAC3B,KAAK,EAAE,kBAAkB,CAAC,UAAU;aACrC;YACD;gBACE,KAAK,EAAE,oBAAoB;gBAC3B,KAAK,EAAE,kBAAkB,CAAC,UAAU;aACrC;SACF;KACF,CAAC,EACF,uBAAW,CAAC,cAAc,CAC3B,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CAAC,IAAwB;IAChE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,kBAAkB,CAAC,UAAU;YAChC,OAAO,oBAAoB,CAAC;QAC9B,KAAK,kBAAkB,CAAC,UAAU;YAChC,OAAO,oBAAoB,CAAC;IAChC,CAAC;AACH,CAAC","sourcesContent":["import fg from 'fast-glob';\nimport { abortIfCancelled } from '../utils/clack-utils';\nimport clack from '../utils/clack';\nimport type { WizardOptions } from '../utils/types';\nimport { Integration } from '../lib/constants';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport { createVersionBucket } from '../utils/semver';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport enum TanStackRouterMode {\n FILE_BASED = 'file-based', // Uses @tanstack/router-plugin with file-based route generation\n CODE_BASED = 'code-based', // Manually defines routes with createRoute/createRootRoute\n}\n\nconst IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/public/**',\n '**/.vinxi/**',\n '**/.output/**',\n];\n\n/**\n * Get TanStack Router version bucket for analytics\n */\nexport const getTanStackRouterVersionBucket = createVersionBucket();\n\n/**\n * Check if the project uses file-based routing.\n *\n * Detection signals (in order of reliability):\n * 1. Generated route tree file exists (routeTree.gen.ts) - definitive\n * 2. Router plugin in package.json (@tanstack/router-plugin or @tanstack/router-vite-plugin)\n * 3. createFileRoute usage in source files\n */\nasync function hasFileBasedRouting({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n // 1. Check for generated route tree file (most definitive signal)\n const generatedFiles = await fg('**/routeTree.gen.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n if (generatedFiles.length > 0) {\n return true;\n }\n\n // 2. Check package.json for the router plugin\n try {\n const packageJsonPath = path.join(installDir, 'package.json');\n const content = fs.readFileSync(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(content) as Record<string, unknown>;\n\n if (\n hasPackageInstalled('@tanstack/router-plugin', packageJson) ||\n hasPackageInstalled('@tanstack/router-vite-plugin', packageJson)\n ) {\n return true;\n }\n } catch {\n // package.json not found or unreadable\n }\n\n // 3. Check for createFileRoute usage in source files\n const sourceFiles = await fg('**/*.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const file of sourceFiles) {\n try {\n const filePath = path.join(installDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n if (content.includes('createFileRoute')) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Check if the project uses code-based routing.\n *\n * Code-based routing uses createRoute() to manually define routes,\n * as opposed to file-based routing which uses createFileRoute().\n */\nasync function hasCodeBasedRouting({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n const sourceFiles = await fg('**/*.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n let hasCreateRoute = false;\n let hasCreateFileRoute = false;\n\n for (const file of sourceFiles) {\n try {\n const filePath = path.join(installDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n if (content.includes('createRoute(')) {\n hasCreateRoute = true;\n }\n if (content.includes('createFileRoute')) {\n hasCreateFileRoute = true;\n }\n } catch {\n continue;\n }\n }\n\n // Code-based if createRoute is used without createFileRoute\n return hasCreateRoute && !hasCreateFileRoute;\n}\n\n/**\n * Detect TanStack Router mode (file-based vs code-based routing)\n */\nexport async function getTanStackRouterMode(\n options: WizardOptions,\n): Promise<TanStackRouterMode> {\n const { installDir } = options;\n\n const isFileBased = await hasFileBasedRouting({ installDir });\n if (isFileBased) {\n clack.log.info('Detected TanStack Router file-based routing');\n return TanStackRouterMode.FILE_BASED;\n }\n\n const isCodeBased = await hasCodeBasedRouting({ installDir });\n if (isCodeBased) {\n clack.log.info('Detected TanStack Router code-based routing');\n return TanStackRouterMode.CODE_BASED;\n }\n\n // If we can't detect, ask the user\n const result: TanStackRouterMode = await abortIfCancelled(\n clack.select({\n message: 'What TanStack Router routing mode are you using?',\n options: [\n {\n label: 'File-based routing',\n value: TanStackRouterMode.FILE_BASED,\n },\n {\n label: 'Code-based routing',\n value: TanStackRouterMode.CODE_BASED,\n },\n ],\n }),\n Integration.tanstackRouter,\n );\n return result;\n}\n\n/**\n * Get human-readable name for TanStack Router mode\n */\nexport function getTanStackRouterModeName(mode: TanStackRouterMode): string {\n switch (mode) {\n case TanStackRouterMode.FILE_BASED:\n return 'File-based routing';\n case TanStackRouterMode.CODE_BASED:\n return 'Code-based routing';\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { FrameworkConfig } from '../lib/framework-config';
2
+ type TanStackStartContext = Record<string, unknown>;
3
+ export declare const TANSTACK_START_AGENT_CONFIG: FrameworkConfig<TanStackStartContext>;
4
+ export {};
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TANSTACK_START_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.TANSTACK_START_AGENT_CONFIG = {
9
+ metadata: {
10
+ name: 'TanStack Start',
11
+ integration: constants_1.Integration.tanstackStart,
12
+ docsUrl: 'https://posthog.com/docs/libraries/react',
13
+ },
14
+ detection: {
15
+ packageName: '@tanstack/react-start',
16
+ packageDisplayName: 'TanStack Start',
17
+ getVersion: (packageJson) => (0, package_json_1.getPackageVersion)('@tanstack/react-start', packageJson),
18
+ getVersionBucket: utils_1.getTanStackStartVersionBucket,
19
+ minimumVersion: '1.0.0',
20
+ getInstalledVersion: async (options) => {
21
+ const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
22
+ return (0, package_json_1.getPackageVersion)('@tanstack/react-start', packageJson);
23
+ },
24
+ detect: async (options) => {
25
+ const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
26
+ return packageJson
27
+ ? (0, package_json_1.hasPackageInstalled)('@tanstack/react-start', packageJson)
28
+ : false;
29
+ },
30
+ },
31
+ environment: {
32
+ uploadToHosting: false,
33
+ getEnvVars: (apiKey, host) => ({
34
+ VITE_PUBLIC_POSTHOG_KEY: apiKey,
35
+ VITE_PUBLIC_POSTHOG_HOST: host,
36
+ }),
37
+ },
38
+ analytics: {
39
+ getTags: () => ({}),
40
+ },
41
+ prompts: {
42
+ 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.',
43
+ packageInstallation: 'Look for lockfiles to determine the package manager (npm, yarn, pnpm, bun). Do not manually edit package.json.',
44
+ getAdditionalContextLines: () => {
45
+ // TanStack Start always uses file-based routing (it's a full-stack framework built on TanStack Router)
46
+ const frameworkId = 'react-tanstack-start';
47
+ return [
48
+ `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,
49
+ ];
50
+ },
51
+ },
52
+ ui: {
53
+ successMessage: 'PostHog integration complete',
54
+ estimatedDurationMinutes: 8,
55
+ getOutroChanges: () => [
56
+ `Analyzed your TanStack Start project structure`,
57
+ `Created and configured PostHog initializers`,
58
+ `Integrated PostHog into your application`,
59
+ ],
60
+ getOutroNextSteps: () => [
61
+ 'Start your development server to see PostHog in action',
62
+ 'Visit your PostHog dashboard to see incoming events',
63
+ ],
64
+ },
65
+ };
66
+ //# sourceMappingURL=tanstack-start-wizard-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tanstack-start-wizard-agent.js","sourceRoot":"","sources":["../../../src/tanstack-start/tanstack-start-wizard-agent.ts"],"names":[],"mappings":";;;AAGA,gDAA+C;AAC/C,wDAI+B;AAC/B,sDAA4E;AAC5E,mCAAwD;AAI3C,QAAA,2BAA2B,GACtC;IACE,QAAQ,EAAE;QACR,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,uBAAW,CAAC,aAAa;QACtC,OAAO,EAAE,0CAA0C;KACpD;IAED,SAAS,EAAE;QACT,WAAW,EAAE,uBAAuB;QACpC,kBAAkB,EAAE,gBAAgB;QACpC,UAAU,EAAE,CAAC,WAAoB,EAAE,EAAE,CACnC,IAAA,gCAAiB,EACf,uBAAuB,EACvB,WAA6B,CAC9B;QACH,gBAAgB,EAAE,qCAA6B;QAC/C,cAAc,EAAE,OAAO;QACvB,mBAAmB,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YACpD,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,IAAA,gCAAiB,EAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,WAAW;gBAChB,CAAC,CAAC,IAAA,kCAAmB,EAAC,uBAAuB,EAAE,WAAW,CAAC;gBAC3D,CAAC,CAAC,KAAK,CAAC;QACZ,CAAC;KACF;IAED,WAAW,EAAE;QACX,eAAe,EAAE,KAAK;QACtB,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,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;KACpB;IAED,OAAO,EAAE;QACP,oBAAoB,EAClB,oJAAoJ;QACtJ,mBAAmB,EACjB,gHAAgH;QAClH,yBAAyB,EAAE,GAAG,EAAE;YAC9B,uGAAuG;YACvG,MAAM,WAAW,GAAG,sBAAsB,CAAC;YAE3C,OAAO;gBACL,sBAAsB,WAAW,mCAAmC,WAAW,qBAAqB;aACrG,CAAC;QACJ,CAAC;KACF;IAED,EAAE,EAAE;QACF,cAAc,EAAE,8BAA8B;QAC9C,wBAAwB,EAAE,CAAC;QAC3B,eAAe,EAAE,GAAG,EAAE,CAAC;YACrB,gDAAgD;YAChD,6CAA6C;YAC7C,0CAA0C;SAC3C;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACvB,wDAAwD;YACxD,qDAAqD;SACtD;KACF;CACF,CAAC","sourcesContent":["/* TanStack Start 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 { getTanStackStartVersionBucket } from './utils';\n\ntype TanStackStartContext = Record<string, unknown>;\n\nexport const TANSTACK_START_AGENT_CONFIG: FrameworkConfig<TanStackStartContext> =\n {\n metadata: {\n name: 'TanStack Start',\n integration: Integration.tanstackStart,\n docsUrl: 'https://posthog.com/docs/libraries/react',\n },\n\n detection: {\n packageName: '@tanstack/react-start',\n packageDisplayName: 'TanStack Start',\n getVersion: (packageJson: unknown) =>\n getPackageVersion(\n '@tanstack/react-start',\n packageJson as PackageDotJson,\n ),\n getVersionBucket: getTanStackStartVersionBucket,\n minimumVersion: '1.0.0',\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await getPackageDotJson(options);\n return getPackageVersion('@tanstack/react-start', packageJson);\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson\n ? hasPackageInstalled('@tanstack/react-start', packageJson)\n : false;\n },\n },\n\n environment: {\n uploadToHosting: false,\n getEnvVars: (apiKey: string, host: string) => ({\n VITE_PUBLIC_POSTHOG_KEY: apiKey,\n VITE_PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: () => ({}),\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: () => {\n // TanStack Start always uses file-based routing (it's a full-stack framework built on TanStack Router)\n const frameworkId = 'react-tanstack-start';\n\n return [\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 8,\n getOutroChanges: () => [\n `Analyzed your TanStack Start project structure`,\n `Created and configured PostHog initializers`,\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"]}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Get TanStack Start version bucket for analytics
3
+ */
4
+ export declare const getTanStackStartVersionBucket: (version: string | undefined) => string;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTanStackStartVersionBucket = void 0;
4
+ const semver_1 = require("../utils/semver");
5
+ /**
6
+ * Get TanStack Start version bucket for analytics
7
+ */
8
+ exports.getTanStackStartVersionBucket = (0, semver_1.createVersionBucket)();
9
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/tanstack-start/utils.ts"],"names":[],"mappings":";;;AAAA,4CAAsD;AAEtD;;GAEG;AACU,QAAA,6BAA6B,GAAG,IAAA,4BAAmB,GAAE,CAAC","sourcesContent":["import { createVersionBucket } from '../utils/semver';\n\n/**\n * Get TanStack Start version bucket for analytics\n */\nexport const getTanStackStartVersionBucket = createVersionBucket();\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const semver_1 = require("../semver");
4
+ describe('createVersionBucket', () => {
5
+ describe('without minimum threshold', () => {
6
+ const getVersionBucket = (0, semver_1.createVersionBucket)();
7
+ it('returns "none" for undefined version', () => {
8
+ expect(getVersionBucket(undefined)).toBe('none');
9
+ });
10
+ it('returns "none" for empty string', () => {
11
+ expect(getVersionBucket('')).toBe('none');
12
+ });
13
+ it('returns major version bucket for exact versions', () => {
14
+ expect(getVersionBucket('1.0.0')).toBe('1.x');
15
+ expect(getVersionBucket('2.5.3')).toBe('2.x');
16
+ expect(getVersionBucket('15.3.2')).toBe('15.x');
17
+ });
18
+ it('returns major version bucket for semver ranges', () => {
19
+ expect(getVersionBucket('^1.0.0')).toBe('1.x');
20
+ expect(getVersionBucket('~2.5.0')).toBe('2.x');
21
+ expect(getVersionBucket('>=15.0.0')).toBe('15.x');
22
+ });
23
+ it('returns "unknown" for invalid semver (caught by try/catch)', () => {
24
+ expect(getVersionBucket('not-a-version')).toBe('unknown');
25
+ expect(getVersionBucket('abc')).toBe('unknown');
26
+ });
27
+ it('handles version 0.x correctly', () => {
28
+ expect(getVersionBucket('0.1.0')).toBe('0.x');
29
+ expect(getVersionBucket('0.0.1')).toBe('0.x');
30
+ });
31
+ });
32
+ describe('with minimum threshold', () => {
33
+ describe('threshold of 11 (Next.js style)', () => {
34
+ const getVersionBucket = (0, semver_1.createVersionBucket)(11);
35
+ it('returns major version bucket for versions >= threshold', () => {
36
+ expect(getVersionBucket('11.0.0')).toBe('11.x');
37
+ expect(getVersionBucket('12.5.3')).toBe('12.x');
38
+ expect(getVersionBucket('15.3.2')).toBe('15.x');
39
+ });
40
+ it('returns "<threshold" bucket for versions below threshold', () => {
41
+ expect(getVersionBucket('10.0.0')).toBe('<11.0.0');
42
+ expect(getVersionBucket('9.5.0')).toBe('<11.0.0');
43
+ expect(getVersionBucket('1.0.0')).toBe('<11.0.0');
44
+ });
45
+ it('handles semver ranges correctly', () => {
46
+ expect(getVersionBucket('^15.0.0')).toBe('15.x');
47
+ expect(getVersionBucket('^10.0.0')).toBe('<11.0.0');
48
+ });
49
+ });
50
+ describe('threshold of 6 (React Router style)', () => {
51
+ const getVersionBucket = (0, semver_1.createVersionBucket)(6);
52
+ it('returns major version bucket for versions >= threshold', () => {
53
+ expect(getVersionBucket('6.0.0')).toBe('6.x');
54
+ expect(getVersionBucket('7.1.0')).toBe('7.x');
55
+ });
56
+ it('returns "<threshold" bucket for versions below threshold', () => {
57
+ expect(getVersionBucket('5.3.0')).toBe('<6.0.0');
58
+ expect(getVersionBucket('4.0.0')).toBe('<6.0.0');
59
+ });
60
+ });
61
+ describe('threshold of 3 (Django style)', () => {
62
+ const getVersionBucket = (0, semver_1.createVersionBucket)(3);
63
+ it('returns major version bucket for versions >= threshold', () => {
64
+ expect(getVersionBucket('3.0.0')).toBe('3.x');
65
+ expect(getVersionBucket('4.2.1')).toBe('4.x');
66
+ expect(getVersionBucket('5.0.0')).toBe('5.x');
67
+ });
68
+ it('returns "<threshold" bucket for versions below threshold', () => {
69
+ expect(getVersionBucket('2.2.0')).toBe('<3.0.0');
70
+ expect(getVersionBucket('1.11.0')).toBe('<3.0.0');
71
+ });
72
+ });
73
+ describe('threshold of 2 (Flask style)', () => {
74
+ const getVersionBucket = (0, semver_1.createVersionBucket)(2);
75
+ it('returns major version bucket for versions >= threshold', () => {
76
+ expect(getVersionBucket('2.0.0')).toBe('2.x');
77
+ expect(getVersionBucket('3.0.0')).toBe('3.x');
78
+ });
79
+ it('returns "<threshold" bucket for versions below threshold', () => {
80
+ expect(getVersionBucket('1.1.0')).toBe('<2.0.0');
81
+ expect(getVersionBucket('0.12.0')).toBe('<2.0.0');
82
+ });
83
+ });
84
+ describe('threshold of 9 (Laravel style)', () => {
85
+ const getVersionBucket = (0, semver_1.createVersionBucket)(9);
86
+ it('returns major version bucket for versions >= threshold', () => {
87
+ expect(getVersionBucket('9.0.0')).toBe('9.x');
88
+ expect(getVersionBucket('10.0.0')).toBe('10.x');
89
+ expect(getVersionBucket('11.0.0')).toBe('11.x');
90
+ });
91
+ it('returns "<threshold" bucket for versions below threshold', () => {
92
+ expect(getVersionBucket('8.0.0')).toBe('<9.0.0');
93
+ expect(getVersionBucket('7.0.0')).toBe('<9.0.0');
94
+ });
95
+ });
96
+ });
97
+ describe('edge cases', () => {
98
+ const getVersionBucket = (0, semver_1.createVersionBucket)();
99
+ it('handles version with only major.minor', () => {
100
+ expect(getVersionBucket('1.0')).toBe('1.x');
101
+ expect(getVersionBucket('15.3')).toBe('15.x');
102
+ });
103
+ it('handles prerelease versions', () => {
104
+ expect(getVersionBucket('1.0.0-beta.1')).toBe('1.x');
105
+ expect(getVersionBucket('2.0.0-rc.1')).toBe('2.x');
106
+ expect(getVersionBucket('15.0.0-canary.1')).toBe('15.x');
107
+ });
108
+ it('handles versions with build metadata', () => {
109
+ expect(getVersionBucket('1.0.0+build.123')).toBe('1.x');
110
+ });
111
+ it('handles whitespace-only string (semver treats as version 0)', () => {
112
+ // Note: semver's minVersion treats whitespace as a valid range matching version 0
113
+ expect(getVersionBucket(' ')).toBe('0.x');
114
+ });
115
+ });
116
+ });
117
+ //# sourceMappingURL=semver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.test.js","sourceRoot":"","sources":["../../../../src/utils/__tests__/semver.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { createVersionBucket } from '../semver';\n\ndescribe('createVersionBucket', () => {\n describe('without minimum threshold', () => {\n const getVersionBucket = createVersionBucket();\n\n it('returns \"none\" for undefined version', () => {\n expect(getVersionBucket(undefined)).toBe('none');\n });\n\n it('returns \"none\" for empty string', () => {\n expect(getVersionBucket('')).toBe('none');\n });\n\n it('returns major version bucket for exact versions', () => {\n expect(getVersionBucket('1.0.0')).toBe('1.x');\n expect(getVersionBucket('2.5.3')).toBe('2.x');\n expect(getVersionBucket('15.3.2')).toBe('15.x');\n });\n\n it('returns major version bucket for semver ranges', () => {\n expect(getVersionBucket('^1.0.0')).toBe('1.x');\n expect(getVersionBucket('~2.5.0')).toBe('2.x');\n expect(getVersionBucket('>=15.0.0')).toBe('15.x');\n });\n\n it('returns \"unknown\" for invalid semver (caught by try/catch)', () => {\n expect(getVersionBucket('not-a-version')).toBe('unknown');\n expect(getVersionBucket('abc')).toBe('unknown');\n });\n\n it('handles version 0.x correctly', () => {\n expect(getVersionBucket('0.1.0')).toBe('0.x');\n expect(getVersionBucket('0.0.1')).toBe('0.x');\n });\n });\n\n describe('with minimum threshold', () => {\n describe('threshold of 11 (Next.js style)', () => {\n const getVersionBucket = createVersionBucket(11);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('11.0.0')).toBe('11.x');\n expect(getVersionBucket('12.5.3')).toBe('12.x');\n expect(getVersionBucket('15.3.2')).toBe('15.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('10.0.0')).toBe('<11.0.0');\n expect(getVersionBucket('9.5.0')).toBe('<11.0.0');\n expect(getVersionBucket('1.0.0')).toBe('<11.0.0');\n });\n\n it('handles semver ranges correctly', () => {\n expect(getVersionBucket('^15.0.0')).toBe('15.x');\n expect(getVersionBucket('^10.0.0')).toBe('<11.0.0');\n });\n });\n\n describe('threshold of 6 (React Router style)', () => {\n const getVersionBucket = createVersionBucket(6);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('6.0.0')).toBe('6.x');\n expect(getVersionBucket('7.1.0')).toBe('7.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('5.3.0')).toBe('<6.0.0');\n expect(getVersionBucket('4.0.0')).toBe('<6.0.0');\n });\n });\n\n describe('threshold of 3 (Django style)', () => {\n const getVersionBucket = createVersionBucket(3);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('3.0.0')).toBe('3.x');\n expect(getVersionBucket('4.2.1')).toBe('4.x');\n expect(getVersionBucket('5.0.0')).toBe('5.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('2.2.0')).toBe('<3.0.0');\n expect(getVersionBucket('1.11.0')).toBe('<3.0.0');\n });\n });\n\n describe('threshold of 2 (Flask style)', () => {\n const getVersionBucket = createVersionBucket(2);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('2.0.0')).toBe('2.x');\n expect(getVersionBucket('3.0.0')).toBe('3.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('1.1.0')).toBe('<2.0.0');\n expect(getVersionBucket('0.12.0')).toBe('<2.0.0');\n });\n });\n\n describe('threshold of 9 (Laravel style)', () => {\n const getVersionBucket = createVersionBucket(9);\n\n it('returns major version bucket for versions >= threshold', () => {\n expect(getVersionBucket('9.0.0')).toBe('9.x');\n expect(getVersionBucket('10.0.0')).toBe('10.x');\n expect(getVersionBucket('11.0.0')).toBe('11.x');\n });\n\n it('returns \"<threshold\" bucket for versions below threshold', () => {\n expect(getVersionBucket('8.0.0')).toBe('<9.0.0');\n expect(getVersionBucket('7.0.0')).toBe('<9.0.0');\n });\n });\n });\n\n describe('edge cases', () => {\n const getVersionBucket = createVersionBucket();\n\n it('handles version with only major.minor', () => {\n expect(getVersionBucket('1.0')).toBe('1.x');\n expect(getVersionBucket('15.3')).toBe('15.x');\n });\n\n it('handles prerelease versions', () => {\n expect(getVersionBucket('1.0.0-beta.1')).toBe('1.x');\n expect(getVersionBucket('2.0.0-rc.1')).toBe('2.x');\n expect(getVersionBucket('15.0.0-canary.1')).toBe('15.x');\n });\n\n it('handles versions with build metadata', () => {\n expect(getVersionBucket('1.0.0+build.123')).toBe('1.x');\n });\n\n it('handles whitespace-only string (semver treats as version 0)', () => {\n // Note: semver's minVersion treats whitespace as a valid range matching version 0\n expect(getVersionBucket(' ')).toBe('0.x');\n });\n });\n});\n"]}
@@ -77,7 +77,7 @@ const constants_1 = require("../lib/constants");
77
77
  const analytics_1 = require("./analytics");
78
78
  const clack_1 = __importDefault(require("./clack"));
79
79
  const urls_1 = require("./urls");
80
- const config_1 = require("../lib/config");
80
+ const registry_1 = require("../lib/registry");
81
81
  const oauth_1 = require("./oauth");
82
82
  const api_1 = require("../lib/api");
83
83
  async function abort(message, status) {
@@ -92,7 +92,7 @@ async function abortIfCancelled(input, integration) {
92
92
  (typeof resolvedInput === 'symbol' &&
93
93
  resolvedInput.description === 'clack:cancel')) {
94
94
  const docsUrl = integration
95
- ? config_1.INTEGRATION_CONFIG[integration].docsUrl
95
+ ? registry_1.FRAMEWORK_REGISTRY[integration].metadata.docsUrl
96
96
  : 'https://posthog.com/docs';
97
97
  clack_1.default.cancel(`Wizard setup cancelled. You can read the documentation for ${integration ?? 'PostHog'} at ${chalk_1.default.cyan(docsUrl)} to continue with the setup manually.`);
98
98
  process.exit(0);
@@ -105,9 +105,6 @@ function printWelcome(options) {
105
105
  // eslint-disable-next-line no-console
106
106
  console.log('');
107
107
  clack_1.default.intro(chalk_1.default.inverse(` ${options.wizardName} `));
108
- const welcomeText = options.message ||
109
- `The ${options.wizardName} will help you set up PostHog for your application.\nThank you for using PostHog :)`;
110
- clack_1.default.note(welcomeText);
111
108
  }
112
109
  async function confirmContinueIfNoOrDirtyGitRepo(options) {
113
110
  return (0, telemetry_1.traceStep)('check-git-status', async () => {