@posthog/wizard 2.6.1 → 2.7.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 (106) hide show
  1. package/dist/src/frameworks/android/android-wizard-agent.js +1 -1
  2. package/dist/src/frameworks/android/android-wizard-agent.js.map +1 -1
  3. package/dist/src/frameworks/angular/angular-wizard-agent.js +1 -1
  4. package/dist/src/frameworks/angular/angular-wizard-agent.js.map +1 -1
  5. package/dist/src/frameworks/astro/astro-wizard-agent.js +1 -1
  6. package/dist/src/frameworks/astro/astro-wizard-agent.js.map +1 -1
  7. package/dist/src/frameworks/django/django-wizard-agent.js +1 -1
  8. package/dist/src/frameworks/django/django-wizard-agent.js.map +1 -1
  9. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js +1 -1
  10. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js.map +1 -1
  11. package/dist/src/frameworks/flask/flask-wizard-agent.js +1 -1
  12. package/dist/src/frameworks/flask/flask-wizard-agent.js.map +1 -1
  13. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js +1 -1
  14. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js.map +1 -1
  15. package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js +1 -1
  16. package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js.map +1 -1
  17. package/dist/src/frameworks/laravel/laravel-wizard-agent.js +1 -1
  18. package/dist/src/frameworks/laravel/laravel-wizard-agent.js.map +1 -1
  19. package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js +1 -1
  20. package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js.map +1 -1
  21. package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js +1 -1
  22. package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js.map +1 -1
  23. package/dist/src/frameworks/python/python-wizard-agent.js +1 -1
  24. package/dist/src/frameworks/python/python-wizard-agent.js.map +1 -1
  25. package/dist/src/frameworks/rails/rails-wizard-agent.js +1 -1
  26. package/dist/src/frameworks/rails/rails-wizard-agent.js.map +1 -1
  27. package/dist/src/frameworks/react-native/react-native-wizard-agent.js +1 -1
  28. package/dist/src/frameworks/react-native/react-native-wizard-agent.js.map +1 -1
  29. package/dist/src/frameworks/react-router/react-router-wizard-agent.js +1 -1
  30. package/dist/src/frameworks/react-router/react-router-wizard-agent.js.map +1 -1
  31. package/dist/src/frameworks/ruby/ruby-wizard-agent.js +2 -2
  32. package/dist/src/frameworks/ruby/ruby-wizard-agent.js.map +1 -1
  33. package/dist/src/frameworks/svelte/svelte-wizard-agent.js +1 -1
  34. package/dist/src/frameworks/svelte/svelte-wizard-agent.js.map +1 -1
  35. package/dist/src/frameworks/swift/swift-wizard-agent.js +2 -2
  36. package/dist/src/frameworks/swift/swift-wizard-agent.js.map +1 -1
  37. package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js +1 -1
  38. package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js.map +1 -1
  39. package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js +1 -1
  40. package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js.map +1 -1
  41. package/dist/src/frameworks/vue/vue-wizard-agent.js +1 -1
  42. package/dist/src/frameworks/vue/vue-wizard-agent.js.map +1 -1
  43. package/dist/src/lib/__tests__/cloudflare-detection.test.d.ts +1 -0
  44. package/dist/src/lib/__tests__/cloudflare-detection.test.js +119 -0
  45. package/dist/src/lib/__tests__/cloudflare-detection.test.js.map +1 -0
  46. package/dist/src/lib/__tests__/yara-scanner.test.js +3 -3
  47. package/dist/src/lib/__tests__/yara-scanner.test.js.map +1 -1
  48. package/dist/src/lib/agent-interface.js +30 -0
  49. package/dist/src/lib/agent-interface.js.map +1 -1
  50. package/dist/src/lib/agent-runner.js +15 -3
  51. package/dist/src/lib/agent-runner.js.map +1 -1
  52. package/dist/src/lib/cloudflare-detection.d.ts +14 -0
  53. package/dist/src/lib/cloudflare-detection.js +74 -0
  54. package/dist/src/lib/cloudflare-detection.js.map +1 -0
  55. package/dist/src/lib/commandments.js +1 -1
  56. package/dist/src/lib/commandments.js.map +1 -1
  57. package/dist/src/lib/constants.d.ts +5 -2
  58. package/dist/src/lib/constants.js +5 -2
  59. package/dist/src/lib/constants.js.map +1 -1
  60. package/dist/src/lib/middleware/config.js +4 -4
  61. package/dist/src/lib/middleware/config.js.map +1 -1
  62. package/dist/src/lib/version.d.ts +1 -1
  63. package/dist/src/lib/version.js +1 -1
  64. package/dist/src/lib/version.js.map +1 -1
  65. package/dist/src/lib/wizard-session.d.ts +2 -0
  66. package/dist/src/lib/wizard-session.js +2 -0
  67. package/dist/src/lib/wizard-session.js.map +1 -1
  68. package/dist/src/lib/wizard-tools.js +3 -3
  69. package/dist/src/lib/wizard-tools.js.map +1 -1
  70. package/dist/src/lib/yara-scanner.js +1 -1
  71. package/dist/src/lib/yara-scanner.js.map +1 -1
  72. package/dist/src/run.js +4 -0
  73. package/dist/src/run.js.map +1 -1
  74. package/dist/src/steps/add-mcp-server-to-clients/defaults.js +5 -5
  75. package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -1
  76. package/dist/src/ui/tui/__tests__/store.test.js +26 -2
  77. package/dist/src/ui/tui/__tests__/store.test.js.map +1 -1
  78. package/dist/src/ui/tui/components/TitleBar.js +1 -1
  79. package/dist/src/ui/tui/components/TitleBar.js.map +1 -1
  80. package/dist/src/ui/tui/flows.d.ts +1 -0
  81. package/dist/src/ui/tui/flows.js +6 -1
  82. package/dist/src/ui/tui/flows.js.map +1 -1
  83. package/dist/src/ui/tui/primitives/GroupedPickerMenu.d.ts +3 -0
  84. package/dist/src/ui/tui/primitives/GroupedPickerMenu.js +120 -15
  85. package/dist/src/ui/tui/primitives/GroupedPickerMenu.js.map +1 -1
  86. package/dist/src/ui/tui/screen-registry.js +2 -0
  87. package/dist/src/ui/tui/screen-registry.js.map +1 -1
  88. package/dist/src/ui/tui/screens/OutroScreen.js +2 -2
  89. package/dist/src/ui/tui/screens/OutroScreen.js.map +1 -1
  90. package/dist/src/ui/tui/screens/SkillsScreen.d.ts +14 -0
  91. package/dist/src/ui/tui/screens/SkillsScreen.js +71 -0
  92. package/dist/src/ui/tui/screens/SkillsScreen.js.map +1 -0
  93. package/dist/src/ui/tui/store.d.ts +2 -0
  94. package/dist/src/ui/tui/store.js +12 -0
  95. package/dist/src/ui/tui/store.js.map +1 -1
  96. package/dist/src/ui/tui/styles.d.ts +2 -1
  97. package/dist/src/ui/tui/styles.js +2 -1
  98. package/dist/src/ui/tui/styles.js.map +1 -1
  99. package/dist/src/utils/debug.d.ts +6 -0
  100. package/dist/src/utils/debug.js +16 -0
  101. package/dist/src/utils/debug.js.map +1 -1
  102. package/dist/src/utils/oauth.js +1 -1
  103. package/dist/src/utils/oauth.js.map +1 -1
  104. package/dist/src/utils/rules/astro-rules.md +2 -2
  105. package/npm-shrinkwrap.json +2931 -0
  106. package/package.json +8 -4
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/utils/oauth.ts"],"names":[],"mappings":"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","sourcesContent":["import * as crypto from 'node:crypto';\nimport * as http from 'node:http';\nimport { execSync } from 'node:child_process';\nimport axios from 'axios';\nimport { logToFile } from './debug';\nimport opn from 'opn';\nimport { z } from 'zod';\nimport { getUI } from '../ui';\nimport {\n IS_DEV,\n ISSUES_URL,\n OAUTH_PORT,\n POSTHOG_DEV_CLIENT_ID,\n POSTHOG_OAUTH_URL,\n POSTHOG_PROXY_CLIENT_ID,\n WIZARD_USER_AGENT,\n} from '../lib/constants';\nimport { abort } from './setup-utils';\nimport { analytics } from './analytics';\n\nconst OAUTH_CALLBACK_STYLES = `\n <style>\n * {\n font-family: monospace;\n background-color: #1b0a00;\n color: #F7A502;\n font-weight: medium;\n font-size: 24px;\n margin: .25rem;\n }\n\n .blink {\n animation: blink-animation 1s steps(2, start) infinite;\n }\n\n @keyframes blink-animation {\n to {\n opacity: 0;\n }\n }\n </style>\n`;\n\nconst OAuthTokenResponseSchema = z.object({\n access_token: z.string(),\n expires_in: z.number(),\n token_type: z.string(),\n scope: z.string(),\n refresh_token: z.string(),\n scoped_teams: z.array(z.number()).optional(),\n scoped_organizations: z.array(z.string()).optional(),\n});\n\nexport type OAuthTokenResponse = z.infer<typeof OAuthTokenResponseSchema>;\n\ninterface OAuthConfig {\n scopes: string[];\n signup?: boolean;\n}\n\nfunction generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString('base64url');\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n return crypto.createHash('sha256').update(verifier).digest('base64url');\n}\n\nasync function startCallbackServer(\n authUrl: string,\n signupUrl: string,\n): Promise<{\n server: http.Server;\n waitForCallback: () => Promise<string>;\n}> {\n return new Promise((resolve, reject) => {\n let callbackResolve: (code: string) => void;\n let callbackReject: (error: Error) => void;\n\n const waitForCallback = () =>\n new Promise<string>((res, rej) => {\n callbackResolve = res;\n callbackReject = rej;\n });\n\n const server = http.createServer((req, res) => {\n if (!req.url) {\n res.writeHead(400);\n res.end();\n return;\n }\n const url = new URL(req.url, `http://localhost:${OAUTH_PORT}`);\n\n if (url.pathname === '/authorize') {\n const isSignup = url.searchParams.get('signup') === 'true';\n const redirectUrl = isSignup ? signupUrl : authUrl;\n res.writeHead(302, { Location: redirectUrl });\n res.end();\n return;\n }\n\n const code = url.searchParams.get('code');\n const error = url.searchParams.get('error');\n\n if (error) {\n const isAccessDenied = error === 'access_denied';\n res.writeHead(isAccessDenied ? 200 : 400, {\n 'Content-Type': 'text/html; charset=utf-8',\n });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard - Authorization ${\n isAccessDenied ? 'cancelled' : 'failed'\n }</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>${\n isAccessDenied\n ? 'Authorization cancelled.'\n : `Authorization failed.`\n }</p>\n <p>Return to your terminal. This window will close automatically.</p>\n <script>window.close();</script>\n </body>\n </html>\n `);\n callbackReject(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (code) {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard is ready</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>PostHog login complete!</p>\n <p>Return to your terminal: the wizard is hard at work on your project<span class=\"blink\">█</span></p>\n <script>window.close();</script>\n </body>\n </html>\n `);\n callbackResolve(code);\n } else {\n res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard - Invalid request</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>Invalid request - no authorization code received.</p>\n <p>You can close this window.</p>\n </body>\n </html>\n `);\n }\n });\n\n server.listen(OAUTH_PORT, () => {\n resolve({ server, waitForCallback });\n });\n\n server.on('error', reject);\n });\n}\n\nfunction getPortProcessInfo(): { command: string; pid: string; user: string } {\n try {\n const output = execSync(`lsof -i :${OAUTH_PORT} -sTCP:LISTEN 2>/dev/null`, {\n encoding: 'utf-8',\n timeout: 3000,\n }).trim();\n const lines = output.split('\\n');\n // First line is header, second is the process\n if (lines.length < 2)\n return { command: 'unknown', pid: 'unknown', user: 'unknown' };\n const fields = lines[1].split(/\\s+/);\n // lsof columns: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME\n const command = fields[0] ?? 'unknown';\n const pid = fields[1] ?? 'unknown';\n const user = fields[2] ?? 'unknown';\n return { command, pid, user };\n } catch {\n return { command: 'unknown', pid: 'unknown', user: 'unknown' };\n }\n}\n\nasync function startCallbackServerWithRetry(\n authUrl: string,\n signupUrl: string,\n): ReturnType<typeof startCallbackServer> {\n try {\n return await startCallbackServer(authUrl, signupUrl);\n } catch (e) {\n const isPortInUse =\n e instanceof Error &&\n 'code' in e &&\n (e as NodeJS.ErrnoException).code === 'EADDRINUSE';\n if (!isPortInUse) throw e;\n\n const processInfo = getPortProcessInfo();\n await getUI().showPortConflict(processInfo);\n\n // User killed the process — retry once\n return startCallbackServer(authUrl, signupUrl);\n }\n}\n\nasync function exchangeCodeForToken(\n code: string,\n codeVerifier: string,\n): Promise<OAuthTokenResponse> {\n const clientId = IS_DEV ? POSTHOG_DEV_CLIENT_ID : POSTHOG_PROXY_CLIENT_ID;\n\n const response = await axios.post(\n `${POSTHOG_OAUTH_URL}/oauth/token`,\n {\n grant_type: 'authorization_code',\n code,\n redirect_uri: `http://localhost:${OAUTH_PORT}/callback`,\n client_id: clientId,\n code_verifier: codeVerifier,\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': WIZARD_USER_AGENT,\n },\n },\n );\n\n return OAuthTokenResponseSchema.parse(response.data);\n}\n\nexport async function performOAuthFlow(\n config: OAuthConfig,\n): Promise<OAuthTokenResponse> {\n const clientId = IS_DEV ? POSTHOG_DEV_CLIENT_ID : POSTHOG_PROXY_CLIENT_ID;\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n\n const authUrl = new URL(`${POSTHOG_OAUTH_URL}/oauth/authorize`);\n authUrl.searchParams.set('client_id', clientId);\n authUrl.searchParams.set(\n 'redirect_uri',\n `http://localhost:${OAUTH_PORT}/callback`,\n );\n authUrl.searchParams.set('response_type', 'code');\n authUrl.searchParams.set('code_challenge', codeChallenge);\n authUrl.searchParams.set('code_challenge_method', 'S256');\n authUrl.searchParams.set('scope', config.scopes.join(' '));\n authUrl.searchParams.set('required_access_level', 'project');\n\n const signupUrl = new URL(\n `${POSTHOG_OAUTH_URL}/signup?next=${encodeURIComponent(\n authUrl.toString(),\n )}`,\n );\n\n const localSignupUrl = `http://localhost:${OAUTH_PORT}/authorize?signup=true`;\n const localLoginUrl = `http://localhost:${OAUTH_PORT}/authorize`;\n\n const urlToOpen = config.signup ? localSignupUrl : localLoginUrl;\n\n logToFile('[oauth] starting callback server');\n const { server, waitForCallback } = await startCallbackServerWithRetry(\n authUrl.toString(),\n signupUrl.toString(),\n );\n logToFile('[oauth] callback server ready, showing login URL');\n\n getUI().setLoginUrl(urlToOpen);\n\n if (process.env.NODE_ENV !== 'test') {\n opn(urlToOpen, { wait: false }).catch(() => {\n // opn throws in environments without a browser\n });\n }\n\n const loginSpinner = getUI().spinner();\n loginSpinner.start('Waiting for authorization...');\n\n try {\n const code = await Promise.race([\n waitForCallback(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Authorization timed out')), 60_000),\n ),\n ]);\n\n const token = await exchangeCodeForToken(code, codeVerifier);\n\n server.close();\n getUI().setLoginUrl(null);\n loginSpinner.stop('Authorization complete!');\n\n return token;\n } catch (e) {\n loginSpinner.stop('Authorization failed.');\n server.close();\n\n const error = e instanceof Error ? e : new Error('Unknown error');\n\n if (error.message.includes('timeout')) {\n getUI().log.error('Authorization timed out. Please try again.');\n } else if (error.message.includes('access_denied')) {\n getUI().log.info(\n `Authorization was cancelled.\\n\\nYou denied access to PostHog. To use the wizard, you need to authorize access to your PostHog account.\\n\\nYou can try again by re-running the wizard.`,\n );\n } else {\n getUI().log.error(\n `Authorization failed:\\n\\n${error.message}\\n\\nIf you think this is a bug in the PostHog wizard, please create an issue:\\n${ISSUES_URL}`,\n );\n }\n\n analytics.captureException(error, {\n step: 'oauth_flow',\n });\n\n await abort();\n throw error;\n }\n}\n"]}
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/utils/oauth.ts"],"names":[],"mappings":"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","sourcesContent":["import * as crypto from 'node:crypto';\nimport * as http from 'node:http';\nimport { execSync } from 'node:child_process';\nimport axios from 'axios';\nimport { logToFile } from './debug';\nimport opn from 'opn';\nimport { z } from 'zod';\nimport { getUI } from '../ui';\nimport {\n IS_DEV,\n ISSUES_URL,\n OAUTH_PORT,\n OAUTH_TIMEOUT_MS,\n POSTHOG_DEV_CLIENT_ID,\n POSTHOG_OAUTH_URL,\n POSTHOG_PROXY_CLIENT_ID,\n WIZARD_USER_AGENT,\n} from '../lib/constants';\nimport { abort } from './setup-utils';\nimport { analytics } from './analytics';\n\nconst OAUTH_CALLBACK_STYLES = `\n <style>\n * {\n font-family: monospace;\n background-color: #1b0a00;\n color: #F7A502;\n font-weight: medium;\n font-size: 24px;\n margin: .25rem;\n }\n\n .blink {\n animation: blink-animation 1s steps(2, start) infinite;\n }\n\n @keyframes blink-animation {\n to {\n opacity: 0;\n }\n }\n </style>\n`;\n\nconst OAuthTokenResponseSchema = z.object({\n access_token: z.string(),\n expires_in: z.number(),\n token_type: z.string(),\n scope: z.string(),\n refresh_token: z.string(),\n scoped_teams: z.array(z.number()).optional(),\n scoped_organizations: z.array(z.string()).optional(),\n});\n\nexport type OAuthTokenResponse = z.infer<typeof OAuthTokenResponseSchema>;\n\ninterface OAuthConfig {\n scopes: string[];\n signup?: boolean;\n}\n\nfunction generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString('base64url');\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n return crypto.createHash('sha256').update(verifier).digest('base64url');\n}\n\nasync function startCallbackServer(\n authUrl: string,\n signupUrl: string,\n): Promise<{\n server: http.Server;\n waitForCallback: () => Promise<string>;\n}> {\n return new Promise((resolve, reject) => {\n let callbackResolve: (code: string) => void;\n let callbackReject: (error: Error) => void;\n\n const waitForCallback = () =>\n new Promise<string>((res, rej) => {\n callbackResolve = res;\n callbackReject = rej;\n });\n\n const server = http.createServer((req, res) => {\n if (!req.url) {\n res.writeHead(400);\n res.end();\n return;\n }\n const url = new URL(req.url, `http://localhost:${OAUTH_PORT}`);\n\n if (url.pathname === '/authorize') {\n const isSignup = url.searchParams.get('signup') === 'true';\n const redirectUrl = isSignup ? signupUrl : authUrl;\n res.writeHead(302, { Location: redirectUrl });\n res.end();\n return;\n }\n\n const code = url.searchParams.get('code');\n const error = url.searchParams.get('error');\n\n if (error) {\n const isAccessDenied = error === 'access_denied';\n res.writeHead(isAccessDenied ? 200 : 400, {\n 'Content-Type': 'text/html; charset=utf-8',\n });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard - Authorization ${\n isAccessDenied ? 'cancelled' : 'failed'\n }</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>${\n isAccessDenied\n ? 'Authorization cancelled.'\n : `Authorization failed.`\n }</p>\n <p>Return to your terminal. This window will close automatically.</p>\n <script>window.close();</script>\n </body>\n </html>\n `);\n callbackReject(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (code) {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard is ready</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>PostHog login complete!</p>\n <p>Return to your terminal: the wizard is hard at work on your project<span class=\"blink\">█</span></p>\n <script>window.close();</script>\n </body>\n </html>\n `);\n callbackResolve(code);\n } else {\n res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard - Invalid request</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>Invalid request - no authorization code received.</p>\n <p>You can close this window.</p>\n </body>\n </html>\n `);\n }\n });\n\n server.listen(OAUTH_PORT, () => {\n resolve({ server, waitForCallback });\n });\n\n server.on('error', reject);\n });\n}\n\nfunction getPortProcessInfo(): { command: string; pid: string; user: string } {\n try {\n const output = execSync(`lsof -i :${OAUTH_PORT} -sTCP:LISTEN 2>/dev/null`, {\n encoding: 'utf-8',\n timeout: 3000,\n }).trim();\n const lines = output.split('\\n');\n // First line is header, second is the process\n if (lines.length < 2)\n return { command: 'unknown', pid: 'unknown', user: 'unknown' };\n const fields = lines[1].split(/\\s+/);\n // lsof columns: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME\n const command = fields[0] ?? 'unknown';\n const pid = fields[1] ?? 'unknown';\n const user = fields[2] ?? 'unknown';\n return { command, pid, user };\n } catch {\n return { command: 'unknown', pid: 'unknown', user: 'unknown' };\n }\n}\n\nasync function startCallbackServerWithRetry(\n authUrl: string,\n signupUrl: string,\n): ReturnType<typeof startCallbackServer> {\n try {\n return await startCallbackServer(authUrl, signupUrl);\n } catch (e) {\n const isPortInUse =\n e instanceof Error &&\n 'code' in e &&\n (e as NodeJS.ErrnoException).code === 'EADDRINUSE';\n if (!isPortInUse) throw e;\n\n const processInfo = getPortProcessInfo();\n await getUI().showPortConflict(processInfo);\n\n // User killed the process — retry once\n return startCallbackServer(authUrl, signupUrl);\n }\n}\n\nasync function exchangeCodeForToken(\n code: string,\n codeVerifier: string,\n): Promise<OAuthTokenResponse> {\n const clientId = IS_DEV ? POSTHOG_DEV_CLIENT_ID : POSTHOG_PROXY_CLIENT_ID;\n\n const response = await axios.post(\n `${POSTHOG_OAUTH_URL}/oauth/token`,\n {\n grant_type: 'authorization_code',\n code,\n redirect_uri: `http://localhost:${OAUTH_PORT}/callback`,\n client_id: clientId,\n code_verifier: codeVerifier,\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': WIZARD_USER_AGENT,\n },\n },\n );\n\n return OAuthTokenResponseSchema.parse(response.data);\n}\n\nexport async function performOAuthFlow(\n config: OAuthConfig,\n): Promise<OAuthTokenResponse> {\n const clientId = IS_DEV ? POSTHOG_DEV_CLIENT_ID : POSTHOG_PROXY_CLIENT_ID;\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n\n const authUrl = new URL(`${POSTHOG_OAUTH_URL}/oauth/authorize`);\n authUrl.searchParams.set('client_id', clientId);\n authUrl.searchParams.set(\n 'redirect_uri',\n `http://localhost:${OAUTH_PORT}/callback`,\n );\n authUrl.searchParams.set('response_type', 'code');\n authUrl.searchParams.set('code_challenge', codeChallenge);\n authUrl.searchParams.set('code_challenge_method', 'S256');\n authUrl.searchParams.set('scope', config.scopes.join(' '));\n authUrl.searchParams.set('required_access_level', 'project');\n\n const signupUrl = new URL(\n `${POSTHOG_OAUTH_URL}/signup?next=${encodeURIComponent(\n authUrl.toString(),\n )}`,\n );\n\n const localSignupUrl = `http://localhost:${OAUTH_PORT}/authorize?signup=true`;\n const localLoginUrl = `http://localhost:${OAUTH_PORT}/authorize`;\n\n const urlToOpen = config.signup ? localSignupUrl : localLoginUrl;\n\n logToFile('[oauth] starting callback server');\n const { server, waitForCallback } = await startCallbackServerWithRetry(\n authUrl.toString(),\n signupUrl.toString(),\n );\n logToFile('[oauth] callback server ready, showing login URL');\n\n getUI().setLoginUrl(urlToOpen);\n\n if (process.env.NODE_ENV !== 'test') {\n opn(urlToOpen, { wait: false }).catch(() => {\n // opn throws in environments without a browser\n });\n }\n\n const loginSpinner = getUI().spinner();\n loginSpinner.start('Waiting for authorization...');\n\n try {\n const code = await Promise.race([\n waitForCallback(),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error('Authorization timed out')),\n OAUTH_TIMEOUT_MS,\n ),\n ),\n ]);\n\n const token = await exchangeCodeForToken(code, codeVerifier);\n\n server.close();\n getUI().setLoginUrl(null);\n loginSpinner.stop('Authorization complete!');\n\n return token;\n } catch (e) {\n loginSpinner.stop('Authorization failed.');\n server.close();\n\n const error = e instanceof Error ? e : new Error('Unknown error');\n\n if (error.message.includes('timeout')) {\n getUI().log.error('Authorization timed out. Please try again.');\n } else if (error.message.includes('access_denied')) {\n getUI().log.info(\n `Authorization was cancelled.\\n\\nYou denied access to PostHog. To use the wizard, you need to authorize access to your PostHog account.\\n\\nYou can try again by re-running the wizard.`,\n );\n } else {\n getUI().log.error(\n `Authorization failed:\\n\\n${error.message}\\n\\nIf you think this is a bug in the PostHog wizard, please create an issue:\\n${ISSUES_URL}`,\n );\n }\n\n analytics.captureException(error, {\n step: 'oauth_flow',\n });\n\n await abort();\n throw error;\n }\n}\n"]}
@@ -6,7 +6,7 @@ PostHog is already integrated into this Astro project. The configuration include
6
6
 
7
7
  - PostHog initialization in `src/components/posthog.astro`
8
8
  - Layout setup in `src/layouts/PostHogLayout.astro`
9
- - Environment variables for API key and host
9
+ - Environment variables for project token and host
10
10
 
11
11
  ## Key Guidelines
12
12
 
@@ -17,7 +17,7 @@ PostHog is already integrated into this Astro project. The configuration include
17
17
 
18
18
  ### Environment Variables
19
19
  - Use `PUBLIC_` prefix for client-side environment variables in Astro
20
- - `PUBLIC_POSTHOG_KEY` - Your PostHog project API key
20
+ - `PUBLIC_POSTHOG_PROJECT_TOKEN` - Your PostHog project token
21
21
  - `PUBLIC_POSTHOG_HOST` - Your PostHog instance URL
22
22
 
23
23
  ### Best Practices