@posthog/wizard 2.25.0 → 2.26.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 (60) hide show
  1. package/dist/{add-mcp-server-to-clients-t0xe8gn1.js → add-mcp-server-to-clients-C58l_KpV.js} +4 -4
  2. package/dist/{add-mcp-server-to-clients-t0xe8gn1.js.map → add-mcp-server-to-clients-C58l_KpV.js.map} +1 -1
  3. package/dist/{agent-interface-BsuUUPle.js → agent-interface-Dq_4h2eN.js} +39 -12
  4. package/dist/agent-interface-Dq_4h2eN.js.map +1 -0
  5. package/dist/{agent-runner-L_-kJ3y3.js → agent-runner-BNGW3osc.js} +176 -167
  6. package/dist/agent-runner-BNGW3osc.js.map +1 -0
  7. package/dist/{analytics-CDOujOSQ.js → analytics-BX3LKPch.js} +2 -2
  8. package/dist/{analytics-CDOujOSQ.js.map → analytics-BX3LKPch.js.map} +1 -1
  9. package/dist/{api-DNS-L-1U.js → api-DCHci5SD.js} +9 -5
  10. package/dist/api-DCHci5SD.js.map +1 -0
  11. package/dist/bin.js +583 -119
  12. package/dist/bin.js.map +1 -1
  13. package/dist/{ci-install-_9A7tL36.js → ci-install-CHIbwXio.js} +5 -5
  14. package/dist/{ci-install-_9A7tL36.js.map → ci-install-CHIbwXio.js.map} +1 -1
  15. package/dist/{debug-BwC7UkGH.js → debug-BizeRFR0.js} +3 -2
  16. package/dist/{debug-BwC7UkGH.js.map → debug-BizeRFR0.js.map} +1 -1
  17. package/dist/{debug-CZQcMAJT.js → debug-fg4BAKKA.js} +1 -1
  18. package/dist/{environment-DQPoj9sU.js → environment-DS5Pq9Wm.js} +3 -3
  19. package/dist/{environment-DQPoj9sU.js.map → environment-DS5Pq9Wm.js.map} +1 -1
  20. package/dist/{interactive-DT5dLd7N.js → interactive-DE3WDjk7.js} +3 -3
  21. package/dist/{interactive-DT5dLd7N.js.map → interactive-DE3WDjk7.js.map} +1 -1
  22. package/dist/{mcp-prompt-streaming-CBMr458Q.js → mcp-prompt-streaming-zsYd1zJx.js} +4 -4
  23. package/dist/{mcp-prompt-streaming-CBMr458Q.js.map → mcp-prompt-streaming-zsYd1zJx.js.map} +1 -1
  24. package/dist/{non-interactive-csP4yGdA.js → non-interactive-DNah9u3t.js} +2 -2
  25. package/dist/{non-interactive-csP4yGdA.js.map → non-interactive-DNah9u3t.js.map} +1 -1
  26. package/dist/{package-manager-CB4c2euf.js → package-manager-Dma9-zGs.js} +2 -2
  27. package/dist/{package-manager-CB4c2euf.js.map → package-manager-Dma9-zGs.js.map} +1 -1
  28. package/dist/{playground-C-lpKoKC.js → playground-Cwe0Q9HW.js} +145 -48
  29. package/dist/playground-Cwe0Q9HW.js.map +1 -0
  30. package/dist/{posthog-integration-BL8-vC0V.js → posthog-integration-CAYZdk0r.js} +11 -11
  31. package/dist/{posthog-integration-BL8-vC0V.js.map → posthog-integration-CAYZdk0r.js.map} +1 -1
  32. package/dist/{provisioning-DLOiFSM9.js → provisioning-BmL4ro-o.js} +10 -6
  33. package/dist/{provisioning-DLOiFSM9.js.map → provisioning-BmL4ro-o.js.map} +1 -1
  34. package/dist/{registry-BbRzCV5l.js → registry-C3wcDM3X.js} +4 -4
  35. package/dist/{registry-BbRzCV5l.js.map → registry-C3wcDM3X.js.map} +1 -1
  36. package/dist/{setup-utils-D87CyNkw.js → setup-utils-CNWIMZ-d.js} +71 -16
  37. package/dist/setup-utils-CNWIMZ-d.js.map +1 -0
  38. package/dist/{start-tui-DnAG57vY.js → start-tui-CS802Ww9.js} +311 -54
  39. package/dist/start-tui-CS802Ww9.js.map +1 -0
  40. package/dist/{steps-JaxH6u0f.js → steps-BX44xr30.js} +6 -6
  41. package/dist/{steps-JaxH6u0f.js.map → steps-BX44xr30.js.map} +1 -1
  42. package/dist/{telemetry-DL28cCwY.js → telemetry-BH-MgWPT.js} +3 -3
  43. package/dist/{telemetry-DL28cCwY.js.map → telemetry-BH-MgWPT.js.map} +1 -1
  44. package/dist/{AiOptInRequiredScreen-C-D9tN6r.js → terminal-BSiupnOQ.js} +1047 -85
  45. package/dist/terminal-BSiupnOQ.js.map +1 -0
  46. package/dist/{urls-vkJ5c0ix.js → urls-BuEABcmF.js} +2 -2
  47. package/dist/{urls-vkJ5c0ix.js.map → urls-BuEABcmF.js.map} +1 -1
  48. package/dist/{wizard-abort-BRXKRL4F.js → wizard-abort-CR3w2Efg.js} +1 -1
  49. package/dist/{wizard-abort-CLGgMAEe.js → wizard-abort-Dl2MJOP9.js} +3 -3
  50. package/dist/{wizard-abort-CLGgMAEe.js.map → wizard-abort-Dl2MJOP9.js.map} +1 -1
  51. package/dist/wizard-session-G3VWD6hv.js.map +1 -1
  52. package/dist/wizard-ui-WZ48rUgr.js.map +1 -1
  53. package/package.json +1 -1
  54. package/dist/AiOptInRequiredScreen-C-D9tN6r.js.map +0 -1
  55. package/dist/agent-interface-BsuUUPle.js.map +0 -1
  56. package/dist/agent-runner-L_-kJ3y3.js.map +0 -1
  57. package/dist/api-DNS-L-1U.js.map +0 -1
  58. package/dist/playground-C-lpKoKC.js.map +0 -1
  59. package/dist/setup-utils-D87CyNkw.js.map +0 -1
  60. package/dist/start-tui-DnAG57vY.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { p as getUI } from "./debug-BwC7UkGH.js";
