@posthog/wizard 2.64.1 → 2.66.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 (118) hide show
  1. package/README.md +7 -2
  2. package/dist/{add-mcp-server-to-clients-BUqb93_I.js → add-mcp-server-to-clients-DWDEuDUR.js} +210 -46
  3. package/dist/add-mcp-server-to-clients-DWDEuDUR.js.map +1 -0
  4. package/dist/{agent-interface-NurnwA01.js → agent-interface-D3MNaDp3.js} +405 -47
  5. package/dist/agent-interface-D3MNaDp3.js.map +1 -0
  6. package/dist/{agent-prompt-loader-CbowPuWI.js → agent-prompt-loader-D8Bajo-L.js} +10 -5
  7. package/dist/agent-prompt-loader-D8Bajo-L.js.map +1 -0
  8. package/dist/{agent-runner-DisJWxJa.js → agent-runner-DEeMqJxy.js} +111 -53
  9. package/dist/agent-runner-DEeMqJxy.js.map +1 -0
  10. package/dist/{analytics-D3vKvr3l.js → analytics-D8JNuPAT.js} +2 -2
  11. package/dist/{analytics-D3vKvr3l.js.map → analytics-D8JNuPAT.js.map} +1 -1
  12. package/dist/analytics-DN3Kzf7H.js +2 -0
  13. package/dist/{api-Bhe8jpUR.js → api-CemGgyBv.js} +3 -3
  14. package/dist/{api-Bhe8jpUR.js.map → api-CemGgyBv.js.map} +1 -1
  15. package/dist/bin.js +245 -93
  16. package/dist/bin.js.map +1 -1
  17. package/dist/{bounded-fs-BeWc675I.js → bounded-fs-C6OjqZst.js} +3 -3
  18. package/dist/{bounded-fs-BeWc675I.js.map → bounded-fs-C6OjqZst.js.map} +1 -1
  19. package/dist/{ci-install-BpNzfghY.js → ci-install-DIB2n4Ju.js} +4 -4
  20. package/dist/{ci-install-BpNzfghY.js.map → ci-install-DIB2n4Ju.js.map} +1 -1
  21. package/dist/{debug-hy6aWAyk.js → debug-BKqv-yfT.js} +14 -9
  22. package/dist/debug-BKqv-yfT.js.map +1 -0
  23. package/dist/{debug-DGfRPr2A.js → debug-H-GTKvvU.js} +1 -1
  24. package/dist/{defaults-mrAre0xM.js → defaults-BHhXrX9F.js} +1 -1
  25. package/dist/{defaults-mrAre0xM.js.map → defaults-BHhXrX9F.js.map} +1 -1
  26. package/dist/{env-api-key-CMPe-WJp.js → env-api-key-CzHDwfV2.js} +2 -2
  27. package/dist/{env-api-key-CMPe-WJp.js.map → env-api-key-CzHDwfV2.js.map} +1 -1
  28. package/dist/{environment-Ktu0Ktjl.js → environment-Cl-fIQku.js} +4 -4
  29. package/dist/{environment-Ktu0Ktjl.js.map → environment-Cl-fIQku.js.map} +1 -1
  30. package/dist/{file-watcher-CqJ1dgjq.js → file-watcher-Cr-4tA-e.js} +2 -2
  31. package/dist/{file-watcher-CqJ1dgjq.js.map → file-watcher-Cr-4tA-e.js.map} +1 -1
  32. package/dist/{headless-ui-zZLgs4QL.js → headless-ui-DT3Db1bk.js} +2 -2
  33. package/dist/{headless-ui-zZLgs4QL.js.map → headless-ui-DT3Db1bk.js.map} +1 -1
  34. package/dist/{interactive-BUw1SEOz.js → interactive-D3LdFxZG.js} +2 -2
  35. package/dist/{interactive-BUw1SEOz.js.map → interactive-D3LdFxZG.js.map} +1 -1
  36. package/dist/local-dev-BN6NKQ0B.js +135 -0
  37. package/dist/local-dev-BN6NKQ0B.js.map +1 -0
  38. package/dist/{mcp-C7NMhhWa.js → mcp-BjckYQmP.js} +2 -2
  39. package/dist/{mcp-C7NMhhWa.js.map → mcp-BjckYQmP.js.map} +1 -1
  40. package/dist/mcp-install-smoke-test.ts +477 -0
  41. package/dist/{mcp-prompt-streaming-CKyqqB10.js → mcp-prompt-streaming--sRErHKv.js} +20 -4
  42. package/dist/mcp-prompt-streaming--sRErHKv.js.map +1 -0
  43. package/dist/{non-interactive-73xGtug6.js → non-interactive-CNoYoEZp.js} +2 -2
  44. package/dist/{non-interactive-73xGtug6.js.map → non-interactive-CNoYoEZp.js.map} +1 -1
  45. package/dist/{orchestrator-tools-DcMJzfDH.js → orchestrator-tools-8bGyDDhn.js} +3 -3
  46. package/dist/{orchestrator-tools-DcMJzfDH.js.map → orchestrator-tools-8bGyDDhn.js.map} +1 -1
  47. package/dist/{package-json-CDs1ZVKu.js → package-json-D0DCWpe5.js} +1 -1
  48. package/dist/{package-json-CDs1ZVKu.js.map → package-json-D0DCWpe5.js.map} +1 -1
  49. package/dist/{package-manager-KweKX3u_.js → package-manager-BQDHm7ER.js} +58 -3
  50. package/dist/package-manager-BQDHm7ER.js.map +1 -0
  51. package/dist/{pi-B4p4gpr0.js → pi-W-4RUPFY.js} +11 -11
  52. package/dist/{pi-B4p4gpr0.js.map → pi-W-4RUPFY.js.map} +1 -1
  53. package/dist/{playground-AEkWcB1E.js → playground-uHHgZChe.js} +7 -7
  54. package/dist/{playground-AEkWcB1E.js.map → playground-uHHgZChe.js.map} +1 -1
  55. package/dist/{posthog-4PljLcIz.js → posthog-ChzdlmCs.js} +2 -2
  56. package/dist/{posthog-4PljLcIz.js.map → posthog-ChzdlmCs.js.map} +1 -1
  57. package/dist/{posthog-integration-DKlEg8-Q.js → posthog-integration-LxEBGkoe.js} +680 -49
  58. package/dist/posthog-integration-LxEBGkoe.js.map +1 -0
  59. package/dist/{provisioning-QsG7HDCm.js → provisioning-BHTl91OZ.js} +3 -3
  60. package/dist/{provisioning-QsG7HDCm.js.map → provisioning-BHTl91OZ.js.map} +1 -1
  61. package/dist/{queue-tools-Jlz9dV_B.js → queue-tools-DABh1Ssc.js} +33 -7
  62. package/dist/queue-tools-DABh1Ssc.js.map +1 -0
  63. package/dist/{registry-PG_nV5Bf.js → registry-CxNpCNAj.js} +309 -6
  64. package/dist/registry-CxNpCNAj.js.map +1 -0
  65. package/dist/{security-BKUJk-Gg.js → security-B4jU_-7q.js} +5 -5
  66. package/dist/{security-BKUJk-Gg.js.map → security-B4jU_-7q.js.map} +1 -1
  67. package/dist/{setup-utils-DNpldqge.js → setup-utils-aWZEdfwh.js} +18 -13
  68. package/dist/setup-utils-aWZEdfwh.js.map +1 -0
  69. package/dist/smoke-test-ci.sh +12 -1
  70. package/dist/{start-tui-D4B0-2nr.js → start-tui-BQH4mQIZ.js} +138 -27
  71. package/dist/start-tui-BQH4mQIZ.js.map +1 -0
  72. package/dist/{steps-Dy0AXdGo.js → steps-5HAqjUvn.js} +7 -7
  73. package/dist/{steps-Dy0AXdGo.js.map → steps-5HAqjUvn.js.map} +1 -1
  74. package/dist/{store-DouLLelV.js → store-P_7zUfbj.js} +22 -7
  75. package/dist/store-P_7zUfbj.js.map +1 -0
  76. package/dist/{subagent-B4yVs5A2.js → subagent-uGPDXPfS.js} +2 -2
  77. package/dist/{subagent-B4yVs5A2.js.map → subagent-uGPDXPfS.js.map} +1 -1
  78. package/dist/{task-DRKYEbKM.js → task-oh8OAnvR.js} +29 -18
  79. package/dist/task-oh8OAnvR.js.map +1 -0
  80. package/dist/{task-stream-BGUP7yA-.js → task-stream-jUARpyB5.js} +5 -5
  81. package/dist/{task-stream-BGUP7yA-.js.map → task-stream-jUARpyB5.js.map} +1 -1
  82. package/dist/{tasks-B2GzXsZ0.js → tasks-2mu3lAvm.js} +2 -2
  83. package/dist/{tasks-B2GzXsZ0.js.map → tasks-2mu3lAvm.js.map} +1 -1
  84. package/dist/{telemetry-6zaFfCcy.js → telemetry-BllPiBKw.js} +3 -3
  85. package/dist/{telemetry-6zaFfCcy.js.map → telemetry-BllPiBKw.js.map} +1 -1
  86. package/dist/{terminal-Bu3eHFn0.js → terminal-aWQrDy8s.js} +99 -98
  87. package/dist/terminal-aWQrDy8s.js.map +1 -0
  88. package/dist/{tools-DQO5tKJg.js → tools-u8TaJFqa.js} +54 -47
  89. package/dist/tools-u8TaJFqa.js.map +1 -0
  90. package/dist/{wizard-abort-D6jJh8u5.js → wizard-abort-D9jiMkZA.js} +4 -4
  91. package/dist/{wizard-abort-D6jJh8u5.js.map → wizard-abort-D9jiMkZA.js.map} +1 -1
  92. package/dist/{wizard-abort-PgTdRS1l.js → wizard-abort-pFFH7dcx.js} +1 -1
  93. package/dist/{wizard-session-DZUDtS5d.js → wizard-session-Cw7-_OcZ.js} +1 -1
  94. package/dist/{wizard-session-BUhlJ1b8.js → wizard-session-DTyLMPsX.js} +17 -3
  95. package/dist/wizard-session-DTyLMPsX.js.map +1 -0
  96. package/dist/{yara-hooks-DjReXmTQ.js → yara-hooks-BXDBIOBq.js} +4 -4
  97. package/dist/{yara-hooks-DjReXmTQ.js.map → yara-hooks-BXDBIOBq.js.map} +1 -1
  98. package/dist/yara-hooks-i2jOabhI.js +2 -0
  99. package/package.json +2 -1
  100. package/dist/add-mcp-server-to-clients-BUqb93_I.js.map +0 -1
  101. package/dist/agent-interface-NurnwA01.js.map +0 -1
  102. package/dist/agent-prompt-loader-CbowPuWI.js.map +0 -1
  103. package/dist/agent-runner-DisJWxJa.js.map +0 -1
  104. package/dist/analytics-hNca7GLq.js +0 -2
  105. package/dist/debug-hy6aWAyk.js.map +0 -1
  106. package/dist/mcp-prompt-streaming-CKyqqB10.js.map +0 -1
  107. package/dist/package-manager-KweKX3u_.js.map +0 -1
  108. package/dist/posthog-integration-DKlEg8-Q.js.map +0 -1
  109. package/dist/queue-tools-Jlz9dV_B.js.map +0 -1
  110. package/dist/registry-PG_nV5Bf.js.map +0 -1
  111. package/dist/setup-utils-DNpldqge.js.map +0 -1
  112. package/dist/start-tui-D4B0-2nr.js.map +0 -1
  113. package/dist/store-DouLLelV.js.map +0 -1
  114. package/dist/task-DRKYEbKM.js.map +0 -1
  115. package/dist/terminal-Bu3eHFn0.js.map +0 -1
  116. package/dist/tools-DQO5tKJg.js.map +0 -1
  117. package/dist/wizard-session-BUhlJ1b8.js.map +0 -1
  118. package/dist/yara-hooks-CN_uFGCu.js +0 -2