1
+ import { p as getUI } from "./debug-BizeRFR0.js";
2
2
  //#region src/commands/basic-integration/non-interactive.ts
3
3
  /** Print the "needs a TTY" error and exit. Used when no `--ci` flag and no TTY. */
4
4
  function failNonInteractive() {
@@ -9,4 +9,4 @@ function failNonInteractive() {
9
9
  //#endregion
10
10
  export { failNonInteractive };
11
11
 
12
- //# sourceMappingURL=non-interactive-csP4yGdA.js.map
12
+ //# sourceMappingURL=non-interactive-DNah9u3t.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"non-interactive-csP4yGdA.js","names":[],"sources":["../src/commands/basic-integration/non-interactive.ts"],"sourcesContent":["import { getUI } from '@ui';\n\n/** Print the \"needs a TTY\" error and exit. Used when no `--ci` flag and no TTY. */\nexport function failNonInteractive(): void {\n getUI().intro('PostHog Wizard');\n getUI().log.error(\n 'This installer requires an interactive terminal (TTY) to run.\\n' +\n 'It appears you are running in a non-interactive environment.\\n' +\n 'Please run the wizard in an interactive terminal.\\n\\n' +\n 'For CI/CD environments, use --ci mode:\\n' +\n ' npx @posthog/wizard --ci --region us --api-key phx_xxx',\n );\n process.exit(1);\n}\n"],"mappings":";;;AAGA,SAAgB,qBAA2B;AACzC,QAAO,CAAC,MAAM,iBAAiB;AAC/B,QAAO,CAAC,IAAI,MACV,qRAKD;AACD,SAAQ,KAAK,EAAE"}
1
+ {"version":3,"file":"non-interactive-DNah9u3t.js","names":[],"sources":["../src/commands/basic-integration/non-interactive.ts"],"sourcesContent":["import { getUI } from '@ui';\n\n/** Print the \"needs a TTY\" error and exit. Used when no `--ci` flag and no TTY. */\nexport function failNonInteractive(): void {\n getUI().intro('PostHog Wizard');\n getUI().log.error(\n 'This installer requires an interactive terminal (TTY) to run.\\n' +\n 'It appears you are running in a non-interactive environment.\\n' +\n 'Please run the wizard in an interactive terminal.\\n\\n' +\n 'For CI/CD environments, use --ci mode:\\n' +\n ' npx @posthog/wizard --ci --region us --api-key phx_xxx',\n );\n process.exit(1);\n}\n"],"mappings":";;;AAGA,SAAgB,qBAA2B;AACzC,QAAO,CAAC,MAAM,iBAAiB;AAC/B,QAAO,CAAC,IAAI,MACV,qRAKD;AACD,SAAQ,KAAK,EAAE"}
@@ -1,4 +1,4 @@
1
- import { s as detectAllPackageManagers } from "./setup-utils-D87CyNkw.js";
1
+ import { s as detectAllPackageManagers } from "./setup-utils-CNWIMZ-d.js";
2
2
  import { execSync } from "node:child_process";
3
3
  //#region src/frameworks/python/utils.ts
4
4
  /**
@@ -219,4 +219,4 @@ function gradlePackageManager() {
219
219
  //#endregion
220
220
  export { gradlePackageManager as a, getPackageManagerName as c, detectPythonPackageManagers as i, getPythonVersion as l, composerPackageManager as n, swiftPackageManager as o, detectNodePackageManagers as r, detectPackageManager as s, bundlerPackageManager as t, getPythonVersionBucket as u };
221
221
 
222
- //# sourceMappingURL=package-manager-CB4c2euf.js.map
222
+ //# sourceMappingURL=package-manager-Dma9-zGs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager-CB4c2euf.js","names":["detectPythonPM"],"sources":["../src/frameworks/python/utils.ts","../src/lib/detection/package-manager.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport type { WizardRunOptions } from '@utils/types';\n\nexport enum PythonPackageManager {\n UV = 'uv',\n POETRY = 'poetry',\n PDM = 'pdm',\n HATCH = 'hatch',\n RYE = 'rye',\n PIPENV = 'pipenv',\n CONDA = 'conda',\n PIP = 'pip',\n UNKNOWN = 'unknown',\n}\n\n/**\n * Get the installed Python version\n */\nexport function getPythonVersion(\n options: WizardRunOptions,\n): string | undefined {\n try {\n const version = execSync('python --version || python3 --version', {\n cwd: options.installDir,\n encoding: 'utf-8',\n })\n .trim()\n .replace('Python ', '');\n return version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Bucket Python version for analytics (e.g., \"3.11.x\" -> \"3.11\")\n */\nexport function getPythonVersionBucket(version: string): string {\n const match = version.match(/^(\\d+\\.\\d+)/);\n return match ? match[1] : version;\n}\n\n/**\n * Detect which package manager the project uses\n */\nexport async function detectPackageManager(\n options: WizardRunOptions,\n): Promise<PythonPackageManager> {\n const { installDir } = options;\n const fs = await import('node:fs');\n const path = await import('node:path');\n\n // Check for uv (uv.lock)\n if (fs.existsSync(path.join(installDir, 'uv.lock'))) {\n return PythonPackageManager.UV;\n }\n\n // Check pyproject.toml for various tools\n if (fs.existsSync(path.join(installDir, 'pyproject.toml'))) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, 'pyproject.toml'),\n 'utf-8',\n );\n\n // Check for Poetry\n if (content.includes('[tool.poetry]')) {\n return PythonPackageManager.POETRY;\n }\n\n // Check for PDM\n if (content.includes('[tool.pdm]')) {\n return PythonPackageManager.PDM;\n }\n\n // Check for Hatch\n if (content.includes('[tool.hatch]')) {\n return PythonPackageManager.HATCH;\n }\n\n // Check for Rye\n if (content.includes('[tool.rye]')) {\n return PythonPackageManager.RYE;\n }\n } catch {\n // Continue checking\n }\n }\n\n // Check for Poetry lock file\n if (fs.existsSync(path.join(installDir, 'poetry.lock'))) {\n return PythonPackageManager.POETRY;\n }\n\n // Check for PDM lock file\n if (fs.existsSync(path.join(installDir, 'pdm.lock'))) {\n return PythonPackageManager.PDM;\n }\n\n // Check for Pipenv (Pipfile or Pipfile.lock)\n if (\n fs.existsSync(path.join(installDir, 'Pipfile')) ||\n fs.existsSync(path.join(installDir, 'Pipfile.lock'))\n ) {\n return PythonPackageManager.PIPENV;\n }\n\n // Check for Conda (environment.yml or environment.yaml)\n if (\n fs.existsSync(path.join(installDir, 'environment.yml')) ||\n fs.existsSync(path.join(installDir, 'environment.yaml'))\n ) {\n return PythonPackageManager.CONDA;\n }\n\n // Check for pip (requirements.txt, setup.py, setup.cfg, or pyproject.toml)\n if (\n fs.existsSync(path.join(installDir, 'requirements.txt')) ||\n fs.existsSync(path.join(installDir, 'setup.py')) ||\n fs.existsSync(path.join(installDir, 'setup.cfg')) ||\n fs.existsSync(path.join(installDir, 'pyproject.toml'))\n ) {\n return PythonPackageManager.PIP;\n }\n\n // Check for requirements directory\n try {\n const requirementsDir = path.join(installDir, 'requirements');\n if (\n fs.existsSync(requirementsDir) &&\n fs.statSync(requirementsDir).isDirectory()\n ) {\n const files = fs.readdirSync(requirementsDir);\n if (files.some((f) => f.endsWith('.txt'))) {\n return PythonPackageManager.PIP;\n }\n }\n } catch {\n // Continue\n }\n\n return PythonPackageManager.UNKNOWN;\n}\n\n/**\n * Get package manager display name\n */\nexport function getPackageManagerName(\n packageManager: PythonPackageManager,\n): string {\n switch (packageManager) {\n case PythonPackageManager.UV:\n return 'uv';\n case PythonPackageManager.POETRY:\n return 'Poetry';\n case PythonPackageManager.PDM:\n return 'PDM';\n case PythonPackageManager.HATCH:\n return 'Hatch';\n case PythonPackageManager.RYE:\n return 'Rye';\n case PythonPackageManager.PIPENV:\n return 'Pipenv';\n case PythonPackageManager.CONDA:\n return 'Conda';\n case PythonPackageManager.PIP:\n return 'pip';\n case PythonPackageManager.UNKNOWN:\n return 'unknown';\n }\n}\n","/**\n * Cross-ecosystem package manager detection.\n *\n * Provides a common interface (PackageManagerDetector) that each FrameworkConfig\n * implements, plus shared helpers for Node.js, Python, PHP, and Swift ecosystems.\n * The MCP tool in wizard-tools.ts delegates to whatever detector the\n * current framework supplies.\n */\n\nimport {\n detectAllPackageManagers,\n type PackageManager,\n} from '@utils/package-manager';\nimport {\n detectPackageManager as detectPythonPM,\n PythonPackageManager,\n} from '@frameworks/python/utils';\n\n// ---------------------------------------------------------------------------\n// Common types\n// ---------------------------------------------------------------------------\n\n/** Structured package manager info the agent can act on */\nexport interface DetectedPackageManager {\n name: string;\n label: string;\n installCommand: string;\n runCommand?: string;\n}\n\n/** Result returned by every detector */\nexport interface PackageManagerInfo {\n detected: DetectedPackageManager[];\n primary: DetectedPackageManager | null;\n recommendation: string;\n}\n\n/** Signature each framework implements */\nexport type PackageManagerDetector = (\n installDir: string,\n) => Promise<PackageManagerInfo>;\n\n// ---------------------------------------------------------------------------\n// Node.js helper\n// ---------------------------------------------------------------------------\n\nfunction serializeNodePM(pm: PackageManager): DetectedPackageManager {\n return {\n name: pm.name,\n label: pm.label,\n installCommand: pm.installCommand,\n runCommand: pm.runScriptCommand,\n };\n}\n\n/**\n * Detect Node.js package managers via lockfiles.\n * Wraps the existing detectAllPackageManagers() from utils/package-manager.ts.\n */\nexport function detectNodePackageManagers(\n installDir: string,\n): Promise<PackageManagerInfo> {\n const detected = detectAllPackageManagers({ installDir }).map(\n serializeNodePM,\n );\n\n if (detected.length === 0) {\n return Promise.resolve({\n detected: [],\n primary: null,\n recommendation: 'No lockfile found. Default to npm (npm add, npm run).',\n });\n }\n\n const primary = detected[0];\n return Promise.resolve({\n detected,\n primary,\n recommendation:\n detected.length === 1\n ? `Use ${primary.label} (${primary.installCommand}).`\n : `Multiple package managers detected. Prefer ${primary.label} (${primary.installCommand}).`,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Python helper\n// ---------------------------------------------------------------------------\n\nconst PYTHON_PM_INFO: Record<PythonPackageManager, DetectedPackageManager> = {\n [PythonPackageManager.UV]: {\n name: 'uv',\n label: 'uv',\n installCommand: 'uv add',\n runCommand: 'uv run',\n },\n [PythonPackageManager.POETRY]: {\n name: 'poetry',\n label: 'Poetry',\n installCommand: 'poetry add',\n runCommand: 'poetry run',\n },\n [PythonPackageManager.PDM]: {\n name: 'pdm',\n label: 'PDM',\n installCommand: 'pdm add',\n runCommand: 'pdm run',\n },\n [PythonPackageManager.HATCH]: {\n name: 'hatch',\n label: 'Hatch',\n installCommand: 'hatch add',\n runCommand: 'hatch run',\n },\n [PythonPackageManager.RYE]: {\n name: 'rye',\n label: 'Rye',\n installCommand: 'rye add',\n runCommand: 'rye run',\n },\n [PythonPackageManager.PIPENV]: {\n name: 'pipenv',\n label: 'Pipenv',\n installCommand: 'pipenv install',\n runCommand: 'pipenv run',\n },\n [PythonPackageManager.CONDA]: {\n name: 'conda',\n label: 'Conda',\n installCommand: 'conda install',\n runCommand: 'conda run',\n },\n [PythonPackageManager.PIP]: {\n name: 'pip',\n label: 'pip',\n installCommand: 'pip install',\n },\n [PythonPackageManager.UNKNOWN]: {\n name: 'pip',\n label: 'pip (default)',\n installCommand: 'pip install',\n },\n};\n\n/**\n * Detect Python package managers via lockfiles and config files.\n * Wraps the existing detectPackageManager() from python/utils.ts.\n */\nexport async function detectPythonPackageManagers(\n installDir: string,\n): Promise<PackageManagerInfo> {\n const pm = await detectPythonPM({ installDir } as any);\n const info = PYTHON_PM_INFO[pm];\n\n return {\n detected: [info],\n primary: info,\n recommendation: `Use ${info.label} (${info.installCommand}).`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// PHP (Composer) helper\n// ---------------------------------------------------------------------------\n\nconst COMPOSER: DetectedPackageManager = {\n name: 'composer',\n label: 'Composer',\n installCommand: 'composer require',\n};\n\nexport function composerPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [COMPOSER],\n primary: COMPOSER,\n recommendation: 'Use Composer (composer require).',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Swift (SPM) helper\n// ---------------------------------------------------------------------------\n\nconst SPM: DetectedPackageManager = {\n name: 'spm',\n label: 'Swift Package Manager',\n installCommand: 'swift package add-dependency',\n};\n\nexport function swiftPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [SPM],\n primary: SPM,\n recommendation:\n 'Use Swift Package Manager. Add the dependency to Package.swift or via Xcode.',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Ruby (Bundler) helper\n// ---------------------------------------------------------------------------\n\nconst BUNDLER: DetectedPackageManager = {\n name: 'bundler',\n label: 'Bundler',\n installCommand: 'bundle add',\n runCommand: 'bundle exec',\n};\n\nexport function bundlerPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [BUNDLER],\n primary: BUNDLER,\n recommendation: 'Use Bundler (bundle add). Run commands with bundle exec.',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Android (Gradle) helper\n// ---------------------------------------------------------------------------\n\nconst GRADLE: DetectedPackageManager = {\n name: 'gradle',\n label: 'Gradle',\n installCommand: 'implementation',\n};\n\nexport function gradlePackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [GRADLE],\n primary: GRADLE,\n recommendation:\n 'Add dependencies to build.gradle(.kts) using implementation().',\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"package-manager-Dma9-zGs.js","names":["detectPythonPM"],"sources":["../src/frameworks/python/utils.ts","../src/lib/detection/package-manager.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport type { WizardRunOptions } from '@utils/types';\n\nexport enum PythonPackageManager {\n UV = 'uv',\n POETRY = 'poetry',\n PDM = 'pdm',\n HATCH = 'hatch',\n RYE = 'rye',\n PIPENV = 'pipenv',\n CONDA = 'conda',\n PIP = 'pip',\n UNKNOWN = 'unknown',\n}\n\n/**\n * Get the installed Python version\n */\nexport function getPythonVersion(\n options: WizardRunOptions,\n): string | undefined {\n try {\n const version = execSync('python --version || python3 --version', {\n cwd: options.installDir,\n encoding: 'utf-8',\n })\n .trim()\n .replace('Python ', '');\n return version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Bucket Python version for analytics (e.g., \"3.11.x\" -> \"3.11\")\n */\nexport function getPythonVersionBucket(version: string): string {\n const match = version.match(/^(\\d+\\.\\d+)/);\n return match ? match[1] : version;\n}\n\n/**\n * Detect which package manager the project uses\n */\nexport async function detectPackageManager(\n options: WizardRunOptions,\n): Promise<PythonPackageManager> {\n const { installDir } = options;\n const fs = await import('node:fs');\n const path = await import('node:path');\n\n // Check for uv (uv.lock)\n if (fs.existsSync(path.join(installDir, 'uv.lock'))) {\n return PythonPackageManager.UV;\n }\n\n // Check pyproject.toml for various tools\n if (fs.existsSync(path.join(installDir, 'pyproject.toml'))) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, 'pyproject.toml'),\n 'utf-8',\n );\n\n // Check for Poetry\n if (content.includes('[tool.poetry]')) {\n return PythonPackageManager.POETRY;\n }\n\n // Check for PDM\n if (content.includes('[tool.pdm]')) {\n return PythonPackageManager.PDM;\n }\n\n // Check for Hatch\n if (content.includes('[tool.hatch]')) {\n return PythonPackageManager.HATCH;\n }\n\n // Check for Rye\n if (content.includes('[tool.rye]')) {\n return PythonPackageManager.RYE;\n }\n } catch {\n // Continue checking\n }\n }\n\n // Check for Poetry lock file\n if (fs.existsSync(path.join(installDir, 'poetry.lock'))) {\n return PythonPackageManager.POETRY;\n }\n\n // Check for PDM lock file\n if (fs.existsSync(path.join(installDir, 'pdm.lock'))) {\n return PythonPackageManager.PDM;\n }\n\n // Check for Pipenv (Pipfile or Pipfile.lock)\n if (\n fs.existsSync(path.join(installDir, 'Pipfile')) ||\n fs.existsSync(path.join(installDir, 'Pipfile.lock'))\n ) {\n return PythonPackageManager.PIPENV;\n }\n\n // Check for Conda (environment.yml or environment.yaml)\n if (\n fs.existsSync(path.join(installDir, 'environment.yml')) ||\n fs.existsSync(path.join(installDir, 'environment.yaml'))\n ) {\n return PythonPackageManager.CONDA;\n }\n\n // Check for pip (requirements.txt, setup.py, setup.cfg, or pyproject.toml)\n if (\n fs.existsSync(path.join(installDir, 'requirements.txt')) ||\n fs.existsSync(path.join(installDir, 'setup.py')) ||\n fs.existsSync(path.join(installDir, 'setup.cfg')) ||\n fs.existsSync(path.join(installDir, 'pyproject.toml'))\n ) {\n return PythonPackageManager.PIP;\n }\n\n // Check for requirements directory\n try {\n const requirementsDir = path.join(installDir, 'requirements');\n if (\n fs.existsSync(requirementsDir) &&\n fs.statSync(requirementsDir).isDirectory()\n ) {\n const files = fs.readdirSync(requirementsDir);\n if (files.some((f) => f.endsWith('.txt'))) {\n return PythonPackageManager.PIP;\n }\n }\n } catch {\n // Continue\n }\n\n return PythonPackageManager.UNKNOWN;\n}\n\n/**\n * Get package manager display name\n */\nexport function getPackageManagerName(\n packageManager: PythonPackageManager,\n): string {\n switch (packageManager) {\n case PythonPackageManager.UV:\n return 'uv';\n case PythonPackageManager.POETRY:\n return 'Poetry';\n case PythonPackageManager.PDM:\n return 'PDM';\n case PythonPackageManager.HATCH:\n return 'Hatch';\n case PythonPackageManager.RYE:\n return 'Rye';\n case PythonPackageManager.PIPENV:\n return 'Pipenv';\n case PythonPackageManager.CONDA:\n return 'Conda';\n case PythonPackageManager.PIP:\n return 'pip';\n case PythonPackageManager.UNKNOWN:\n return 'unknown';\n }\n}\n","/**\n * Cross-ecosystem package manager detection.\n *\n * Provides a common interface (PackageManagerDetector) that each FrameworkConfig\n * implements, plus shared helpers for Node.js, Python, PHP, and Swift ecosystems.\n * The MCP tool in wizard-tools.ts delegates to whatever detector the\n * current framework supplies.\n */\n\nimport {\n detectAllPackageManagers,\n type PackageManager,\n} from '@utils/package-manager';\nimport {\n detectPackageManager as detectPythonPM,\n PythonPackageManager,\n} from '@frameworks/python/utils';\n\n// ---------------------------------------------------------------------------\n// Common types\n// ---------------------------------------------------------------------------\n\n/** Structured package manager info the agent can act on */\nexport interface DetectedPackageManager {\n name: string;\n label: string;\n installCommand: string;\n runCommand?: string;\n}\n\n/** Result returned by every detector */\nexport interface PackageManagerInfo {\n detected: DetectedPackageManager[];\n primary: DetectedPackageManager | null;\n recommendation: string;\n}\n\n/** Signature each framework implements */\nexport type PackageManagerDetector = (\n installDir: string,\n) => Promise<PackageManagerInfo>;\n\n// ---------------------------------------------------------------------------\n// Node.js helper\n// ---------------------------------------------------------------------------\n\nfunction serializeNodePM(pm: PackageManager): DetectedPackageManager {\n return {\n name: pm.name,\n label: pm.label,\n installCommand: pm.installCommand,\n runCommand: pm.runScriptCommand,\n };\n}\n\n/**\n * Detect Node.js package managers via lockfiles.\n * Wraps the existing detectAllPackageManagers() from utils/package-manager.ts.\n */\nexport function detectNodePackageManagers(\n installDir: string,\n): Promise<PackageManagerInfo> {\n const detected = detectAllPackageManagers({ installDir }).map(\n serializeNodePM,\n );\n\n if (detected.length === 0) {\n return Promise.resolve({\n detected: [],\n primary: null,\n recommendation: 'No lockfile found. Default to npm (npm add, npm run).',\n });\n }\n\n const primary = detected[0];\n return Promise.resolve({\n detected,\n primary,\n recommendation:\n detected.length === 1\n ? `Use ${primary.label} (${primary.installCommand}).`\n : `Multiple package managers detected. Prefer ${primary.label} (${primary.installCommand}).`,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Python helper\n// ---------------------------------------------------------------------------\n\nconst PYTHON_PM_INFO: Record<PythonPackageManager, DetectedPackageManager> = {\n [PythonPackageManager.UV]: {\n name: 'uv',\n label: 'uv',\n installCommand: 'uv add',\n runCommand: 'uv run',\n },\n [PythonPackageManager.POETRY]: {\n name: 'poetry',\n label: 'Poetry',\n installCommand: 'poetry add',\n runCommand: 'poetry run',\n },\n [PythonPackageManager.PDM]: {\n name: 'pdm',\n label: 'PDM',\n installCommand: 'pdm add',\n runCommand: 'pdm run',\n },\n [PythonPackageManager.HATCH]: {\n name: 'hatch',\n label: 'Hatch',\n installCommand: 'hatch add',\n runCommand: 'hatch run',\n },\n [PythonPackageManager.RYE]: {\n name: 'rye',\n label: 'Rye',\n installCommand: 'rye add',\n runCommand: 'rye run',\n },\n [PythonPackageManager.PIPENV]: {\n name: 'pipenv',\n label: 'Pipenv',\n installCommand: 'pipenv install',\n runCommand: 'pipenv run',\n },\n [PythonPackageManager.CONDA]: {\n name: 'conda',\n label: 'Conda',\n installCommand: 'conda install',\n runCommand: 'conda run',\n },\n [PythonPackageManager.PIP]: {\n name: 'pip',\n label: 'pip',\n installCommand: 'pip install',\n },\n [PythonPackageManager.UNKNOWN]: {\n name: 'pip',\n label: 'pip (default)',\n installCommand: 'pip install',\n },\n};\n\n/**\n * Detect Python package managers via lockfiles and config files.\n * Wraps the existing detectPackageManager() from python/utils.ts.\n */\nexport async function detectPythonPackageManagers(\n installDir: string,\n): Promise<PackageManagerInfo> {\n const pm = await detectPythonPM({ installDir } as any);\n const info = PYTHON_PM_INFO[pm];\n\n return {\n detected: [info],\n primary: info,\n recommendation: `Use ${info.label} (${info.installCommand}).`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// PHP (Composer) helper\n// ---------------------------------------------------------------------------\n\nconst COMPOSER: DetectedPackageManager = {\n name: 'composer',\n label: 'Composer',\n installCommand: 'composer require',\n};\n\nexport function composerPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [COMPOSER],\n primary: COMPOSER,\n recommendation: 'Use Composer (composer require).',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Swift (SPM) helper\n// ---------------------------------------------------------------------------\n\nconst SPM: DetectedPackageManager = {\n name: 'spm',\n label: 'Swift Package Manager',\n installCommand: 'swift package add-dependency',\n};\n\nexport function swiftPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [SPM],\n primary: SPM,\n recommendation:\n 'Use Swift Package Manager. Add the dependency to Package.swift or via Xcode.',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Ruby (Bundler) helper\n// ---------------------------------------------------------------------------\n\nconst BUNDLER: DetectedPackageManager = {\n name: 'bundler',\n label: 'Bundler',\n installCommand: 'bundle add',\n runCommand: 'bundle exec',\n};\n\nexport function bundlerPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [BUNDLER],\n primary: BUNDLER,\n recommendation: 'Use Bundler (bundle add). Run commands with bundle exec.',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Android (Gradle) helper\n// ---------------------------------------------------------------------------\n\nconst GRADLE: DetectedPackageManager = {\n name: 'gradle',\n label: 'Gradle',\n installCommand: 'implementation',\n};\n\nexport function gradlePackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [GRADLE],\n primary: GRADLE,\n recommendation:\n 'Add dependencies to build.gradle(.kts) using implementation().',\n });\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { et as VERSION, l as WIZARD_LOG_FILE, y as getBlockingServiceKeys } from "./debug-BwC7UkGH.js";
1
+ import { et as VERSION, l as WIZARD_LOG_FILE, y as getBlockingServiceKeys } from "./debug-BizeRFR0.js";
2
2
  import "./wizard-ui-WZ48rUgr.js";
3
- import { f as Colors, p as Icons } from "./posthog-integration-BL8-vC0V.js";
4
- import { c as PROGRAM_REGISTRY, p as getContentBlocks, t as PickerMenu } from "./bin.js";
5
- import { A as SplitView, C as LogViewer, E as GroupedPickerMenu, M as WizardStore, O as ProgressList, S as EventPlanViewer, T as ConfirmationInput, _ as LearnCard, a as SlackConnectScreen, b as TabContainer, c as AuditChecksViewer, d as McpScreen, f as IssueTable, g as TipsCard, h as ServiceHealthList, i as OutroScreen, j as CardLayout, k as LoadingBox, l as McpSuggestedPromptsScreen, o as AUDIT_AREA_SLIDES, t as AiOptInRequiredScreen, u as TAILORED_ROLES, v as ContentSequencer, w as ModalOverlay, x as ScreenContainer, y as HNViewer } from "./AiOptInRequiredScreen-C-D9tN6r.js";
3
+ import { f as Colors, p as Icons } from "./posthog-integration-CAYZdk0r.js";
4
+ import { a as ConfirmButton, d as getProgramConfig, g as getContentBlocks, l as PROGRAM_REGISTRY, t as PickerMenu } from "./bin.js";
5
+ import { A as ConfirmationInput, C as TabContainer, E as LogViewer, F as SplitView, I as CardLayout, L as WizardStore, N as ProgressList, P as LoadingBox, S as HNViewer, T as EventPlanViewer, _ as ServiceHealthList, b as LearnCard, c as AUDIT_AREA_SLIDES, d as McpSuggestedPromptsScreen, f as TAILORED_ROLES, j as GroupedPickerMenu, k as ModalOverlay, m as IssueTable, n as releaseTerminal, o as OutroScreen, p as McpScreen, r as AiOptInRequiredScreen, s as SlackConnectScreen, t as enterDarkTerminal, u as AuditChecksViewer, v as VisualizerTab, w as ScreenContainer, x as ContentSequencer, y as TipsCard } from "./terminal-BSiupnOQ.js";
6
6
  import * as fs$1 from "fs";
7
7
  import * as path$1 from "path";
8
8
  import * as os from "os";
@@ -122,6 +122,19 @@ const LayoutDemo = () => {
122
122
  })
123
123
  })
124
124
  })
125
+ }),
126
+ /* @__PURE__ */ jsx(Box, { height: 1 }),
127
+ /* @__PURE__ */ jsx(Text, {
128
+ dimColor: true,
129
+ children: "ConfirmButton — the focusable submit target for multi-select menus (focused / unfocused):"
130
+ }),
131
+ /* @__PURE__ */ jsxs(Box, {
132
+ gap: 2,
133
+ marginTop: 1,
134
+ children: [/* @__PURE__ */ jsx(ConfirmButton, {
135
+ focused: true,
136
+ count: 3
137
+ }), /* @__PURE__ */ jsx(ConfirmButton, { focused: false })]
125
138
  })
126
139
  ]
127
140
  });
@@ -409,10 +422,27 @@ const LogDemo = () => {
409
422
  //#endregion
410
423
  //#region src/ui/tui/playground/demos/RunScreenDemo.tsx
411
424
  /**
412
- * RunScreenDemo — Renders the real RunScreen with a mock store.
413
- * Tasks auto-advance every 1.5s. Discovered features (Stripe, LLM)
414
- * are pre-populated so conditional tips appear.
425
+ * RunScreenDemo — Playground demo for the agent run view.
426
+ *
427
+ * Renders RunScreen's tab panels directly (not RunScreen itself) and owns its
428
+ * own tab navigation, the way HealthCheckDemo renders its components directly —
429
+ * a nested TabContainer would fight the playground's outer one over the arrow
430
+ * keys (Ink delivers every key to every handler), leaving the inner tabs
431
+ * unreachable. So the outer playground keeps the arrows and this demo uses:
432
+ *
433
+ * n / p switch run-screen tab (Status, Event plan, Tail logs, Visualizer, HN)
434
+ *
435
+ * Tasks auto-advance every 1.5s and the visualizer stage cycles on its own.
436
+ * Discovered features (Stripe, LLM) are pre-populated so conditional tips appear.
415
437
  */
438
+ const STAGE_CYCLE = [
439
+ "codebase-scan",
440
+ "skill-install",
441
+ "dep-install",
442
+ "code-edits",
443
+ "env-setup",
444
+ "dashboards"
445
+ ];
416
446
  const MOCK_TASKS$1 = [
417
447
  {
418
448
  label: "Checking project structure and finding files for event tracking",
@@ -420,6 +450,12 @@ const MOCK_TASKS$1 = [
420
450
  status: "pending",
421
451
  done: false
422
452
  },
453
+ {
454
+ label: "Load skill menu and install integration-nextjs-app-router skill",
455
+ activeForm: "Picking the right skill",
456
+ status: "pending",
457
+ done: false
458
+ },
423
459
  {
424
460
  label: "Verify PostHog dependencies",
425
461
  activeForm: "Verifying PostHog dependencies",
@@ -467,6 +503,18 @@ const MOCK_TASKS$1 = [
467
503
  activeForm: "Adding capture events",
468
504
  status: "pending",
469
505
  done: false
506
+ },
507
+ {
508
+ label: "Create onboarding dashboard and insight",
509
+ activeForm: "Building dashboard",
510
+ status: "pending",
511
+ done: false
512
+ },
513
+ {
514
+ label: "Verify $pageview and $autocapture are arriving",
515
+ activeForm: "Watching events arrive",
516
+ status: "pending",
517
+ done: false
470
518
  }
471
519
  ];
472
520
  const MOCK_EVENTS = [
@@ -490,6 +538,8 @@ const MOCK_EVENTS = [
490
538
  const RunScreenDemo = ({ store }) => {
491
539
  const tickRef = useRef(0);
492
540
  const lastStatusRef = useRef("");
541
+ const [activeTab, setActiveTab] = useState(0);
542
+ useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
493
543
  useEffect(() => {
494
544
  store.addDiscoveredFeature("stripe");
495
545
  store.addDiscoveredFeature("llm");
@@ -536,50 +586,95 @@ const RunScreenDemo = ({ store }) => {
536
586
  }, 1500);
537
587
  return () => clearInterval(timer);
538
588
  }, []);
539
- useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
589
+ useEffect(() => {
590
+ let i = 0;
591
+ store.setCurrentStage(STAGE_CYCLE[0]);
592
+ const timer = setInterval(() => {
593
+ i = (i + 1) % STAGE_CYCLE.length;
594
+ store.setCurrentStage(STAGE_CYCLE[i]);
595
+ }, 4e3);
596
+ return () => clearInterval(timer);
597
+ }, [store]);
540
598
  const progressItems = store.tasks.map((t) => ({
541
599
  label: t.label,
542
600
  activeForm: t.activeForm,
543
601
  status: t.status
544
602
  }));
545
- const statuses = store.statusMessages.length > 0 ? store.statusMessages : void 0;
546
- const learnBlocks = getContentBlocks(store);
547
- return /* @__PURE__ */ jsx(TabContainer, {
548
- tabs: [
549
- {
550
- id: "status",
551
- label: "Status",
552
- component: /* @__PURE__ */ jsx(SplitView, {
553
- left: store.learnCardComplete ? /* @__PURE__ */ jsx(TipsCard, { store }) : /* @__PURE__ */ jsx(LearnCard, {
554
- store,
555
- blocks: learnBlocks,
556
- onComplete: () => store.setLearnCardComplete()
557
- }),
558
- right: /* @__PURE__ */ jsx(ProgressList, {
559
- items: progressItems,
560
- title: "Tasks"
561
- })
603
+ const learnBlocks = useMemo(() => {
604
+ return (getProgramConfig(store.router.activeProgram).getContentBlocks ?? getContentBlocks)(store);
605
+ }, [store]);
606
+ const tabs = [
607
+ {
608
+ id: "status",
609
+ label: "Status",
610
+ component: /* @__PURE__ */ jsx(SplitView, {
611
+ left: store.learnCardComplete ? /* @__PURE__ */ jsx(TipsCard, { store }) : /* @__PURE__ */ jsx(LearnCard, {
612
+ store,
613
+ blocks: learnBlocks,
614
+ onComplete: () => store.setLearnCardComplete()
615
+ }),
616
+ right: /* @__PURE__ */ jsx(ProgressList, {
617
+ items: progressItems,
618
+ title: "Tasks"
562
619
  })
563
- },
564
- ...store.eventPlan.length > 0 ? [{
565
- id: "events",
566
- label: "Event plan",
567
- component: /* @__PURE__ */ jsx(EventPlanViewer, { events: store.eventPlan })
568
- }] : [],
569
- {
570
- id: "logs",
571
- label: "Tail logs",
572
- component: /* @__PURE__ */ jsx(LogViewer, { filePath: WIZARD_LOG_FILE })
573
- },
574
- {
575
- id: "hn",
576
- label: "HN",
577
- component: /* @__PURE__ */ jsx(HNViewer, {})
578
- }
579
- ],
580
- statusMessage: statuses,
581
- expandableStatus: true,
582
- store
620
+ })
621
+ },
622
+ ...store.eventPlan.length > 0 ? [{
623
+ id: "events",
624
+ label: "Event plan",
625
+ component: /* @__PURE__ */ jsx(EventPlanViewer, { events: store.eventPlan })
626
+ }] : [],
627
+ {
628
+ id: "logs",
629
+ label: "Tail logs",
630
+ component: /* @__PURE__ */ jsx(LogViewer, { filePath: WIZARD_LOG_FILE })
631
+ },
632
+ {
633
+ id: "visualizer",
634
+ label: "Visualizer",
635
+ component: /* @__PURE__ */ jsx(VisualizerTab, { store })
636
+ },
637
+ {
638
+ id: "hn",
639
+ label: "HN",
640
+ component: /* @__PURE__ */ jsx(HNViewer, {})
641
+ }
642
+ ];
643
+ useInput((input) => {
644
+ if (input === "n") setActiveTab((i) => Math.min(tabs.length - 1, i + 1));
645
+ else if (input === "p") setActiveTab((i) => Math.max(0, i - 1));
646
+ });
647
+ const current = tabs[Math.min(activeTab, tabs.length - 1)];
648
+ return /* @__PURE__ */ jsxs(Box, {
649
+ flexDirection: "column",
650
+ flexGrow: 1,
651
+ children: [
652
+ /* @__PURE__ */ jsx(Box, {
653
+ flexDirection: "column",
654
+ flexGrow: 1,
655
+ flexShrink: 1,
656
+ overflow: "hidden",
657
+ children: current?.component
658
+ }),
659
+ /* @__PURE__ */ jsx(Box, { height: 1 }),
660
+ /* @__PURE__ */ jsx(Box, {
661
+ gap: 1,
662
+ paddingX: 1,
663
+ children: tabs.map((tab, i) => /* @__PURE__ */ jsx(Text, {
664
+ inverse: i === activeTab,
665
+ color: i === activeTab ? Colors.accent : Colors.muted,
666
+ bold: i === activeTab,
667
+ children: ` ${tab.label} `
668
+ }, tab.id))
669
+ }),
670
+ /* @__PURE__ */ jsx(Box, {
671
+ paddingX: 1,
672
+ children: /* @__PURE__ */ jsx(Text, {
673
+ dimColor: true,
674
+ children: "n/p switch tab"
675
+ })
676
+ })
677
+ ]
583
678
  });
584
679
  };
585
680
  //#endregion
@@ -1163,8 +1258,8 @@ const McpSuggestedPromptsDemo = ({ store }) => {
1163
1258
  */
1164
1259
  const STEP_LABELS = {
1165
1260
  ["single"]: "Single Select — hints: ↑↓ navigate, enter select",
1166
- ["multi"]: "Multi Select — hints: ↑↓ navigate, space toggle, enter confirm",
1167
- ["grouped"]: "Grouped Select — hints: ↑↓ navigate, space toggle, a toggle all, enter confirm",
1261
+ ["multi"]: "Multi Select — hints: ↑↓ navigate, enter select, arrow to Confirm + enter to submit",
1262
+ ["grouped"]: "Grouped Select — hints: ↑↓ navigate, enter select, a toggle all, arrow to Confirm + enter to submit",
1168
1263
  ["confirm"]: "Confirmation — hints: ←→ switch, enter confirm, esc cancel",
1169
1264
  ["done"]: "Done"
1170
1265
  };
@@ -1935,6 +2030,7 @@ const PlaygroundApp = ({ store }) => {
1935
2030
  * start-playground.ts — Launches the TUI primitives playground.
1936
2031
  */
1937
2032
  function startPlayground(version) {
2033
+ enterDarkTerminal();
1938
2034
  const store = new WizardStore();
1939
2035
  store.version = version;
1940
2036
  store.setReadinessResult({
@@ -1952,6 +2048,7 @@ function startPlayground(version) {
1952
2048
  const { unmount, waitUntilExit } = render(createElement(PlaygroundApp, { store }));
1953
2049
  waitUntilExit().then(() => {
1954
2050
  unmount();
2051
+ releaseTerminal();
1955
2052
  process.exit(0);
1956
2053
  });
1957
2054
  }
@@ -1964,4 +2061,4 @@ function runPlayground() {
1964
2061
  //#endregion
1965
2062
  export { runPlayground };
1966
2063
 
1967
- //# sourceMappingURL=playground-C-lpKoKC.js.map
2064
+ //# sourceMappingURL=playground-Cwe0Q9HW.js.map