@@ -1,16 +1,16 @@
1
- import { L as Integration, N as HAIKU_MODEL, O as DETECTION_TIMEOUT_MS, _ as evaluateWizardReadiness, at as WIZARD_INTERACTION_EVENT_NAME, f as getUI, g as SIGNUP_WIZARD_READINESS_CONFIG, mt as getSkillsBaseUrl, s as logToFile, v as getBlockingServiceKeys, x as AGENTIC_DETECTION_TIMEOUT_MS } from "./debug-hy6aWAyk.js";
2
- import { n as analytics } from "./analytics-D3vKvr3l.js";
3
- import { i as withUtm, n as openTrackedLink } from "./telemetry-6zaFfCcy.js";
4
- import { a as safeReadFile, i as readProjectFile, o as walkProjectFiles } from "./bounded-fs-BeWc675I.js";
5
- import { i as tryGetPackageJson, n as isUsingTypeScript } from "./setup-utils-DNpldqge.js";
6
- import { i as requestDeepLink } from "./provisioning-QsG7HDCm.js";
7
- import "./wizard-session-BUhlJ1b8.js";
8
- import { i as wizardAbort } from "./wizard-abort-D6jJh8u5.js";
9
- import { n as runAgent, r as shouldDisableAsk, s as authenticate } from "./agent-runner-DisJWxJa.js";
10
- import { S as WIZARD_TOOL_NAMES, i as runAgent$1, p as AgentSignals, r as initializeAgent } from "./agent-interface-NurnwA01.js";
11
- import { h as EVENT_PLAN_FILE } from "./yara-hooks-DjReXmTQ.js";
12
- import { r as detectNodePackageManagers } from "./package-manager-KweKX3u_.js";
13
- import { i as SPINNER_MESSAGE, t as FRAMEWORK_REGISTRY } from "./registry-PG_nV5Bf.js";
1
+ import { L as Integration, N as HAIKU_MODEL, O as DETECTION_TIMEOUT_MS, _ as evaluateWizardReadiness, at as WIZARD_INTERACTION_EVENT_NAME, f as getUI, g as SIGNUP_WIZARD_READINESS_CONFIG, mt as getSkillsBaseUrl, s as logToFile, v as getBlockingServiceKeys, x as AGENTIC_DETECTION_TIMEOUT_MS } from "./debug-BKqv-yfT.js";
2
+ import { n as analytics } from "./analytics-D8JNuPAT.js";
3
+ import { i as withUtm, n as openTrackedLink } from "./telemetry-BllPiBKw.js";
4
+ import { a as safeReadFile, i as readProjectFile, o as walkProjectFiles } from "./bounded-fs-C6OjqZst.js";
5
+ import { i as tryGetPackageJson, n as isUsingTypeScript } from "./setup-utils-aWZEdfwh.js";
6
+ import { i as requestDeepLink } from "./provisioning-BHTl91OZ.js";
7
+ import "./wizard-session-DTyLMPsX.js";
8
+ import { i as wizardAbort } from "./wizard-abort-D9jiMkZA.js";
9
+ import { n as runAgent, r as shouldDisableAsk, s as authenticate } from "./agent-runner-DEeMqJxy.js";
10
+ import { D as WIZARD_TOOL_NAMES, H as isEnvFileName, U as parseEnvKeyNames, V as MAX_ENV_KEY_SET, W as toPromptSafeRelativePath, i as runAgent$1, n as buildRunTags, p as AgentSignals, r as initializeAgent } from "./agent-interface-D3MNaDp3.js";
11
+ import { h as EVENT_PLAN_FILE } from "./yara-hooks-BXDBIOBq.js";
12
+ import { a as detectNodePackageManagers } from "./package-manager-BQDHm7ER.js";
13
+ import { i as SPINNER_MESSAGE, t as FRAMEWORK_REGISTRY } from "./registry-CxNpCNAj.js";
14
14
  import * as semver from "semver";
15
15
  import { existsSync, statSync } from "fs";
16
16
  import { isAbsolute, join, resolve, sep } from "path";
@@ -240,10 +240,10 @@ const PROJECT_MANIFESTS = [
240
240
  "manage.py",
241
241
  "Gemfile",
242
242
  "composer.json",
243
+ "pom.xml",
243
244
  "Cargo.toml",
244
- "go.mod",
245
245
  "mix.exs",
246
- "pom.xml",
246
+ "go.mod",
247
247
  "*.csproj",
248
248
  "Package.swift",
249
249
  "Podfile",
@@ -390,13 +390,11 @@ function sessionToWizardOptions(session) {
390
390
  installDir: session.installDir,
391
391
  ci: session.ci,
392
392
  debug: session.debug,
393
- default: false,
394
393
  benchmark: session.benchmark,
395
394
  yaraReport: session.yaraReport,
396
395
  signup: session.signup,
397
396
  apiKey: session.apiKey,
398
- projectId: session.projectId,
399
- localMcp: session.localMcp
397
+ projectId: session.projectId
400
398
  };
401
399
  }
402
400
  const NOOP_SPINNER = {
@@ -411,18 +409,28 @@ const NOOP_SPINNER = {
411
409
  */
412
410
  async function detectProjectsWithAgent(session, options) {
413
411
  if (!session.credentials) throw new Error("Detection requires authenticated credentials.");
414
- const { targets, purpose = "set up a PostHog integration", recommend = false, rerankIds, onEvent } = options;
412
+ const { targets, programId, purpose = "set up a PostHog integration", recommend = false, rerankIds, onEvent } = options;
415
413
  const { accessToken, host } = session.credentials;
416
414
  const cwd = session.installDir;
417
415
  const runOptions = sessionToWizardOptions(session);
416
+ const wizardMetadata = {
417
+ ...buildRunTags({
418
+ programId,
419
+ integration: "agentic-detect",
420
+ runId: analytics.runId,
421
+ build: analytics.build
422
+ }),
423
+ call_type: "detection"
424
+ };
418
425
  const agent = await initializeAgent({
419
426
  workingDirectory: cwd,
420
427
  posthogMcpUrl: host.mcpUrl,
421
428
  posthogApiKey: accessToken,
422
429
  host,
423
430
  detectPackageManager: detectNodePackageManagers,
424
- skillsBaseUrl: getSkillsBaseUrl(session.localMcp),
431
+ skillsBaseUrl: getSkillsBaseUrl(),
425
432
  integrationLabel: "agentic-detect",
433
+ wizardMetadata,
426
434
  allowedTools: [
427
435
  "Read",
428
436
  "Grep",
@@ -480,7 +488,7 @@ const INTEGRATION_TARGETS = Object.entries(FRAMEWORK_REGISTRY).map(([id, config]
480
488
  name: config.metadata.name
481
489
  }));
482
490
  /** Run the agentic detector for the wizard's integration frameworks — the single home of targets + purpose. */
483
- async function detectIntegrationProjects(session, options = {}) {
491
+ async function detectIntegrationProjects(session, options) {
484
492
  return detectProjectsWithAgent(session, {
485
493
  ...options,
486
494
  targets: INTEGRATION_TARGETS,
@@ -511,6 +519,7 @@ async function scopeInstallDirToProject(session) {
511
519
  let report;
512
520
  try {
513
521
  report = await Promise.race([detectIntegrationProjects(session, {
522
+ programId: "posthog-integration",
514
523
  recommend: true,
515
524
  onEvent: (line) => logToFile("[agentic detect]", line)
516
525
  }), new Promise((resolve) => setTimeout(() => resolve(TIMED_OUT), AGENTIC_DETECTION_TIMEOUT_MS))]);
@@ -679,6 +688,71 @@ const SOURCE_DETECTORS = [
679
688
  envKeys: [/^CONVEX_/, /^NEXT_PUBLIC_CONVEX_URL$/]
680
689
  }
681
690
  },
691
+ {
692
+ kind: "Firebase",
693
+ label: "Firebase",
694
+ mode: "in-cli",
695
+ signals: {
696
+ npm: ["firebase-admin", "firebase"],
697
+ python: ["firebase-admin"],
698
+ envKeys: [/^FIREBASE_/, /^NEXT_PUBLIC_FIREBASE_/]
699
+ }
700
+ },
701
+ {
702
+ kind: "Neon",
703
+ label: "Neon",
704
+ mode: "in-cli",
705
+ signals: {
706
+ npm: ["@neondatabase/serverless"],
707
+ envKeys: [/^NEON_/]
708
+ }
709
+ },
710
+ {
711
+ kind: "PlanetScaleMySQL",
712
+ label: "PlanetScale MySQL",
713
+ mode: "in-cli",
714
+ signals: {
715
+ npm: ["@planetscale/database"],
716
+ envKeys: [/^PLANETSCALE_/]
717
+ }
718
+ },
719
+ {
720
+ kind: "DynamoDB",
721
+ label: "DynamoDB",
722
+ mode: "in-cli",
723
+ signals: {
724
+ npm: ["@aws-sdk/client-dynamodb", "@aws-sdk/lib-dynamodb"],
725
+ python: ["pynamodb"]
726
+ }
727
+ },
728
+ {
729
+ kind: "Motherduck",
730
+ label: "MotherDuck",
731
+ mode: "in-cli",
732
+ signals: {
733
+ npm: ["@motherduck/wasm-client"],
734
+ envKeys: [/^MOTHERDUCK_/]
735
+ }
736
+ },
737
+ {
738
+ kind: "Databricks",
739
+ label: "Databricks",
740
+ mode: "in-cli",
741
+ signals: {
742
+ npm: ["@databricks/sql"],
743
+ python: ["databricks-sql-connector", "databricks-sdk"],
744
+ envKeys: [/^DATABRICKS_/]
745
+ }
746
+ },
747
+ {
748
+ kind: "Singlestore",
749
+ label: "SingleStore",
750
+ mode: "in-cli",
751
+ signals: {
752
+ python: ["singlestoredb"],
753
+ envKeys: [/^SINGLESTORE_/]
754
+ }
755
+ },
682
756
  {
683
757
  kind: "Stripe",
684
758
  label: "Stripe",
@@ -1360,6 +1434,55 @@ const SOURCE_DETECTORS = [
1360
1434
  envKeys: [/^OPENROUTER_/]
1361
1435
  }
1362
1436
  },
1437
+ {
1438
+ kind: "Browserbase",
1439
+ label: "Browserbase",
1440
+ mode: "in-cli",
1441
+ signals: {
1442
+ npm: ["@browserbasehq/sdk", "@browserbasehq/stagehand"],
1443
+ python: ["browserbase"],
1444
+ envKeys: [/^BROWSERBASE_/]
1445
+ }
1446
+ },
1447
+ {
1448
+ kind: "E2B",
1449
+ label: "E2B",
1450
+ mode: "in-cli",
1451
+ signals: {
1452
+ npm: ["e2b", "@e2b/code-interpreter"],
1453
+ python: ["e2b", "e2b-code-interpreter"],
1454
+ envKeys: [/^E2B_/]
1455
+ }
1456
+ },
1457
+ {
1458
+ kind: "WeightsAndBiases",
1459
+ label: "Weights & Biases",
1460
+ mode: "in-cli",
1461
+ signals: {
1462
+ python: ["wandb"],
1463
+ envKeys: [/^WANDB_/]
1464
+ }
1465
+ },
1466
+ {
1467
+ kind: "LlamaCloud",
1468
+ label: "LlamaCloud",
1469
+ mode: "in-cli",
1470
+ signals: {
1471
+ npm: ["llama-cloud-services"],
1472
+ python: ["llama-cloud-services"],
1473
+ envKeys: [/^LLAMA_CLOUD_/]
1474
+ }
1475
+ },
1476
+ {
1477
+ kind: "Zep",
1478
+ label: "Zep",
1479
+ mode: "in-cli",
1480
+ signals: {
1481
+ npm: ["@getzep/zep-cloud"],
1482
+ python: ["zep-cloud"],
1483
+ envKeys: [/^ZEP_API_KEY$/]
1484
+ }
1485
+ },
1363
1486
  {
1364
1487
  kind: "Paystack",
1365
1488
  label: "Paystack",
@@ -1444,6 +1567,84 @@ const SOURCE_DETECTORS = [
1444
1567
  envKeys: [/^INVOICED_/]
1445
1568
  }
1446
1569
  },
1570
+ {
1571
+ kind: "LemonSqueezy",
1572
+ label: "Lemon Squeezy",
1573
+ mode: "in-cli",
1574
+ signals: {
1575
+ npm: ["@lemonsqueezy/lemonsqueezy.js"],
1576
+ envKeys: [/^LEMONSQUEEZY_/, /^LEMON_SQUEEZY_/]
1577
+ }
1578
+ },
1579
+ {
1580
+ kind: "Razorpay",
1581
+ label: "Razorpay",
1582
+ mode: "in-cli",
1583
+ signals: {
1584
+ npm: ["razorpay"],
1585
+ python: ["razorpay"],
1586
+ ruby: ["razorpay"],
1587
+ envKeys: [/^RAZORPAY_/]
1588
+ }
1589
+ },
1590
+ {
1591
+ kind: "Adyen",
1592
+ label: "Adyen",
1593
+ mode: "in-cli",
1594
+ signals: {
1595
+ npm: ["@adyen/api-library"],
1596
+ python: ["adyen"],
1597
+ envKeys: [/^ADYEN_/]
1598
+ }
1599
+ },
1600
+ {
1601
+ kind: "ChartMogul",
1602
+ label: "ChartMogul",
1603
+ mode: "in-cli",
1604
+ signals: {
1605
+ npm: ["chartmogul-node"],
1606
+ python: ["chartmogul"],
1607
+ envKeys: [/^CHARTMOGUL_/]
1608
+ }
1609
+ },
1610
+ {
1611
+ kind: "Airwallex",
1612
+ label: "Airwallex",
1613
+ mode: "in-cli",
1614
+ signals: {
1615
+ npm: ["airwallex-payment-elements"],
1616
+ envKeys: [/^AIRWALLEX_/]
1617
+ }
1618
+ },
1619
+ {
1620
+ kind: "Flutterwave",
1621
+ label: "Flutterwave",
1622
+ mode: "in-cli",
1623
+ signals: {
1624
+ npm: ["flutterwave-node-v3"],
1625
+ python: ["flutterwave"],
1626
+ envKeys: [/^FLUTTERWAVE_/, /^FLW_(PUBLIC|SECRET)_KEY$/]
1627
+ }
1628
+ },
1629
+ {
1630
+ kind: "DodoPayments",
1631
+ label: "Dodo Payments",
1632
+ mode: "in-cli",
1633
+ signals: {
1634
+ npm: ["dodopayments"],
1635
+ python: ["dodopayments"],
1636
+ envKeys: [/^DODO_PAYMENTS_/]
1637
+ }
1638
+ },
1639
+ {
1640
+ kind: "Whop",
1641
+ label: "Whop",
1642
+ mode: "in-cli",
1643
+ signals: {
1644
+ npm: ["@whop/api", "@whop-apps/sdk"],
1645
+ envKeys: [/^WHOP_/]
1646
+ }
1647
+ },
1447
1648
  {
1448
1649
  kind: "SparkPost",
1449
1650
  label: "SparkPost",
@@ -1518,6 +1719,90 @@ const SOURCE_DETECTORS = [
1518
1719
  mode: "in-cli",
1519
1720
  signals: { envKeys: [/^LEMLIST_/] }
1520
1721
  },
1722
+ {
1723
+ kind: "Loops",
1724
+ label: "Loops",
1725
+ mode: "in-cli",
1726
+ signals: {
1727
+ npm: ["loops"],
1728
+ envKeys: [/^LOOPS_/]
1729
+ }
1730
+ },
1731
+ {
1732
+ kind: "Knock",
1733
+ label: "Knock",
1734
+ mode: "in-cli",
1735
+ signals: {
1736
+ npm: ["@knocklabs/node", "@knocklabs/client"],
1737
+ python: ["knockapi"],
1738
+ envKeys: [/^KNOCK_/]
1739
+ }
1740
+ },
1741
+ {
1742
+ kind: "AwsSes",
1743
+ label: "Amazon SES",
1744
+ mode: "in-cli",
1745
+ signals: {
1746
+ npm: ["@aws-sdk/client-ses", "@aws-sdk/client-sesv2"],
1747
+ envKeys: [/^AWS_SES_/]
1748
+ }
1749
+ },
1750
+ {
1751
+ kind: "Beehiiv",
1752
+ label: "beehiiv",
1753
+ mode: "in-cli",
1754
+ signals: { envKeys: [/^BEEHIIV_/] }
1755
+ },
1756
+ {
1757
+ kind: "Mailtrap",
1758
+ label: "Mailtrap",
1759
+ mode: "in-cli",
1760
+ signals: {
1761
+ npm: ["mailtrap"],
1762
+ python: ["mailtrap"],
1763
+ envKeys: [/^MAILTRAP_/]
1764
+ }
1765
+ },
1766
+ {
1767
+ kind: "Plunk",
1768
+ label: "Plunk",
1769
+ mode: "in-cli",
1770
+ signals: {
1771
+ npm: ["@plunk/node"],
1772
+ envKeys: [/^PLUNK_/]
1773
+ }
1774
+ },
1775
+ {
1776
+ kind: "Ortto",
1777
+ label: "Ortto",
1778
+ mode: "in-cli",
1779
+ signals: { envKeys: [/^ORTTO_/] }
1780
+ },
1781
+ {
1782
+ kind: "Postscript",
1783
+ label: "Postscript",
1784
+ mode: "in-cli",
1785
+ signals: { envKeys: [/^POSTSCRIPT_/] }
1786
+ },
1787
+ {
1788
+ kind: "Marketo",
1789
+ label: "Marketo",
1790
+ mode: "in-cli",
1791
+ signals: {
1792
+ python: ["marketorestpython"],
1793
+ envKeys: [/^MARKETO_/]
1794
+ }
1795
+ },
1796
+ {
1797
+ kind: "Lob",
1798
+ label: "Lob",
1799
+ mode: "in-cli",
1800
+ signals: {
1801
+ npm: ["lob"],
1802
+ python: ["lob"],
1803
+ envKeys: [/^LOB_API_KEY$/]
1804
+ }
1805
+ },
1521
1806
  {
1522
1807
  kind: "Segment",
1523
1808
  label: "Segment",
@@ -1683,6 +1968,36 @@ const SOURCE_DETECTORS = [
1683
1968
  mode: "in-cli",
1684
1969
  signals: { envKeys: [/^JUSTCALL_/] }
1685
1970
  },
1971
+ {
1972
+ kind: "Telnyx",
1973
+ label: "Telnyx",
1974
+ mode: "in-cli",
1975
+ signals: {
1976
+ npm: ["telnyx"],
1977
+ python: ["telnyx"],
1978
+ envKeys: [/^TELNYX_/]
1979
+ }
1980
+ },
1981
+ {
1982
+ kind: "Plivo",
1983
+ label: "Plivo",
1984
+ mode: "in-cli",
1985
+ signals: {
1986
+ npm: ["plivo"],
1987
+ python: ["plivo"],
1988
+ envKeys: [/^PLIVO_/]
1989
+ }
1990
+ },
1991
+ {
1992
+ kind: "Courier",
1993
+ label: "Courier",
1994
+ mode: "in-cli",
1995
+ signals: {
1996
+ npm: ["@trycourier/courier"],
1997
+ python: ["trycourier"],
1998
+ envKeys: [/^COURIER_AUTH_TOKEN$/]
1999
+ }
2000
+ },
1686
2001
  {
1687
2002
  kind: "WooCommerce",
1688
2003
  label: "WooCommerce",
@@ -1756,6 +2071,15 @@ const SOURCE_DETECTORS = [
1756
2071
  mode: "in-cli",
1757
2072
  signals: { envKeys: [/^PRINTIFY_/] }
1758
2073
  },
2074
+ {
2075
+ kind: "BigCommerce",
2076
+ label: "BigCommerce",
2077
+ mode: "in-cli",
2078
+ signals: {
2079
+ npm: ["node-bigcommerce"],
2080
+ envKeys: [/^BIGCOMMERCE_/]
2081
+ }
2082
+ },
1759
2083
  {
1760
2084
  kind: "Freshdesk",
1761
2085
  label: "Freshdesk",
@@ -1976,6 +2300,226 @@ const SOURCE_DETECTORS = [
1976
2300
  envKeys: [/^VERCEL_API_TOKEN$/]
1977
2301
  }
1978
2302
  },
2303
+ {
2304
+ kind: "Algolia",
2305
+ label: "Algolia",
2306
+ mode: "in-cli",
2307
+ signals: {
2308
+ npm: ["algoliasearch"],
2309
+ python: ["algoliasearch"],
2310
+ ruby: ["algolia"],
2311
+ envKeys: [/^ALGOLIA_/]
2312
+ }
2313
+ },
2314
+ {
2315
+ kind: "Inngest",
2316
+ label: "Inngest",
2317
+ mode: "in-cli",
2318
+ signals: {
2319
+ npm: ["inngest"],
2320
+ python: ["inngest"],
2321
+ envKeys: [/^INNGEST_/]
2322
+ }
2323
+ },
2324
+ {
2325
+ kind: "TriggerDev",
2326
+ label: "Trigger.dev",
2327
+ mode: "in-cli",
2328
+ signals: {
2329
+ npm: ["@trigger.dev/sdk"],
2330
+ envKeys: [/^TRIGGER_(SECRET_KEY|API_KEY|PROJECT_ID)$/]
2331
+ }
2332
+ },
2333
+ {
2334
+ kind: "Ably",
2335
+ label: "Ably",
2336
+ mode: "in-cli",
2337
+ signals: {
2338
+ npm: ["ably"],
2339
+ python: ["ably"],
2340
+ envKeys: [/^ABLY_/]
2341
+ }
2342
+ },
2343
+ {
2344
+ kind: "Netlify",
2345
+ label: "Netlify",
2346
+ mode: "in-cli",
2347
+ signals: {
2348
+ npm: ["@netlify/functions"],
2349
+ envKeys: [/^NETLIFY_/]
2350
+ }
2351
+ },
2352
+ {
2353
+ kind: "Railway",
2354
+ label: "Railway",
2355
+ mode: "in-cli",
2356
+ signals: { envKeys: [/^RAILWAY_/] }
2357
+ },
2358
+ {
2359
+ kind: "Render",
2360
+ label: "Render",
2361
+ mode: "in-cli",
2362
+ signals: { envKeys: [/^RENDER_API_KEY$/] }
2363
+ },
2364
+ {
2365
+ kind: "FlyIo",
2366
+ label: "Fly.io",
2367
+ mode: "in-cli",
2368
+ signals: { envKeys: [/^FLY_API_TOKEN$/, /^FLY_APP_NAME$/] }
2369
+ },
2370
+ {
2371
+ kind: "Heroku",
2372
+ label: "Heroku",
2373
+ mode: "in-cli",
2374
+ signals: { envKeys: [/^HEROKU_/] }
2375
+ },
2376
+ {
2377
+ kind: "DigitalOcean",
2378
+ label: "DigitalOcean",
2379
+ mode: "in-cli",
2380
+ signals: { envKeys: [/^DIGITALOCEAN_/] }
2381
+ },
2382
+ {
2383
+ kind: "Grafana",
2384
+ label: "Grafana",
2385
+ mode: "in-cli",
2386
+ signals: {
2387
+ python: ["grafana-client"],
2388
+ envKeys: [/^GRAFANA_/]
2389
+ }
2390
+ },
2391
+ {
2392
+ kind: "BetterStack",
2393
+ label: "Better Stack",
2394
+ mode: "in-cli",
2395
+ signals: {
2396
+ npm: ["@logtail/node", "@logtail/js"],
2397
+ envKeys: [
2398
+ /^BETTERSTACK_/,
2399
+ /^BETTER_STACK_/,
2400
+ /^LOGTAIL_/
2401
+ ]
2402
+ }
2403
+ },
2404
+ {
2405
+ kind: "Honeycomb",
2406
+ label: "Honeycomb",
2407
+ mode: "in-cli",
2408
+ signals: {
2409
+ npm: ["@honeycombio/opentelemetry-node", "honeycomb-beeline"],
2410
+ python: ["honeycomb-beeline", "libhoney"],
2411
+ envKeys: [/^HONEYCOMB_/]
2412
+ }
2413
+ },
2414
+ {
2415
+ kind: "Descope",
2416
+ label: "Descope",
2417
+ mode: "in-cli",
2418
+ signals: {
2419
+ npm: [
2420
+ "@descope/node-sdk",
2421
+ "@descope/nextjs-sdk",
2422
+ "@descope/react-sdk"
2423
+ ],
2424
+ python: ["descope"],
2425
+ envKeys: [/^DESCOPE_/]
2426
+ }
2427
+ },
2428
+ {
2429
+ kind: "FusionAuth",
2430
+ label: "FusionAuth",
2431
+ mode: "in-cli",
2432
+ signals: {
2433
+ npm: ["@fusionauth/typescript-client"],
2434
+ python: ["fusionauth-client"],
2435
+ envKeys: [/^FUSIONAUTH_/, /^FUSION_AUTH_/]
2436
+ }
2437
+ },
2438
+ {
2439
+ kind: "Hookdeck",
2440
+ label: "Hookdeck",
2441
+ mode: "in-cli",
2442
+ signals: {
2443
+ npm: ["@hookdeck/sdk"],
2444
+ envKeys: [/^HOOKDECK_/]
2445
+ }
2446
+ },
2447
+ {
2448
+ kind: "N8n",
2449
+ label: "n8n",
2450
+ mode: "in-cli",
2451
+ signals: {
2452
+ npm: ["n8n"],
2453
+ envKeys: [/^N8N_/]
2454
+ }
2455
+ },
2456
+ {
2457
+ kind: "Dbt",
2458
+ label: "dbt",
2459
+ mode: "in-cli",
2460
+ signals: {
2461
+ python: [
2462
+ "dbt-core",
2463
+ "dbt-snowflake",
2464
+ "dbt-postgres",
2465
+ "dbt-bigquery",
2466
+ "dbt-redshift",
2467
+ "dbt-databricks"
2468
+ ],
2469
+ envKeys: [/^DBT_/]
2470
+ }
2471
+ },
2472
+ {
2473
+ kind: "Fastly",
2474
+ label: "Fastly",
2475
+ mode: "in-cli",
2476
+ signals: {
2477
+ npm: ["fastly"],
2478
+ python: ["fastly"],
2479
+ envKeys: [/^FASTLY_/]
2480
+ }
2481
+ },
2482
+ {
2483
+ kind: "Bunny",
2484
+ label: "Bunny.net",
2485
+ mode: "in-cli",
2486
+ signals: { envKeys: [/^BUNNY_/] }
2487
+ },
2488
+ {
2489
+ kind: "Codecov",
2490
+ label: "Codecov",
2491
+ mode: "in-cli",
2492
+ signals: {
2493
+ npm: ["codecov"],
2494
+ envKeys: [/^CODECOV_/]
2495
+ }
2496
+ },
2497
+ {
2498
+ kind: "Sourcegraph",
2499
+ label: "Sourcegraph",
2500
+ mode: "in-cli",
2501
+ signals: { envKeys: [/^SOURCEGRAPH_/, /^SRC_ACCESS_TOKEN$/] }
2502
+ },
2503
+ {
2504
+ kind: "TemporalIO",
2505
+ label: "Temporal.io",
2506
+ mode: "in-cli",
2507
+ signals: {
2508
+ npm: ["@temporalio/client", "@temporalio/worker"],
2509
+ python: ["temporalio"],
2510
+ envKeys: [/^TEMPORAL_/]
2511
+ }
2512
+ },
2513
+ {
2514
+ kind: "Hatchet",
2515
+ label: "Hatchet",
2516
+ mode: "in-cli",
2517
+ signals: {
2518
+ npm: ["@hatchet-dev/typescript-sdk"],
2519
+ python: ["hatchet-sdk"],
2520
+ envKeys: [/^HATCHET_/]
2521
+ }
2522
+ },
1979
2523
  {
1980
2524
  kind: "Pipedrive",
1981
2525
  label: "Pipedrive",
@@ -2039,6 +2583,28 @@ const SOURCE_DETECTORS = [
2039
2583
  mode: "in-cli",
2040
2584
  signals: { envKeys: [/^VITALLY_/] }
2041
2585
  },
2586
+ {
2587
+ kind: "Docusign",
2588
+ label: "DocuSign",
2589
+ mode: "in-cli",
2590
+ signals: {
2591
+ npm: ["docusign-esign"],
2592
+ python: ["docusign-esign"],
2593
+ envKeys: [/^DOCUSIGN_/]
2594
+ }
2595
+ },
2596
+ {
2597
+ kind: "PandaDoc",
2598
+ label: "PandaDoc",
2599
+ mode: "in-cli",
2600
+ signals: { envKeys: [/^PANDADOC_/] }
2601
+ },
2602
+ {
2603
+ kind: "Gong",
2604
+ label: "Gong",
2605
+ mode: "in-cli",
2606
+ signals: { envKeys: [/^GONG_/] }
2607
+ },
2042
2608
  {
2043
2609
  kind: "Asana",
2044
2610
  label: "Asana",
@@ -2146,6 +2712,64 @@ const SOURCE_DETECTORS = [
2146
2712
  mode: "in-cli",
2147
2713
  signals: { envKeys: [/^PRODUCTBOARD_/] }
2148
2714
  },
2715
+ {
2716
+ kind: "GoogleSheets",
2717
+ label: "Google Sheets",
2718
+ mode: "in-cli",
2719
+ signals: {
2720
+ npm: ["google-spreadsheet"],
2721
+ python: ["gspread"],
2722
+ envKeys: [/^GOOGLE_SHEETS_/]
2723
+ }
2724
+ },
2725
+ {
2726
+ kind: "Formbricks",
2727
+ label: "Formbricks",
2728
+ mode: "in-cli",
2729
+ signals: {
2730
+ npm: ["@formbricks/js"],
2731
+ envKeys: [/^FORMBRICKS_/]
2732
+ }
2733
+ },
2734
+ {
2735
+ kind: "Tally",
2736
+ label: "Tally",
2737
+ mode: "in-cli",
2738
+ signals: { envKeys: [/^TALLY_API_KEY$/] }
2739
+ },
2740
+ {
2741
+ kind: "Jotform",
2742
+ label: "Jotform",
2743
+ mode: "in-cli",
2744
+ signals: {
2745
+ python: ["jotform"],
2746
+ envKeys: [/^JOTFORM_/]
2747
+ }
2748
+ },
2749
+ {
2750
+ kind: "GitBook",
2751
+ label: "GitBook",
2752
+ mode: "in-cli",
2753
+ signals: {
2754
+ npm: ["@gitbook/api"],
2755
+ envKeys: [/^GITBOOK_/]
2756
+ }
2757
+ },
2758
+ {
2759
+ kind: "Wordpress",
2760
+ label: "WordPress",
2761
+ mode: "in-cli",
2762
+ signals: {
2763
+ npm: ["wpapi"],
2764
+ envKeys: [/^WORDPRESS_/]
2765
+ }
2766
+ },
2767
+ {
2768
+ kind: "Clockify",
2769
+ label: "Clockify",
2770
+ mode: "in-cli",
2771
+ signals: { envKeys: [/^CLOCKIFY_/] }
2772
+ },
2149
2773
  {
2150
2774
  kind: "Calendly",
2151
2775
  label: "Calendly",
@@ -2289,6 +2913,16 @@ const SOURCE_DETECTORS = [
2289
2913
  npm: ["react-native-appsflyer"],
2290
2914
  envKeys: [/^APPSFLYER_/]
2291
2915
  }
2916
+ },
2917
+ {
2918
+ kind: "Dub",
2919
+ label: "Dub",
2920
+ mode: "in-cli",
2921
+ signals: {
2922
+ npm: ["dub"],
2923
+ python: ["dub"],
2924
+ envKeys: [/^DUB_API_KEY$/]
2925
+ }
2292
2926
  }
2293
2927
  ];
2294
2928
  //#endregion
@@ -2304,7 +2938,7 @@ const SOURCE_DETECTORS = [
2304
2938
  * Note we only read `.env` KEY NAMES, never values.
2305
2939
  */
2306
2940
  const MAX_DEPTH = 3;
2307
- const MAX_SIGNAL_SET = 5e3;
2941
+ const MAX_SIGNAL_SET = MAX_ENV_KEY_SET;
2308
2942
  function addCapped(set, value) {
2309
2943
  if (set.size < MAX_SIGNAL_SET) set.add(value);
2310
2944
  }
@@ -2337,7 +2971,7 @@ function matchDetector(detector, signals) {
2337
2971
  const rubyHit = ruby?.find((gem) => signals.ruby.has(gem));
2338
2972
  if (rubyHit) return `found \`${rubyHit}\` in Gemfile`;
2339
2973
  if (envKeys) {
2340
- for (const key of signals.envKeys) if (envKeys.some((re) => re.test(key))) return `found \`${key}\` in .env`;
2974
+ for (const [key, file] of signals.envKeys) if (envKeys.some((re) => re.test(key))) return `found \`${key}\` in \`${file}\``;
2341
2975
  }
2342
2976
  return null;
2343
2977
  }
@@ -2346,9 +2980,9 @@ function collectSignals(installDir) {
2346
2980
  npm: /* @__PURE__ */ new Set(),
2347
2981
  python: /* @__PURE__ */ new Set(),
2348
2982
  ruby: /* @__PURE__ */ new Set(),
2349
- envKeys: /* @__PURE__ */ new Set()
2983
+ envKeys: /* @__PURE__ */ new Map()
2350
2984
  };
2351
- walkProjectFiles(installDir, (name, fullPath) => ingestFile(name, fullPath, signals), MAX_DEPTH);
2985
+ walkProjectFiles(installDir, (name, fullPath) => ingestFile(installDir, name, fullPath, signals), MAX_DEPTH);
2352
2986
  return signals;
2353
2987
  }
2354
2988
  /**
@@ -2357,12 +2991,12 @@ function collectSignals(installDir) {
2357
2991
  * avoids slurping every file in the tree (lockfiles, binaries, assets) into
2358
2992
  * memory just to discard it.
2359
2993
  */
2360
- function ingestFile(name, fullPath, signals) {
2994
+ function ingestFile(installDir, name, fullPath, signals) {
2361
2995
  const ingest = ingestorFor(name);
2362
2996
  if (!ingest) return;
2363
2997
  const content = safeReadFile(fullPath);
2364
2998
  if (content === null) return;
2365
- ingest(content, signals);
2999
+ ingest(content, signals, toPromptSafeRelativePath(installDir, fullPath));
2366
3000
  }
2367
3001
  /** Pick the parser for a manifest filename, or null if it's not one we read. */
2368
3002
  function ingestorFor(name) {
@@ -2371,9 +3005,21 @@ function ingestorFor(name) {
2371
3005
  if (name === "pyproject.toml") return (c, s) => parsePyprojectToml(c).forEach((d) => addCapped(s.python, d));
2372
3006
  if (name === "Pipfile") return (c, s) => parsePipfile(c).forEach((d) => addCapped(s.python, d));
2373
3007
  if (name === "Gemfile") return (c, s) => parseGemfile(c).forEach((g) => addCapped(s.ruby, g));
2374
- if (name.startsWith(".env")) return (c, s) => parseEnvKeys(c).forEach((k) => addCapped(s.envKeys, k));
3008
+ if (isEnvFileName(name)) return (c, s, relativePath) => addEnvKeys(c, s, relativePath);
2375
3009
  return null;
2376
3010
  }
3011
+ /**
3012
+ * Record each key NAME against the file that defined it. The first file wins,
3013
+ * so the reported signal stays stable when several `.env*` files repeat a key.
3014
+ * Values are never read.
3015
+ */
3016
+ function addEnvKeys(content, signals, relativePath) {
3017
+ for (const key of parseEnvKeyNames(content)) {
3018
+ if (signals.envKeys.has(key)) continue;
3019
+ if (signals.envKeys.size >= MAX_SIGNAL_SET) return;
3020
+ signals.envKeys.set(key, relativePath);
3021
+ }
3022
+ }
2377
3023
  function addNpmDeps(content, signals) {
2378
3024
  try {
2379
3025
  const pkg = JSON.parse(content);
@@ -2391,17 +3037,6 @@ function parseGemfile(content) {
2391
3037
  for (const match of content.matchAll(/^\s*gem\s+['"]([^'"]+)['"]/gm)) gems.push(match[1]);
2392
3038
  return gems;
2393
3039
  }
2394
- /** Extract KEY NAMES from a dotenv file. Values are intentionally discarded. */
2395
- function parseEnvKeys(content) {
2396
- const keys = [];
2397
- for (const line of content.split("\n")) {
2398
- const trimmed = line.trim();
2399
- if (!trimmed || trimmed.startsWith("#")) continue;
2400
- const match = trimmed.match(/^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/);
2401
- if (match) keys.push(match[1]);
2402
- }
2403
- return keys;
2404
- }
2405
3040
  //#endregion
2406
3041
  //#region src/lib/programs/warehouse-source/detect.ts
2407
3042
  /**
@@ -2521,9 +3156,7 @@ async function detectPostHogIntegration(ctx) {
2521
3156
  const sessionOptions = {
2522
3157
  installDir,
2523
3158
  debug: session.debug,
2524
- default: false,
2525
3159
  signup: session.signup,
2526
- localMcp: session.localMcp,
2527
3160
  ci: session.ci,
2528
3161
  benchmark: session.benchmark,
2529
3162
  yaraReport: session.yaraReport
@@ -3495,7 +4128,7 @@ const FUNNEL_BLOCK = {
3495
4128
  */
3496
4129
  const getContentBlocks = (store) => [
3497
4130
  {
3498
- content: "Welcome.",
4131
+ content: store?.session.apiUser?.first_name ? `Welcome, ${store.session.apiUser.first_name}.` : "Welcome.",
3499
4132
  pause: 3e3,
3500
4133
  mode: 0,
3501
4134
  animationInterval: 160
@@ -3736,7 +4369,7 @@ const warehouseSeedTasks = (sess) => {
3736
4369
  })) },
3737
4370
  notice: {
3738
4371
  title: "Connect your data sources",
3739
- body: ["We detected some warehouse sources we can connect to enrich your PostHog data. This runs at the end, once your code changes are done — we’ll prompt you then for the credentials, so you can leave the setup to run until it asks.", "You can select [Skip] if you'd like to do this later in PostHog."],
4372
+ body: ["We detected some warehouse sources we can connect to enrich your PostHog data. Answer now, and we connect them at the end of the run, after your code changes. We will ask you for the credentials at that point, and beep when we do.", "You can select [Skip] if you'd like to do this later in PostHog."],
3740
4373
  items: sources.map((s) => s.label),
3741
4374
  docsLabel: "Learn more about warehouse sources",
3742
4375
  docsUrl: WAREHOUSE_SOURCES_DOCS_URL,
@@ -3771,9 +4404,7 @@ const posthogIntegrationConfig = {
3771
4404
  const context = await gatherFrameworkContext(frameworkConfig, {
3772
4405
  installDir: session.installDir,
3773
4406
  debug: session.debug,
3774
- default: false,
3775
4407
  signup: session.signup,
3776
- localMcp: session.localMcp,
3777
4408
  ci: true,
3778
4409
  benchmark: session.benchmark,
3779
4410
  yaraReport: session.yaraReport
@@ -3790,7 +4421,7 @@ const posthogIntegrationConfig = {
3790
4421
  if (usesPackageJson) {
3791
4422
  const packageJson = await tryGetPackageJson({ installDir: session.installDir });
3792
4423
  if (packageJson) {
3793
- const { hasDeclaredDependency } = await import("./package-json-CDs1ZVKu.js").then((n) => n.i);
4424
+ const { hasDeclaredDependency } = await import("./package-json-D0DCWpe5.js").then((n) => n.i);
3794
4425
  if (!hasDeclaredDependency(config.detection.packageName, packageJson)) getUI().log.warn(`${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`);
3795
4426
  frameworkVersion = config.detection.getVersion(packageJson);
3796
4427
  } else getUI().log.warn("Could not find package.json. Continuing anyway — the agent will handle it.");
@@ -3847,7 +4478,7 @@ STEP 3: Load the installed skill's SKILL.md file to understand what references a
3847
4478
  STEP 4: Follow the skill's program files in sequence. Look for numbered program files in the references (e.g., files with patterns like "1-", "2-", "3-"). Start with the first one and proceed through each step until completion. Each program file will tell you what to do and which file comes next. Never directly write PostHog tokens directly to code files; always use environment variables.
3848
4479
 
3849
4480
  STEP 5: Set up environment variables for PostHog using the wizard-tools MCP server (this runs locally — secret values never leave the machine):
3850
- - Use check_env_keys to see which keys already exist in the project's .env file (e.g. .env.local or .env).
4481
+ - Use check_env_keys to see which keys the project already sets, and where. Omit filePath and it scans every .env file in the project, so you don't have to guess between .env, .env.local and a nested one. It answers { status, foundIn } per key: "present" means a real env file sets the key, while a key found only in a committed template (.env.example and friends) reads as "missing" — a template documents a key rather than setting it, and is never a file to write credentials into.
3851
4482
  - Use set_env_values to create or update the PostHog public token and host, using the appropriate environment variable naming convention for ${config.metadata.name}, which you'll find in example code. The tool will also ensure .gitignore coverage. Don't assume the presence of keys means the value is up to date. Write the correct value each time.
3852
4483
  - Reference these environment variables in the code files you create instead of hardcoding the public token and host.
3853
4484
 
@@ -3859,7 +4490,7 @@ ${warehouseReportInstruction(session)}
3859
4490
  postRun: async (sess, credentials) => {
3860
4491
  const envVars = config.environment.getEnvVars(credentials.projectApiKey, credentials.host.apiHost);
3861
4492
  if (config.environment.uploadToHosting) {
3862
- const { uploadEnvironmentVariablesStep } = await import("./steps-Dy0AXdGo.js");
4493
+ const { uploadEnvironmentVariablesStep } = await import("./steps-5HAqjUvn.js");
3863
4494
  const uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {
3864
4495
  integration: config.metadata.integration,
3865
4496
  session: sess
@@ -3915,4 +4546,4 @@ const integrationRunStep = {
3915
4546
  //#endregion
3916
4547
  export { scopeInstallDirToProject as C, detectFramework as D, gatherFrameworkContext as E, detectIntegrationProjects as S, resolveProjectDir as T, HEALTH_CHECK_STEP as _, LINE_CHART_BLOCK as a, getDetectedWarehouseSources as b, TextBlock as c, isClearBlock as d, isLinesBlock as f, detectPostHogIntegration as g, Icons as h, FUNNEL_BLOCK as i, computeVisibleRange as l, Colors as m, integrationRunStep as n, PRODUCT_SUITE_BLOCK as o, isObjectBlock as p, posthogIntegrationConfig as r, StatusPeekTrigger as s, SETUP_REPORT_FILE as t, wordWrap as u, WAREHOUSE_ABORT_CASES as v, detectProjectsWithAgent as w, detectWarehouseSources as x, detectWarehousePrerequisites as y };
3917
4548
 
3918
- //# sourceMappingURL=posthog-integration-DKlEg8-Q.js.map
4549
+ //# sourceMappingURL=posthog-integration-LxEBGkoe.js.map