autotel-cli 0.4.0 → 0.4.2
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.
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -3035,6 +3035,7 @@ function transformFile(content, filePath, options) {
|
|
|
3035
3035
|
const onlyDefaultExportFn = defaultFn && allFns.length === 1 && (allFns[0] === defaultFn || allFns[0].getStart() === defaultFn.getStart());
|
|
3036
3036
|
for (const fn of allFns) {
|
|
3037
3037
|
if (onlyDefaultExportFn) continue;
|
|
3038
|
+
if (defaultFn && fn === defaultFn) continue;
|
|
3038
3039
|
if (isInsideTraceCall(fn)) continue;
|
|
3039
3040
|
const name = fn.getName();
|
|
3040
3041
|
if (!name) continue;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/lib/project.ts","../src/lib/fs.ts","../src/lib/package-manager.ts","../src/lib/config-detector.ts","../src/lib/code-builder.ts","../src/lib/env-generator.ts","../src/lib/dependency-planner.ts","../src/presets/backends/datadog.ts","../src/presets/backends/honeycomb.ts","../src/presets/backends/otlp.ts","../src/presets/subscribers/posthog.ts","../src/presets/subscribers/mixpanel.ts","../src/presets/plugins/mongoose.ts","../src/presets/platforms/aws.ts","../src/presets/index.ts","../src/ui/prompts.ts","../src/ui/output.ts","../src/ui/spinner.ts","../src/lib/dependency-auditor.ts","../src/lib/esm-checker.ts","../src/lib/logger-checker.ts","../src/commands/doctor.ts","../src/commands/add.ts","../src/commands/codemod-trace.ts","../src/lib/codemod-trace.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport type { InitOptions, DoctorOptions, AddOptions, CodemodTraceOptions } from './types/index';\nimport { runInit } from './commands/init';\nimport { runDoctor } from './commands/doctor';\nimport { runAdd } from './commands/add';\nimport { runCodemodTrace } from './commands/codemod-trace';\n\n/**\n * Create the CLI program\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('autotel')\n .description('CLI for autotel - setup wizard, diagnostics, and incremental features')\n .version('0.1.0');\n\n // Global options\n const addGlobalOptions = (cmd: Command): Command => {\n return cmd\n .option('--cwd <path>', 'Target directory', process.cwd())\n .option('--verbose', 'Show detailed output')\n .option('--quiet', 'Only show warnings and errors');\n };\n\n // Init command\n const initCmd = new Command('init')\n .description('Initialize autotel in your project')\n .option('--dry-run', 'Skip installation and print what would be done')\n .option('--no-install', 'Generate files only, skip package installation')\n .option('--print-install-cmd', 'Output the install command without running it')\n .option('-y, --yes', 'Accept defaults, non-interactive')\n .option('--preset <name>', 'Use a quick preset (e.g., node-datadog-pino)')\n .option('--force', 'Overwrite existing config (creates backup first)')\n .option('--workspace-root', 'Install at workspace root instead of package root')\n .action(async (opts) => {\n const options: InitOptions = {\n cwd: opts.cwd ?? process.cwd(),\n dryRun: opts.dryRun ?? false,\n noInstall: opts.noInstall ?? false,\n printInstallCmd: opts.printInstallCmd ?? false,\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n workspaceRoot: opts.workspaceRoot ?? false,\n yes: opts.yes ?? false,\n preset: opts.preset,\n force: opts.force ?? false,\n };\n\n // --dry-run implies --no-install and --print-install-cmd\n if (options.dryRun) {\n options.noInstall = true;\n options.printInstallCmd = true;\n }\n\n await runInit(options);\n });\n\n addGlobalOptions(initCmd);\n program.addCommand(initCmd);\n\n // Doctor command\n const doctorCmd = new Command('doctor')\n .description('Run diagnostics on your autotel setup')\n .option('--json', 'Output machine-readable JSON')\n .option('--fix', 'Auto-fix resolvable issues')\n .option('--list-checks', 'List all available checks')\n .option('--env-file <path>', 'Specify env file to check')\n .action(async (opts) => {\n const options: DoctorOptions = {\n cwd: opts.cwd ?? process.cwd(),\n dryRun: false,\n noInstall: false,\n printInstallCmd: false,\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n workspaceRoot: false,\n json: opts.json ?? false,\n fix: opts.fix ?? false,\n listChecks: opts.listChecks ?? false,\n envFile: opts.envFile,\n };\n\n await runDoctor(options);\n });\n\n addGlobalOptions(doctorCmd);\n program.addCommand(doctorCmd);\n\n // Add command\n const addCmd = new Command('add')\n .description('Add a backend, subscriber, plugin, or platform')\n .argument('[type]', 'Preset type (backend, subscriber, plugin, platform)')\n .argument('[name]', 'Preset name (e.g., datadog, posthog, mongoose)')\n .option('--list', 'List available presets for the given type')\n .option('--dry-run', 'Skip installation and print what would be done')\n .option('--no-install', 'Generate files only, skip package installation')\n .option('--print-install-cmd', 'Output the install command without running it')\n .option('-y, --yes', 'Accept defaults, non-interactive')\n .option('--force', 'Overwrite non-CLI-owned config (creates backup first)')\n .option('--json', 'Output machine-readable JSON (for --list)')\n .option('--workspace-root', 'Install at workspace root instead of package root')\n .action(async (type, name, opts) => {\n const options: AddOptions = {\n cwd: opts.cwd ?? process.cwd(),\n dryRun: opts.dryRun ?? false,\n noInstall: opts.noInstall ?? false,\n printInstallCmd: opts.printInstallCmd ?? false,\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n workspaceRoot: opts.workspaceRoot ?? false,\n list: opts.list ?? false,\n yes: opts.yes ?? false,\n force: opts.force ?? false,\n json: opts.json ?? false,\n };\n\n // --dry-run implies --no-install and --print-install-cmd\n if (options.dryRun) {\n options.noInstall = true;\n options.printInstallCmd = true;\n }\n\n await runAdd(type, name, options);\n });\n\n addGlobalOptions(addCmd);\n program.addCommand(addCmd);\n\n // Codemod command\n const codemodCmd = new Command('codemod')\n .description('Codemod commands for adopting autotel');\n const traceCmd = new Command('trace')\n .description('Wrap functions in trace() with span name from function/variable/method name')\n .argument('<path>', 'File path or glob (e.g. src/index.ts, src/**/*.ts)')\n .option('--dry-run', 'Print changes without writing files')\n .option('--name-pattern <pattern>', 'Span name template: {name}, {file}, {path}')\n .option('--skip <regex>...', 'Skip functions whose name matches (repeatable)')\n .option('--print-files', 'Print per-file summary (wrapped count, skipped)')\n .action(async (pathArg: string, opts) => {\n const options: CodemodTraceOptions = {\n cwd: opts.cwd ?? process.cwd(),\n dryRun: opts.dryRun ?? false,\n noInstall: false,\n printInstallCmd: false,\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n workspaceRoot: false,\n path: pathArg,\n namePattern: opts.namePattern,\n skip: Array.isArray(opts.skip) && opts.skip.length > 0 ? opts.skip : undefined,\n printFiles: opts.printFiles ?? false,\n };\n await runCodemodTrace(options);\n });\n addGlobalOptions(traceCmd);\n codemodCmd.addCommand(traceCmd);\n addGlobalOptions(codemodCmd);\n program.addCommand(codemodCmd);\n\n return program;\n}\n\n/**\n * Run the CLI\n */\nexport async function run(): Promise<void> {\n const program = createProgram();\n await program.parseAsync(process.argv);\n}\n","import * as path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport type { InitOptions, Preset, EnvVar } from '../types/index';\nimport { discoverProject, getInstrumentationPath } from '../lib/project';\nimport { getInstallCommand } from '../lib/package-manager';\nimport { detectConfig } from '../lib/config-detector';\nimport {\n createCodeFile,\n addImport,\n setBackendConfig,\n addSubscriberConfig,\n addPluginInit,\n renderCodeFile,\n} from '../lib/code-builder';\nimport { generateEnvExample } from '../lib/env-generator';\nimport { atomicWrite, fileExists } from '../lib/fs';\nimport {\n buildDependencyPlan,\n getProdPackages,\n getDevPackages,\n} from '../lib/dependency-planner';\nimport {\n backends,\n subscribers,\n plugins,\n getQuickPreset,\n getPreset,\n} from '../presets/index';\nimport {\n promptRuntime,\n promptBackend,\n promptLogging,\n promptDatabases,\n promptSubscribers,\n promptAutoInstrumentation,\n promptStartupStyle,\n promptExistingConfigAction,\n} from '../ui/prompts';\nimport * as output from '../ui/output';\nimport { createSpinner, isCI } from '../ui/spinner';\n\n/**\n * Run the init command\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const spinner = createSpinner();\n\n // Set output mode\n if (options.verbose) {\n process.env['AUTOTEL_VERBOSE'] = 'true';\n }\n if (options.quiet) {\n process.env['AUTOTEL_QUIET'] = 'true';\n }\n\n // Discover project\n spinner.start('Discovering project...');\n const project = discoverProject(options.cwd);\n\n if (!project) {\n spinner.fail('No package.json found');\n output.error('Run this command in a directory with a package.json, or use --cwd');\n process.exit(1);\n }\n\n spinner.succeed(`Found ${project.packageJson.name ?? 'project'}`);\n output.verbose(`Package root: ${project.packageRoot}`);\n output.verbose(`Package manager: ${project.packageManager}`);\n\n // Check for existing config\n const existingConfig = detectConfig(project.packageRoot);\n\n if (existingConfig.found && !options.force) {\n output.info(`Existing instrumentation detected at ${existingConfig.path}`);\n\n if (options.yes || isCI()) {\n output.warn('Use --force to overwrite existing config');\n process.exit(0);\n }\n\n const action = await promptExistingConfigAction();\n if (action === 'abort') {\n output.info('Aborted');\n process.exit(0);\n }\n // For 'update' or 'new', continue with the flow\n }\n\n // Determine selections\n const selectedPresets: Preset[] = [];\n let autoInstrumentations: 'all' | 'none' | string[] = 'all';\n let startupStyle = 'node-esm';\n\n // Check for quick preset\n if (options.preset) {\n const quickPreset = getQuickPreset(options.preset);\n if (quickPreset) {\n output.info(`Using quick preset: ${quickPreset.name}`);\n const backendPreset = getPreset('backend', quickPreset.backend);\n if (backendPreset) {\n selectedPresets.push(backendPreset);\n }\n if (quickPreset.subscribers) {\n for (const sub of quickPreset.subscribers) {\n const subPreset = getPreset('subscriber', sub);\n if (subPreset) selectedPresets.push(subPreset);\n }\n }\n if (quickPreset.plugins) {\n for (const plug of quickPreset.plugins) {\n const plugPreset = getPreset('plugin', plug);\n if (plugPreset) selectedPresets.push(plugPreset);\n }\n }\n autoInstrumentations = quickPreset.autoInstrumentations;\n } else {\n output.error(`Unknown preset: ${options.preset}`);\n output.info('Available presets: node-datadog-pino, node-datadog-agent, node-honeycomb, node-otlp');\n process.exit(1);\n }\n } else if (options.yes || isCI()) {\n // Default profile for --yes\n output.info('Using defaults (local backend, all auto-instrumentations)');\n const localPreset = getPreset('backend', 'local');\n if (localPreset) {\n selectedPresets.push(localPreset);\n }\n } else {\n // Interactive prompts\n const runtime = await promptRuntime();\n output.verbose(`Runtime: ${runtime}`);\n\n // Backend\n const backendSlug = await promptBackend(backends);\n const backendPreset = getPreset('backend', backendSlug);\n if (backendPreset) {\n selectedPresets.push(backendPreset);\n }\n\n // Logging (future enhancement - not fully implemented)\n await promptLogging();\n\n // Databases/Plugins\n const pluginSlugs = await promptDatabases(plugins);\n for (const slug of pluginSlugs) {\n const preset = getPreset('plugin', slug);\n if (preset) selectedPresets.push(preset);\n }\n\n // Subscribers\n const subscriberSlugs = await promptSubscribers(subscribers);\n for (const slug of subscriberSlugs) {\n const preset = getPreset('subscriber', slug);\n if (preset) selectedPresets.push(preset);\n }\n\n // Auto-instrumentation\n const autoChoice = await promptAutoInstrumentation();\n if (autoChoice === 'none') {\n autoInstrumentations = 'none';\n } else if (autoChoice === 'specific') {\n // For now, just use all - specific selection would need another prompt\n autoInstrumentations = 'all';\n }\n\n // Startup style\n if (runtime === 'node') {\n startupStyle = await promptStartupStyle(project.hasTypeScript);\n }\n }\n\n // Build code file\n const codeFile = createCodeFile();\n\n // Add core imports\n addImport(codeFile, { source: 'autotel/register', sideEffect: true });\n addImport(codeFile, { source: 'autotel', specifiers: ['init'] });\n\n // Add preset imports and config\n for (const preset of selectedPresets) {\n for (const imp of preset.imports) {\n const section = preset.type === 'backend' || preset.type === 'platform' ? 'backend' :\n preset.type === 'plugin' ? 'plugin' :\n preset.type === 'subscriber' ? 'subscriber' : undefined;\n addImport(codeFile, imp, section);\n }\n\n if (preset.configBlock.section === 'BACKEND_CONFIG') {\n setBackendConfig(codeFile, preset.configBlock.code);\n } else if (preset.configBlock.section === 'SUBSCRIBERS_CONFIG') {\n addSubscriberConfig(codeFile, preset.configBlock.code);\n } else if (preset.configBlock.section === 'PLUGIN_INIT') {\n addPluginInit(codeFile, preset.configBlock.code);\n }\n }\n\n // If no backend config was set, add placeholder\n if (!codeFile.backendConfig) {\n setBackendConfig(codeFile, '// Local/console mode - no backend configured');\n }\n\n const instrumentationContent = renderCodeFile(codeFile);\n\n // Build dependency plan\n const depPlan = buildDependencyPlan({\n presets: selectedPresets,\n autoInstrumentations,\n });\n\n // Collect env vars\n const envVars: EnvVar[] = [];\n for (const preset of selectedPresets) {\n envVars.push(...preset.env.required, ...preset.env.optional);\n }\n\n const envExampleContent = generateEnvExample(envVars);\n\n // Determine paths\n const instrumentationPath = getInstrumentationPath(project.packageRoot, project.hasTypeScript);\n const envExamplePath = path.join(project.packageRoot, '.env.example');\n\n // Dry run - just print what would happen\n if (options.dryRun) {\n output.heading('\\nDry run - no files will be written\\n');\n\n output.info(`Would write: ${path.relative(project.cwd, instrumentationPath)}`);\n console.log('---');\n console.log(instrumentationContent);\n console.log('---\\n');\n\n if (envExampleContent) {\n output.info(`Would write: ${path.relative(project.cwd, envExamplePath)}`);\n console.log('---');\n console.log(envExampleContent);\n console.log('---\\n');\n }\n\n const prodPkgs = getProdPackages(depPlan);\n const devPkgs = getDevPackages(depPlan);\n\n if (prodPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, prodPkgs);\n output.info(`Would run: ${cmd}`);\n }\n if (devPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, devPkgs, { dev: true });\n output.info(`Would run: ${cmd}`);\n }\n\n process.exit(0);\n }\n\n // Write files\n spinner.start('Writing instrumentation file...');\n const { backupPath: instrBackup } = atomicWrite(instrumentationPath, instrumentationContent, {\n root: project.packageRoot,\n backup: options.force,\n });\n if (instrBackup) {\n output.verbose(`Backup created: ${instrBackup}`);\n }\n spinner.succeed(`Wrote ${path.relative(project.cwd, instrumentationPath)}`);\n\n // Write .env.example if we have env vars\n if (envExampleContent && !fileExists(envExamplePath)) {\n spinner.start('Writing .env.example...');\n atomicWrite(envExamplePath, envExampleContent, { root: project.packageRoot });\n spinner.succeed(`Wrote ${path.relative(project.cwd, envExamplePath)}`);\n }\n\n // Install dependencies\n const prodPkgs = getProdPackages(depPlan);\n const devPkgs = getDevPackages(depPlan);\n\n if (!options.noInstall && (prodPkgs.length > 0 || devPkgs.length > 0)) {\n if (prodPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, prodPkgs);\n if (options.printInstallCmd) {\n output.info(`Install command: ${cmd}`);\n } else {\n spinner.start('Installing dependencies...');\n try {\n execSync(cmd, { cwd: project.packageRoot, stdio: 'pipe' });\n spinner.succeed('Dependencies installed');\n } catch {\n spinner.fail('Failed to install dependencies');\n output.error(`Run manually: ${cmd}`);\n }\n }\n }\n\n if (devPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, devPkgs, { dev: true });\n if (options.printInstallCmd) {\n output.info(`Install command (dev): ${cmd}`);\n } else {\n spinner.start('Installing dev dependencies...');\n try {\n execSync(cmd, { cwd: project.packageRoot, stdio: 'pipe' });\n spinner.succeed('Dev dependencies installed');\n } catch {\n spinner.fail('Failed to install dev dependencies');\n output.error(`Run manually: ${cmd}`);\n }\n }\n }\n } else if (options.noInstall && (prodPkgs.length > 0 || devPkgs.length > 0)) {\n output.info('Skipping installation (--no-install)');\n if (prodPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, prodPkgs);\n output.dim(`Run: ${cmd}`);\n }\n if (devPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, devPkgs, { dev: true });\n output.dim(`Run: ${cmd}`);\n }\n }\n\n // Print next steps\n const relInstrPath = path.relative(project.packageRoot, instrumentationPath);\n\n let nextStepCmd: string;\n switch (startupStyle) {\n case 'tsx':\n nextStepCmd = `tsx --import ./${relInstrPath} src/index.ts`;\n break;\n case 'node-esm':\n default:\n nextStepCmd = `node --import ./${relInstrPath} dist/index.js`;\n }\n\n // Print footer\n const pmInfo = project.workspace.isMonorepo\n ? `${project.packageManager} workspace, package root ${project.packageRoot}`\n : `${project.packageManager}`;\n\n const writtenFiles = [path.relative(project.cwd, instrumentationPath)];\n if (envExampleContent && !fileExists(envExamplePath)) {\n writtenFiles.push('.env.example');\n }\n\n console.log(output.formatFooter({\n detected: pmInfo,\n wrote: writtenFiles,\n next: nextStepCmd,\n }));\n\n // Print additional next steps from presets\n const allNextSteps = selectedPresets.flatMap((p) => p.nextSteps);\n if (allNextSteps.length > 0) {\n console.log('\\nNext steps:');\n for (const step of allNextSteps) {\n console.log(` - ${step}`);\n }\n }\n}\n","import * as path from 'node:path';\nimport type { PackageJson, ProjectContext, WorkspaceInfo } from '../types/index';\nimport { fileExists, dirExists, readJsonSafe, findUpward } from './fs';\nimport { detectPackageManager, detectWorkspaceRoot } from './package-manager';\n\n/**\n * Find package.json starting from cwd, walking up if needed\n */\nexport function findPackageJson(startDir: string): {\n packageJsonPath: string;\n packageRoot: string;\n} | null {\n const packageJsonPath = findUpward(startDir, 'package.json');\n if (!packageJsonPath) {\n return null;\n }\n return {\n packageJsonPath,\n packageRoot: path.dirname(packageJsonPath),\n };\n}\n\n/**\n * Detect if project uses TypeScript\n */\nexport function detectTypeScript(packageRoot: string): boolean {\n // Check for tsconfig.json\n if (fileExists(path.join(packageRoot, 'tsconfig.json'))) {\n return true;\n }\n\n // Check for typescript in dependencies\n const pkgJson = readJsonSafe<PackageJson>(path.join(packageRoot, 'package.json'));\n if (pkgJson) {\n const deps = { ...pkgJson.dependencies, ...pkgJson.devDependencies };\n if ('typescript' in deps) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Detect if project uses ESM\n */\nexport function detectEsm(packageJson: PackageJson): boolean {\n return packageJson.type === 'module';\n}\n\n/**\n * Build workspace info\n */\nexport function buildWorkspaceInfo(\n packageRoot: string,\n cwd: string\n): WorkspaceInfo {\n const { workspaceRoot, workspaceType } = detectWorkspaceRoot(cwd);\n\n return {\n isMonorepo: workspaceRoot !== null && workspaceRoot !== packageRoot,\n workspaceRoot,\n packageRoot,\n workspaceType,\n };\n}\n\n/**\n * Discover project context from a directory\n */\nexport function discoverProject(cwd: string): ProjectContext | null {\n const resolvedCwd = path.resolve(cwd);\n\n // Find package.json\n const pkgResult = findPackageJson(resolvedCwd);\n if (!pkgResult) {\n return null;\n }\n\n const { packageJsonPath, packageRoot } = pkgResult;\n\n // Read package.json\n const packageJson = readJsonSafe<PackageJson>(packageJsonPath);\n if (!packageJson) {\n return null;\n }\n\n // Detect package manager\n const { packageManager, lockfilePath } = detectPackageManager(packageRoot);\n\n // Build workspace info\n const workspace = buildWorkspaceInfo(packageRoot, resolvedCwd);\n\n // Detect features\n const hasTypeScript = detectTypeScript(packageRoot);\n const isEsm = detectEsm(packageJson);\n\n return {\n cwd: resolvedCwd,\n packageRoot,\n packageJson,\n packageJsonPath,\n packageManager,\n lockfilePath,\n workspace,\n hasTypeScript,\n isEsm,\n };\n}\n\n/**\n * Get common entrypoint candidates\n */\nexport function getEntrypointCandidates(packageRoot: string): string[] {\n const candidates = [\n 'src/index.ts',\n 'src/main.ts',\n 'src/index.mts',\n 'src/main.mts',\n 'server.ts',\n 'app.ts',\n 'index.ts',\n 'src/index.js',\n 'src/main.js',\n 'server.js',\n 'app.js',\n 'index.js',\n ];\n\n return candidates\n .map((c) => path.join(packageRoot, c))\n .filter((p) => fileExists(p));\n}\n\n/**\n * Get instrumentation file path based on project conventions\n */\nexport function getInstrumentationPath(\n packageRoot: string,\n hasTypeScript: boolean\n): string {\n // Check if src/ exists (as directory or has files inside)\n const srcDir = path.join(packageRoot, 'src');\n const hasSrcDir = dirExists(srcDir) ||\n fileExists(path.join(packageRoot, 'src', 'index.ts')) ||\n fileExists(path.join(packageRoot, 'src', 'index.js'));\n\n const dir = hasSrcDir ? path.join(packageRoot, 'src') : packageRoot;\n const ext = hasTypeScript ? 'mts' : 'mjs';\n\n return path.join(dir, `instrumentation.${ext}`);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { randomBytes } from 'node:crypto';\n\n/**\n * Check if a path is within the allowed root directory\n */\nexport function isPathWithinRoot(targetPath: string, rootPath: string): boolean {\n const resolvedTarget = path.resolve(targetPath);\n const resolvedRoot = path.resolve(rootPath);\n return resolvedTarget.startsWith(resolvedRoot + path.sep) || resolvedTarget === resolvedRoot;\n}\n\n/**\n * Ensure parent directory exists\n */\nexport function ensureDir(filePath: string): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Read file safely, returning null if not found\n */\nexport function readFileSafe(filePath: string): string | null {\n try {\n return fs.readFileSync(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\n/**\n * Check if file exists\n */\nexport function fileExists(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Check if directory exists\n */\nexport function dirExists(dirPath: string): boolean {\n try {\n return fs.statSync(dirPath).isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Create backup of a file with .bak extension\n */\nexport function createBackup(filePath: string): string | null {\n if (!fileExists(filePath)) {\n return null;\n }\n const backupPath = `${filePath}.bak`;\n fs.copyFileSync(filePath, backupPath);\n return backupPath;\n}\n\n/**\n * Atomic write - write to temp file then rename\n */\nexport function atomicWrite(\n filePath: string,\n content: string,\n options: { root: string; backup?: boolean }\n): { backupPath: string | null } {\n const resolvedPath = path.resolve(filePath);\n\n // Security: ensure we're writing within root\n if (!isPathWithinRoot(resolvedPath, options.root)) {\n throw new Error(\n `Path traversal detected: ${filePath} resolves outside root ${options.root}`\n );\n }\n\n // Create backup if requested and file exists\n let backupPath: string | null = null;\n if (options.backup && fileExists(resolvedPath)) {\n backupPath = createBackup(resolvedPath);\n }\n\n // Ensure parent directory exists\n ensureDir(resolvedPath);\n\n // Write to temp file first\n const tempPath = `${resolvedPath}.${randomBytes(4).toString('hex')}.tmp`;\n\n try {\n fs.writeFileSync(tempPath, content, 'utf8');\n fs.renameSync(tempPath, resolvedPath);\n } catch (error) {\n // Clean up temp file on error\n try {\n fs.unlinkSync(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n\n return { backupPath };\n}\n\n/**\n * Read JSON file safely\n */\nexport function readJsonSafe<T>(filePath: string): T | null {\n const content = readFileSafe(filePath);\n if (content === null) {\n return null;\n }\n try {\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Find a file by walking up the directory tree\n */\nexport function findUpward(\n startDir: string,\n filename: string,\n stopAtRoot = true\n): string | null {\n let currentDir = path.resolve(startDir);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const filePath = path.join(currentDir, filename);\n if (fileExists(filePath)) {\n return filePath;\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n if (stopAtRoot && currentDir === root) {\n break;\n }\n }\n\n // Check root as well\n const rootFilePath = path.join(root, filename);\n if (fileExists(rootFilePath)) {\n return rootFilePath;\n }\n\n return null;\n}\n\n/**\n * Find all files matching a pattern by walking up\n */\nexport function findAllUpward(\n startDir: string,\n filenames: string[]\n): Map<string, string> {\n const found = new Map<string, string>();\n let currentDir = path.resolve(startDir);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n for (const filename of filenames) {\n if (!found.has(filename)) {\n const filePath = path.join(currentDir, filename);\n if (fileExists(filePath)) {\n found.set(filename, filePath);\n }\n }\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return found;\n}\n","import * as path from 'node:path';\nimport type { PackageManager } from '../types/index';\nimport { fileExists, findAllUpward, readFileSafe } from './fs';\n\n/**\n * Lockfile to package manager mapping\n */\nconst LOCKFILE_MAP: Record<string, PackageManager> = {\n 'pnpm-lock.yaml': 'pnpm',\n 'bun.lockb': 'bun',\n 'yarn.lock': 'yarn',\n 'package-lock.json': 'npm',\n};\n\n/**\n * All lockfile names in priority order\n */\nconst LOCKFILES = ['pnpm-lock.yaml', 'bun.lockb', 'yarn.lock', 'package-lock.json'];\n\n/**\n * Priority order when multiple lockfiles at same level (pnpm > bun > yarn > npm)\n */\nconst PM_PRIORITY: PackageManager[] = ['pnpm', 'bun', 'yarn', 'npm'];\n\n/**\n * Detect package manager from nearest lockfile\n * Algorithm: Find closest lockfile to cwd, working upward\n */\nexport function detectPackageManager(startDir: string): {\n packageManager: PackageManager;\n lockfilePath: string | null;\n} {\n const foundLockfiles = findAllUpward(startDir, LOCKFILES);\n\n if (foundLockfiles.size === 0) {\n return { packageManager: 'npm', lockfilePath: null };\n }\n\n // Find the closest lockfile (deepest path = closest to startDir)\n let closestLockfile: string | null = null;\n let closestDepth = -1;\n let closestPM: PackageManager = 'npm';\n\n for (const [lockfileName, lockfilePath] of foundLockfiles) {\n const depth = lockfilePath.split(path.sep).length;\n const pm = LOCKFILE_MAP[lockfileName];\n\n if (pm === undefined) continue;\n\n // Deeper path = closer to startDir (wins), or same depth with higher priority\n if (\n depth > closestDepth ||\n (depth === closestDepth && PM_PRIORITY.indexOf(pm) < PM_PRIORITY.indexOf(closestPM))\n ) {\n closestDepth = depth;\n closestLockfile = lockfilePath;\n closestPM = pm;\n }\n }\n\n return {\n packageManager: closestPM,\n lockfilePath: closestLockfile,\n };\n}\n\n/**\n * Get install command for a package manager\n */\nexport function getInstallCommand(\n pm: PackageManager,\n packages: string[],\n options: { dev?: boolean; workspaceRoot?: boolean } = {}\n): string {\n const pkgList = packages.join(' ');\n const { dev = false, workspaceRoot = false } = options;\n\n switch (pm) {\n case 'pnpm': {\n const devFlag = dev ? ' -D' : '';\n const wsFlag = workspaceRoot ? ' -w' : '';\n return `pnpm add${devFlag}${wsFlag} ${pkgList}`;\n }\n case 'bun': {\n const devFlag = dev ? ' -d' : '';\n return `bun add${devFlag} ${pkgList}`;\n }\n case 'yarn': {\n const devFlag = dev ? ' -D' : '';\n const wsFlag = workspaceRoot ? ' -W' : '';\n return `yarn add${devFlag}${wsFlag} ${pkgList}`;\n }\n case 'npm':\n default: {\n const devFlag = dev ? ' --save-dev' : '';\n return `npm install${devFlag} ${pkgList}`;\n }\n }\n}\n\n/**\n * Get run command for a package manager\n */\nexport function getRunCommand(pm: PackageManager, script: string): string {\n switch (pm) {\n case 'pnpm':\n return `pnpm ${script}`;\n case 'bun':\n return `bun run ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'npm':\n default:\n return `npm run ${script}`;\n }\n}\n\n/**\n * Get exec command for a package manager (npx equivalent)\n */\nexport function getExecCommand(pm: PackageManager): string {\n switch (pm) {\n case 'pnpm':\n return 'pnpm dlx';\n case 'bun':\n return 'bunx';\n case 'yarn':\n return 'yarn dlx';\n case 'npm':\n default:\n return 'npx';\n }\n}\n\n/**\n * Detect workspace root markers\n */\nexport function detectWorkspaceRoot(startDir: string): {\n workspaceRoot: string | null;\n workspaceType: 'pnpm' | 'yarn' | 'npm' | 'lerna' | null;\n} {\n let currentDir = path.resolve(startDir);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n // Check for pnpm workspace\n if (fileExists(path.join(currentDir, 'pnpm-workspace.yaml'))) {\n return { workspaceRoot: currentDir, workspaceType: 'pnpm' };\n }\n\n // Check for Lerna\n if (fileExists(path.join(currentDir, 'lerna.json'))) {\n return { workspaceRoot: currentDir, workspaceType: 'lerna' };\n }\n\n // Check for workspaces in package.json\n const pkgJsonPath = path.join(currentDir, 'package.json');\n const pkgJsonContent = readFileSafe(pkgJsonPath);\n if (pkgJsonContent) {\n try {\n const pkgJson = JSON.parse(pkgJsonContent) as { workspaces?: unknown };\n if (pkgJson.workspaces) {\n // Determine if yarn or npm based on lockfile\n const hasYarnLock = fileExists(path.join(currentDir, 'yarn.lock'));\n return {\n workspaceRoot: currentDir,\n workspaceType: hasYarnLock ? 'yarn' : 'npm',\n };\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return { workspaceRoot: null, workspaceType: null };\n}\n","import * as path from 'node:path';\nimport type { ConfigDetection, InstrumentationFile, InstrumentationSection } from '../types/index';\nimport { fileExists, readFileSafe } from './fs';\nimport { hasCliOwnershipHeader, getSectionMarkers } from './code-builder';\n\n/**\n * Common instrumentation file locations\n */\nconst INSTRUMENTATION_LOCATIONS = [\n 'src/instrumentation.mts',\n 'src/instrumentation.ts',\n 'src/instrumentation.mjs',\n 'src/instrumentation.js',\n 'instrumentation.mts',\n 'instrumentation.ts',\n 'instrumentation.mjs',\n 'instrumentation.js',\n];\n\n/**\n * Find instrumentation file\n */\nexport function findInstrumentationFile(packageRoot: string): InstrumentationFile | null {\n for (const location of INSTRUMENTATION_LOCATIONS) {\n const filePath = path.join(packageRoot, location);\n if (fileExists(filePath)) {\n const content = readFileSafe(filePath);\n if (content === null) {\n continue;\n }\n\n const isCliOwned = hasCliOwnershipHeader(content);\n const markerStrings = getSectionMarkers(content);\n const sections = markerStrings.filter((m): m is InstrumentationSection =>\n ['BACKEND', 'PLUGINS', 'SUBSCRIBERS', 'BACKEND_CONFIG', 'SUBSCRIBERS_CONFIG', 'PLUGIN_INIT'].includes(m)\n );\n\n return {\n path: filePath,\n isCliOwned,\n sections,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Check for autotel.yaml config\n */\nexport function findAutotelYaml(packageRoot: string): string | null {\n const candidates = ['autotel.yaml', 'autotel.yml', '.autotelrc.yaml', '.autotelrc.yml'];\n for (const candidate of candidates) {\n const filePath = path.join(packageRoot, candidate);\n if (fileExists(filePath)) {\n return filePath;\n }\n }\n return null;\n}\n\n/**\n * Detect existing configuration\n */\nexport function detectConfig(packageRoot: string): ConfigDetection {\n // Check for CLI-owned instrumentation file\n const instrumentationFile = findInstrumentationFile(packageRoot);\n if (instrumentationFile?.isCliOwned) {\n return {\n found: true,\n type: 'cli-owned',\n path: instrumentationFile.path,\n instrumentationFile,\n };\n }\n\n // Check for user-created instrumentation file\n if (instrumentationFile && !instrumentationFile.isCliOwned) {\n return {\n found: true,\n type: 'user-created',\n path: instrumentationFile.path,\n instrumentationFile,\n };\n }\n\n // Check for autotel.yaml\n const yamlPath = findAutotelYaml(packageRoot);\n if (yamlPath) {\n return {\n found: true,\n type: 'autotel-yaml',\n path: yamlPath,\n instrumentationFile: null,\n };\n }\n\n return {\n found: false,\n type: 'none',\n path: null,\n instrumentationFile: null,\n };\n}\n\n/**\n * Check if a specific feature is already configured\n */\nexport function isFeatureConfigured(\n instrumentationFile: InstrumentationFile,\n feature: 'backend' | 'subscriber' | 'plugin' | 'platform'\n): boolean {\n switch (feature) {\n case 'backend':\n case 'platform':\n return instrumentationFile.sections.includes('BACKEND') ||\n instrumentationFile.sections.includes('BACKEND_CONFIG');\n case 'subscriber':\n return instrumentationFile.sections.includes('SUBSCRIBERS') ||\n instrumentationFile.sections.includes('SUBSCRIBERS_CONFIG');\n case 'plugin':\n return instrumentationFile.sections.includes('PLUGINS') ||\n instrumentationFile.sections.includes('PLUGIN_INIT');\n }\n}\n","import type { Import } from '../types/index';\n\n/**\n * CLI ownership header comment\n */\nconst CLI_HEADER = `/**\n * autotel instrumentation - managed by autotel-cli\n * Run \\`autotel add <feature>\\` to update this file\n */`;\n\n/**\n * Section marker format\n */\nconst SECTION_MARKER = (name: string): string => `// --- AUTOTEL:${name} ---`;\n\n/**\n * Code file structure\n */\nexport interface CodeFile {\n imports: Import[];\n backendImports: Import[];\n pluginImports: Import[];\n subscriberImports: Import[];\n backendConfig: string | null;\n subscribersConfig: string[];\n pluginInit: string[];\n}\n\n/**\n * Create empty code file\n */\nexport function createCodeFile(): CodeFile {\n return {\n imports: [],\n backendImports: [],\n pluginImports: [],\n subscriberImports: [],\n backendConfig: null,\n subscribersConfig: [],\n pluginInit: [],\n };\n}\n\n/**\n * Add import to code file\n */\nexport function addImport(file: CodeFile, imp: Import, section?: 'backend' | 'plugin' | 'subscriber'): void {\n switch (section) {\n case 'backend':\n file.backendImports.push(imp);\n break;\n case 'plugin':\n file.pluginImports.push(imp);\n break;\n case 'subscriber':\n file.subscriberImports.push(imp);\n break;\n default:\n file.imports.push(imp);\n }\n}\n\n/**\n * Set backend config\n */\nexport function setBackendConfig(file: CodeFile, config: string): void {\n file.backendConfig = config;\n}\n\n/**\n * Add subscriber config\n */\nexport function addSubscriberConfig(file: CodeFile, config: string): void {\n file.subscribersConfig.push(config);\n}\n\n/**\n * Add plugin init\n */\nexport function addPluginInit(file: CodeFile, init: string): void {\n file.pluginInit.push(init);\n}\n\n/**\n * Sort imports for stable output\n * Order: side-effect (autotel/register first), external packages, relative imports\n */\nfunction sortImports(imports: Import[]): Import[] {\n const sideEffect: Import[] = [];\n const external: Import[] = [];\n const relative: Import[] = [];\n\n for (const imp of imports) {\n if (imp.sideEffect) {\n // autotel/register should be first among side-effects\n if (imp.source === 'autotel/register') {\n sideEffect.unshift(imp);\n } else {\n sideEffect.push(imp);\n }\n } else if (imp.source.startsWith('.') || imp.source.startsWith('/')) {\n relative.push(imp);\n } else {\n external.push(imp);\n }\n }\n\n // Sort each group alphabetically by source\n const sortBySource = (a: Import, b: Import): number => a.source.localeCompare(b.source);\n external.sort(sortBySource);\n relative.sort(sortBySource);\n\n return [...sideEffect, ...external, ...relative];\n}\n\n/**\n * Render single import statement\n */\nfunction renderImport(imp: Import): string {\n if (imp.sideEffect) {\n return `import '${imp.source}';`;\n }\n\n const parts: string[] = [];\n\n if (imp.default) {\n parts.push(imp.default);\n }\n\n if (imp.specifiers && imp.specifiers.length > 0) {\n const specifiers = imp.specifiers.join(', ');\n parts.push(`{ ${specifiers} }`);\n }\n\n if (parts.length === 0) {\n return `import '${imp.source}';`;\n }\n\n return `import ${parts.join(', ')} from '${imp.source}';`;\n}\n\n/**\n * Render imports section\n */\nfunction renderImports(imports: Import[]): string {\n if (imports.length === 0) {\n return '';\n }\n const sorted = sortImports(imports);\n return sorted.map(renderImport).join('\\n');\n}\n\n/**\n * Render code file to string\n */\nexport function renderCodeFile(file: CodeFile): string {\n // Header\n const lines: string[] = [CLI_HEADER, ''];\n\n // Main imports (autotel/register first)\n const mainImports = sortImports(file.imports);\n if (mainImports.length > 0) {\n lines.push(renderImports(mainImports));\n lines.push('');\n }\n\n // Backend imports\n if (file.backendImports.length > 0) {\n lines.push(SECTION_MARKER('BACKEND'));\n lines.push(renderImports(file.backendImports));\n lines.push('');\n }\n\n // Plugin imports\n if (file.pluginImports.length > 0) {\n lines.push(SECTION_MARKER('PLUGINS'));\n lines.push(renderImports(file.pluginImports));\n lines.push('');\n }\n\n // Subscriber imports\n if (file.subscriberImports.length > 0) {\n lines.push(SECTION_MARKER('SUBSCRIBERS'));\n lines.push(renderImports(file.subscriberImports));\n lines.push('');\n }\n\n // Init call\n lines.push('init({');\n\n // Backend config\n if (file.backendConfig) {\n lines.push(' ' + SECTION_MARKER('BACKEND_CONFIG'));\n lines.push(` ${file.backendConfig}`);\n }\n\n // Subscribers config\n if (file.subscribersConfig.length > 0) {\n lines.push('');\n lines.push(' ' + SECTION_MARKER('SUBSCRIBERS_CONFIG'));\n lines.push(' subscribers: [');\n for (const sub of file.subscribersConfig) {\n lines.push(` ${sub}`);\n }\n lines.push(' ],');\n }\n\n lines.push('});');\n\n // Plugin init\n if (file.pluginInit.length > 0) {\n lines.push('');\n lines.push(SECTION_MARKER('PLUGIN_INIT'));\n for (const init of file.pluginInit) {\n lines.push(init);\n }\n }\n\n // Ensure file ends with newline\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Check if content has CLI ownership header\n */\nexport function hasCliOwnershipHeader(content: string): boolean {\n return content.includes('autotel instrumentation - managed by autotel-cli');\n}\n\n/**\n * Check if content has a specific section marker\n */\nexport function hasSectionMarker(content: string, section: string): boolean {\n return content.includes(SECTION_MARKER(section));\n}\n\n/**\n * Get all section markers present in content\n */\nexport function getSectionMarkers(content: string): string[] {\n const markers: string[] = [];\n const regex = /\\/\\/ --- AUTOTEL:(\\w+) ---/g;\n let match;\n while ((match = regex.exec(content)) !== null) {\n if (match[1]) {\n markers.push(match[1]);\n }\n }\n return markers;\n}\n\n/**\n * Build minimal instrumentation file (for --yes defaults)\n */\nexport function buildMinimalInstrumentation(): string {\n const file = createCodeFile();\n\n // Add core imports\n addImport(file, { source: 'autotel/register', sideEffect: true });\n addImport(file, { source: 'autotel', specifiers: ['init'] });\n\n // No backend config for local/console default\n file.backendConfig = '// Local/console mode - no backend configured';\n\n return renderCodeFile(file);\n}\n","import * as path from 'node:path';\nimport type { EnvVar } from '../types/index';\nimport { fileExists, readFileSafe } from './fs';\nimport { glob } from 'glob';\n\n/**\n * Generate .env.example content from env vars\n */\nexport function generateEnvExample(envVars: EnvVar[]): string {\n if (envVars.length === 0) {\n return '';\n }\n\n const lines: string[] = [\n '# Autotel configuration',\n '# Copy to .env and fill in values',\n '',\n ];\n\n for (const envVar of envVars) {\n // Add description as comment\n lines.push(`# ${envVar.description}`);\n\n // Add sensitivity warning\n if (envVar.sensitive) {\n lines.push('# ⚠️ SENSITIVE: Do not commit this value');\n }\n\n // Add example or placeholder\n const value = envVar.example ?? '';\n lines.push(`${envVar.name}=${value}`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Parse env file into key-value pairs\n */\nexport function parseEnvFile(content: string): Map<string, string> {\n const vars = new Map<string, string>();\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip comments and empty lines\n if (trimmed.startsWith('#') || trimmed === '') {\n continue;\n }\n\n // Parse key=value\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex > 0) {\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // Remove quotes if present\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n\n vars.set(key, value);\n }\n }\n\n return vars;\n}\n\n/**\n * Find all env files in a directory\n */\nexport async function findEnvFiles(packageRoot: string): Promise<string[]> {\n const patterns = ['.env', '.env.local', '.env.*'];\n const files: string[] = [];\n\n for (const pattern of patterns) {\n try {\n const matches = await glob(pattern, {\n cwd: packageRoot,\n absolute: true,\n dot: true,\n });\n files.push(...matches);\n } catch {\n // Ignore glob errors\n }\n }\n\n // Remove duplicates and filter existing files\n return [...new Set(files)].filter((f) => fileExists(f));\n}\n\n/**\n * Check if env var is present in any env file\n */\nexport async function checkEnvVarPresent(\n packageRoot: string,\n varName: string,\n specificFile?: string\n): Promise<{ found: boolean; file: string | null }> {\n const files = specificFile\n ? [path.resolve(packageRoot, specificFile)]\n : await findEnvFiles(packageRoot);\n\n for (const file of files) {\n const content = readFileSafe(file);\n if (content === null) {\n continue;\n }\n\n const vars = parseEnvFile(content);\n if (vars.has(varName)) {\n return { found: true, file };\n }\n }\n\n return { found: false, file: null };\n}\n\n/**\n * Check multiple env vars presence\n */\nexport async function checkEnvVarsPresent(\n packageRoot: string,\n varNames: string[],\n specificFile?: string\n): Promise<Map<string, { found: boolean; file: string | null }>> {\n const results = new Map<string, { found: boolean; file: string | null }>();\n\n for (const varName of varNames) {\n const result = await checkEnvVarPresent(packageRoot, varName, specificFile);\n results.set(varName, result);\n }\n\n return results;\n}\n","import type { Preset, PackageRequirements } from '../types/index';\n\n/**\n * Dependency plan for installation\n */\nexport interface DependencyPlan {\n required: string[];\n optional: string[];\n devOnly: string[];\n}\n\n/**\n * Create empty dependency plan\n */\nexport function createDependencyPlan(): DependencyPlan {\n return {\n required: [],\n optional: [],\n devOnly: [],\n };\n}\n\n/**\n * Merge packages into plan without duplicates\n */\nfunction mergePackages(target: string[], source: string[]): void {\n for (const pkg of source) {\n if (!target.includes(pkg)) {\n target.push(pkg);\n }\n }\n}\n\n/**\n * Add preset packages to dependency plan\n */\nexport function addPresetToPlan(plan: DependencyPlan, preset: Preset): void {\n mergePackages(plan.required, preset.packages.required);\n mergePackages(plan.optional, preset.packages.optional);\n mergePackages(plan.devOnly, preset.packages.devOnly);\n}\n\n/**\n * Add multiple presets to dependency plan\n */\nexport function addPresetsToPlan(plan: DependencyPlan, presets: Preset[]): void {\n for (const preset of presets) {\n addPresetToPlan(plan, preset);\n }\n}\n\n/**\n * Get all packages that should be installed\n */\nexport function getProdPackages(plan: DependencyPlan): string[] {\n return [...plan.required, ...plan.optional];\n}\n\n/**\n * Get dev packages that should be installed\n */\nexport function getDevPackages(plan: DependencyPlan): string[] {\n return [...plan.devOnly];\n}\n\n/**\n * Add core autotel packages\n */\nexport function addCorePackages(plan: DependencyPlan): void {\n mergePackages(plan.required, ['autotel']);\n}\n\n/**\n * Add auto-instrumentation packages\n */\nexport function addAutoInstrumentationPackages(\n plan: DependencyPlan,\n selection: 'all' | 'none' | string[]\n): void {\n if (selection === 'none') {\n return;\n }\n\n if (selection === 'all') {\n mergePackages(plan.required, ['@opentelemetry/auto-instrumentations-node']);\n return;\n }\n\n // Specific instrumentations\n for (const name of selection) {\n mergePackages(plan.required, [`@opentelemetry/instrumentation-${name}`]);\n }\n}\n\n/**\n * Build dependency plan from selections\n */\nexport function buildDependencyPlan(options: {\n presets: Preset[];\n autoInstrumentations: 'all' | 'none' | string[];\n}): DependencyPlan {\n const plan = createDependencyPlan();\n\n // Add core\n addCorePackages(plan);\n\n // Add presets\n addPresetsToPlan(plan, options.presets);\n\n // Add auto-instrumentations\n addAutoInstrumentationPackages(plan, options.autoInstrumentations);\n\n return plan;\n}\n\n/**\n * Combine package requirements\n */\nexport function combinePackageRequirements(\n requirements: PackageRequirements[]\n): PackageRequirements {\n const combined: PackageRequirements = {\n required: [],\n optional: [],\n devOnly: [],\n };\n\n for (const req of requirements) {\n mergePackages(combined.required, req.required);\n mergePackages(combined.optional, req.optional);\n mergePackages(combined.devOnly, req.devOnly);\n }\n\n return combined;\n}\n","import type { BackendPreset } from '../../types/index';\n\n/**\n * Datadog Direct preset - send traces directly to Datadog\n */\nexport const datadogDirect: BackendPreset = {\n name: 'Datadog (Direct)',\n slug: 'datadog',\n type: 'backend',\n description: 'Send traces directly to Datadog via OTLP HTTP',\n protocol: 'http',\n exporter: 'otlp-http',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-http',\n ],\n optional: [\n '@opentelemetry/sdk-logs',\n '@opentelemetry/exporter-logs-otlp-http',\n ],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'DATADOG_API_KEY',\n description: 'Datadog API key for authentication',\n example: 'your-api-key',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'DATADOG_SITE',\n description: 'Datadog region (e.g., datadoghq.eu for EU)',\n example: 'datadoghq.com',\n sensitive: false,\n },\n {\n name: 'DD_ENV',\n description: 'Environment tag (e.g., production, staging)',\n example: 'production',\n sensitive: false,\n },\n {\n name: 'DD_SERVICE',\n description: 'Service name override',\n example: 'my-service',\n sensitive: false,\n },\n {\n name: 'DD_VERSION',\n description: 'Version tag',\n example: '1.0.0',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/datadog',\n specifiers: ['createDatadogConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createDatadogConfig({\n apiKey: process.env.DATADOG_API_KEY,\n site: process.env.DATADOG_SITE,\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Set DATADOG_API_KEY environment variable',\n 'Optionally set DD_ENV, DD_SERVICE, DD_VERSION for unified service tagging',\n ],\n};\n\n/**\n * Datadog Agent preset - send traces to local Datadog Agent\n */\nexport const datadogAgent: BackendPreset = {\n name: 'Datadog (Agent)',\n slug: 'datadog-agent',\n type: 'backend',\n description: 'Send traces to Datadog via local agent',\n protocol: 'http',\n exporter: 'otlp-http',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-http',\n ],\n optional: [\n '@opentelemetry/sdk-logs',\n '@opentelemetry/exporter-logs-otlp-http',\n ],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [\n {\n name: 'DD_AGENT_HOST',\n description: 'Datadog Agent hostname',\n example: 'localhost',\n sensitive: false,\n },\n {\n name: 'DD_OTLP_PORT',\n description: 'OTLP receiver port on Agent',\n example: '4318',\n sensitive: false,\n },\n {\n name: 'DD_ENV',\n description: 'Environment tag (e.g., production, staging)',\n example: 'production',\n sensitive: false,\n },\n {\n name: 'DD_SERVICE',\n description: 'Service name override',\n example: 'my-service',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/datadog',\n specifiers: ['createDatadogAgentConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createDatadogAgentConfig({\n agentHost: process.env.DD_AGENT_HOST ?? 'localhost',\n otlpPort: process.env.DD_OTLP_PORT ?? '4318',\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Ensure Datadog Agent is running with OTLP receiver enabled',\n 'Agent handles authentication - no API key needed in app',\n ],\n};\n","import type { BackendPreset } from '../../types/index';\n\n/**\n * Honeycomb preset\n */\nexport const honeycomb: BackendPreset = {\n name: 'Honeycomb',\n slug: 'honeycomb',\n type: 'backend',\n description: 'Send traces to Honeycomb via OTLP gRPC',\n protocol: 'grpc',\n exporter: 'otlp-grpc',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-grpc',\n ],\n optional: [\n '@opentelemetry/sdk-logs',\n '@opentelemetry/exporter-logs-otlp-grpc',\n ],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'HONEYCOMB_API_KEY',\n description: 'Honeycomb API key (Ingest Key)',\n example: 'your-api-key',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'HONEYCOMB_DATASET',\n description: 'Dataset name (Classic accounts only)',\n example: 'my-dataset',\n sensitive: false,\n },\n {\n name: 'OTEL_SERVICE_NAME',\n description: 'Service name for traces',\n example: 'my-service',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/honeycomb',\n specifiers: ['createHoneycombConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createHoneycombConfig({\n apiKey: process.env.HONEYCOMB_API_KEY,\n dataset: process.env.HONEYCOMB_DATASET,\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Set HONEYCOMB_API_KEY environment variable',\n 'Get your API key from Honeycomb Team Settings > API Keys',\n ],\n};\n","import type { BackendPreset } from '../../types/index';\n\n/**\n * Generic OTLP HTTP preset\n */\nexport const otlpHttp: BackendPreset = {\n name: 'OTLP (HTTP)',\n slug: 'otlp-http',\n type: 'backend',\n description: 'Send traces to any OTLP-compatible endpoint via HTTP',\n protocol: 'http',\n exporter: 'otlp-http',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-http',\n ],\n optional: [\n '@opentelemetry/sdk-logs',\n '@opentelemetry/exporter-logs-otlp-http',\n ],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'OTLP endpoint URL',\n example: 'http://localhost:4318',\n sensitive: false,\n },\n ],\n optional: [\n {\n name: 'OTEL_EXPORTER_OTLP_HEADERS',\n description: 'Headers for authentication (key=value pairs)',\n example: 'Authorization=Bearer token',\n sensitive: true,\n },\n {\n name: 'OTEL_SERVICE_NAME',\n description: 'Service name for traces',\n example: 'my-service',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/otlp',\n specifiers: ['createOtlpHttpConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createOtlpHttpConfig({\n endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Set OTEL_EXPORTER_OTLP_ENDPOINT to your collector or backend URL',\n 'Add authentication headers if required by your endpoint',\n ],\n};\n\n/**\n * Generic OTLP gRPC preset\n */\nexport const otlpGrpc: BackendPreset = {\n name: 'OTLP (gRPC)',\n slug: 'otlp-grpc',\n type: 'backend',\n description: 'Send traces to any OTLP-compatible endpoint via gRPC',\n protocol: 'grpc',\n exporter: 'otlp-grpc',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-grpc',\n ],\n optional: [\n '@opentelemetry/sdk-logs',\n '@opentelemetry/exporter-logs-otlp-grpc',\n ],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'OTLP gRPC endpoint URL',\n example: 'http://localhost:4317',\n sensitive: false,\n },\n ],\n optional: [\n {\n name: 'OTEL_EXPORTER_OTLP_HEADERS',\n description: 'Headers for authentication (key=value pairs)',\n example: 'Authorization=Bearer token',\n sensitive: true,\n },\n {\n name: 'OTEL_SERVICE_NAME',\n description: 'Service name for traces',\n example: 'my-service',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/otlp',\n specifiers: ['createOtlpGrpcConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createOtlpGrpcConfig({\n endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Set OTEL_EXPORTER_OTLP_ENDPOINT to your collector or backend URL',\n 'gRPC typically uses port 4317 (HTTP uses 4318)',\n ],\n};\n\n/**\n * Local/Console preset (development only)\n */\nexport const local: BackendPreset = {\n name: 'Local/Console',\n slug: 'local',\n type: 'backend',\n description: 'Print traces to console (development only)',\n protocol: 'http',\n exporter: 'otlp-http',\n packages: {\n required: [],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [],\n configBlock: {\n type: 'backend',\n code: '// Local/console mode - no backend configured',\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Traces will be logged to console',\n 'Run `autotel add backend <provider>` to add a real backend',\n ],\n};\n","import type { SubscriberPreset } from '../../types/index';\n\n/**\n * PostHog subscriber preset\n */\nexport const posthog: SubscriberPreset = {\n name: 'PostHog',\n slug: 'posthog',\n type: 'subscriber',\n description: 'Send events to PostHog for product analytics',\n packages: {\n required: [\n 'autotel-subscribers',\n 'posthog-node',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'POSTHOG_API_KEY',\n description: 'PostHog Project API Key',\n example: 'phc_...',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'POSTHOG_HOST',\n description: 'PostHog host URL (for self-hosted)',\n example: 'https://app.posthog.com',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-subscribers/posthog',\n specifiers: ['PostHogSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new PostHogSubscriber({\n apiKey: process.env.POSTHOG_API_KEY,\n host: process.env.POSTHOG_HOST,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Set POSTHOG_API_KEY from PostHog Project Settings',\n 'Events will be sent to PostHog as custom events',\n ],\n};\n\n// Alias for test compatibility\nexport { posthog as posthogSubscriber };\n","import type { SubscriberPreset } from '../../types/index';\n\n/**\n * Mixpanel subscriber preset\n */\nexport const mixpanel: SubscriberPreset = {\n name: 'Mixpanel',\n slug: 'mixpanel',\n type: 'subscriber',\n description: 'Send events to Mixpanel for product analytics',\n packages: {\n required: [\n 'autotel-subscribers',\n 'mixpanel',\n ],\n optional: [],\n devOnly: [\n '@types/mixpanel',\n ],\n },\n env: {\n required: [\n {\n name: 'MIXPANEL_TOKEN',\n description: 'Mixpanel Project Token',\n example: 'your-project-token',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'MIXPANEL_API_HOST',\n description: 'Mixpanel API host (for EU data residency)',\n example: 'api-eu.mixpanel.com',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-subscribers/mixpanel',\n specifiers: ['MixpanelSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new MixpanelSubscriber({\n token: process.env.MIXPANEL_TOKEN,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Set MIXPANEL_TOKEN from Mixpanel Project Settings',\n 'Events will be tracked as Mixpanel events',\n ],\n};\n\n/**\n * Amplitude subscriber preset\n */\nexport const amplitude: SubscriberPreset = {\n name: 'Amplitude',\n slug: 'amplitude',\n type: 'subscriber',\n description: 'Send events to Amplitude for product analytics',\n packages: {\n required: [\n 'autotel-subscribers',\n '@amplitude/analytics-node',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'AMPLITUDE_API_KEY',\n description: 'Amplitude API Key',\n example: 'your-api-key',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'AMPLITUDE_SERVER_URL',\n description: 'Amplitude server URL (for EU data center)',\n example: 'https://api.eu.amplitude.com/2/httpapi',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-subscribers/amplitude',\n specifiers: ['AmplitudeSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new AmplitudeSubscriber({\n apiKey: process.env.AMPLITUDE_API_KEY,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Set AMPLITUDE_API_KEY from Amplitude Project Settings',\n 'Events will be sent to Amplitude',\n ],\n};\n\n/**\n * Segment subscriber preset\n */\nexport const segment: SubscriberPreset = {\n name: 'Segment',\n slug: 'segment',\n type: 'subscriber',\n description: 'Send events to Segment for routing to destinations',\n packages: {\n required: [\n 'autotel-subscribers',\n '@segment/analytics-node',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'SEGMENT_WRITE_KEY',\n description: 'Segment Source Write Key',\n example: 'your-write-key',\n sensitive: true,\n },\n ],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-subscribers/segment',\n specifiers: ['SegmentSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new SegmentSubscriber({\n writeKey: process.env.SEGMENT_WRITE_KEY,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Set SEGMENT_WRITE_KEY from your Segment Source settings',\n 'Configure destinations in Segment to route events',\n ],\n};\n\n/**\n * Slack subscriber preset\n */\nexport const slack: SubscriberPreset = {\n name: 'Slack',\n slug: 'slack',\n type: 'subscriber',\n description: 'Send event notifications to Slack',\n packages: {\n required: [\n 'autotel-subscribers',\n '@slack/web-api',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'SLACK_WEBHOOK_URL',\n description: 'Slack Incoming Webhook URL',\n example: 'https://hooks.slack.com/services/...',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'SLACK_CHANNEL',\n description: 'Default channel for notifications',\n example: '#alerts',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-subscribers/slack',\n specifiers: ['SlackSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new SlackSubscriber({\n webhookUrl: process.env.SLACK_WEBHOOK_URL,\n channel: process.env.SLACK_CHANNEL,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Create an Incoming Webhook in your Slack workspace',\n 'Set SLACK_WEBHOOK_URL with the webhook URL',\n ],\n};\n\n/**\n * Generic Webhook subscriber preset\n */\nexport const webhook: SubscriberPreset = {\n name: 'Webhook',\n slug: 'webhook',\n type: 'subscriber',\n description: 'Send events to a custom webhook endpoint',\n packages: {\n required: [\n 'autotel-subscribers',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'WEBHOOK_URL',\n description: 'Webhook endpoint URL',\n example: 'https://api.example.com/events',\n sensitive: false,\n },\n ],\n optional: [\n {\n name: 'WEBHOOK_SECRET',\n description: 'Shared secret for webhook signatures',\n example: 'your-secret',\n sensitive: true,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-subscribers/webhook',\n specifiers: ['WebhookSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new WebhookSubscriber({\n url: process.env.WEBHOOK_URL,\n secret: process.env.WEBHOOK_SECRET,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Set WEBHOOK_URL to your endpoint',\n 'Implement the webhook receiver to handle incoming events',\n ],\n};\n","import type { PluginPreset } from '../../types/index';\n\n/**\n * Mongoose plugin preset\n */\nexport const mongoose: PluginPreset = {\n name: 'Mongoose',\n slug: 'mongoose',\n type: 'plugin',\n description: 'Instrument Mongoose ODM for MongoDB tracing',\n packages: {\n required: [\n 'autotel-plugins',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-plugins/mongoose',\n specifiers: ['instrumentMongoose'],\n },\n {\n source: 'mongoose',\n default: 'mongoose',\n },\n ],\n configBlock: {\n type: 'plugin',\n code: 'instrumentMongoose(mongoose);',\n section: 'PLUGIN_INIT',\n },\n nextSteps: [\n 'Mongoose operations will now be traced',\n 'Spans will include query, collection, and timing information',\n ],\n};\n\n/**\n * Drizzle plugin preset\n */\nexport const drizzle: PluginPreset = {\n name: 'Drizzle',\n slug: 'drizzle',\n type: 'plugin',\n description: 'Instrument Drizzle ORM for database tracing',\n packages: {\n required: [\n 'autotel-plugins',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-plugins/drizzle',\n specifiers: ['instrumentDrizzle'],\n },\n ],\n configBlock: {\n type: 'plugin',\n code: '// Call instrumentDrizzle(db) with your Drizzle instance',\n section: 'PLUGIN_INIT',\n },\n nextSteps: [\n 'Import instrumentDrizzle and call it with your Drizzle instance',\n 'Example: const db = instrumentDrizzle(drizzle(pool))',\n ],\n};\n","import type { PlatformPreset } from '../../types/index';\n\n/**\n * AWS Lambda platform preset\n */\nexport const awsLambda: PlatformPreset = {\n name: 'AWS Lambda',\n slug: 'aws-lambda',\n type: 'platform',\n description: 'AWS Lambda support with cold start handling',\n packages: {\n required: [\n 'autotel-platforms',\n '@opentelemetry/instrumentation-aws-lambda',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [\n {\n name: 'AWS_LAMBDA_FUNCTION_NAME',\n description: 'Lambda function name (auto-set by AWS)',\n example: 'my-function',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-platforms/aws',\n specifiers: ['createLambdaConfig'],\n },\n ],\n configBlock: {\n type: 'platform',\n code: '...createLambdaConfig(),',\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Add the Lambda layer or bundle instrumentation with your function',\n 'Set OTEL_* environment variables in Lambda configuration',\n ],\n};\n\n/**\n * Cloudflare Workers platform preset\n */\nexport const cloudflare: PlatformPreset = {\n name: 'Cloudflare Workers',\n slug: 'cloudflare',\n type: 'platform',\n description: 'Cloudflare Workers support',\n packages: {\n required: [\n 'autotel-platforms',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-platforms/cloudflare',\n specifiers: ['createCloudflareConfig'],\n },\n ],\n configBlock: {\n type: 'platform',\n code: '...createCloudflareConfig(),',\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Workers have limited API support - some features may not be available',\n 'Use waitUntil() for async span flushing',\n ],\n};\n\n/**\n * Edge runtime platform preset\n */\nexport const edge: PlatformPreset = {\n name: 'Edge Runtime',\n slug: 'edge',\n type: 'platform',\n description: 'Vercel Edge, Deno Deploy, and other edge runtimes',\n packages: {\n required: [\n 'autotel-platforms',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-platforms/edge',\n specifiers: ['createEdgeConfig'],\n },\n ],\n configBlock: {\n type: 'platform',\n code: '...createEdgeConfig(),',\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Edge runtimes have limited API support',\n 'Auto-instrumentation may not work - use manual instrumentation',\n ],\n};\n","import type {\n BackendPreset,\n SubscriberPreset,\n PluginPreset,\n PlatformPreset,\n QuickPreset,\n PresetRegistry,\n Preset,\n PresetType,\n} from '../types/index';\n\n// Import all presets\nimport { datadogDirect, datadogAgent } from './backends/datadog';\nimport { honeycomb } from './backends/honeycomb';\nimport { otlpHttp, otlpGrpc, local } from './backends/otlp';\nimport { posthog } from './subscribers/posthog';\nimport { mixpanel, amplitude, segment, slack, webhook } from './subscribers/mixpanel';\nimport { mongoose, drizzle } from './plugins/mongoose';\nimport { awsLambda, cloudflare, edge } from './platforms/aws';\n\n/**\n * Backend presets registry\n */\nexport const backends = new Map<string, BackendPreset>([\n ['datadog', datadogDirect],\n ['datadog-agent', datadogAgent],\n ['honeycomb', honeycomb],\n ['otlp-http', otlpHttp],\n ['otlp-grpc', otlpGrpc],\n ['local', local],\n]);\n\n/**\n * Subscriber presets registry\n */\nexport const subscribers = new Map<string, SubscriberPreset>([\n ['posthog', posthog],\n ['mixpanel', mixpanel],\n ['amplitude', amplitude],\n ['segment', segment],\n ['slack', slack],\n ['webhook', webhook],\n]);\n\n/**\n * Plugin presets registry\n */\nexport const plugins = new Map<string, PluginPreset>([\n ['mongoose', mongoose],\n ['drizzle', drizzle],\n]);\n\n/**\n * Platform presets registry\n */\nexport const platforms = new Map<string, PlatformPreset>([\n ['aws-lambda', awsLambda],\n ['cloudflare', cloudflare],\n ['edge', edge],\n]);\n\n/**\n * Quick presets (named bundles)\n */\nexport const quickPresets = new Map<string, QuickPreset>([\n [\n 'node-datadog-pino',\n {\n name: 'Node.js + Datadog + Pino',\n slug: 'node-datadog-pino',\n description: 'Standard Node.js setup with Datadog and Pino logging',\n backend: 'datadog',\n logging: 'pino',\n autoInstrumentations: 'all',\n },\n ],\n [\n 'node-datadog-agent',\n {\n name: 'Node.js + Datadog Agent',\n slug: 'node-datadog-agent',\n description: 'Node.js with Datadog Agent for local development',\n backend: 'datadog-agent',\n logging: 'pino',\n autoInstrumentations: 'all',\n },\n ],\n [\n 'node-honeycomb',\n {\n name: 'Node.js + Honeycomb',\n slug: 'node-honeycomb',\n description: 'Standard Node.js setup with Honeycomb',\n backend: 'honeycomb',\n autoInstrumentations: 'all',\n },\n ],\n [\n 'node-otlp',\n {\n name: 'Node.js + Generic OTLP',\n slug: 'node-otlp',\n description: 'Node.js with generic OTLP endpoint',\n backend: 'otlp-http',\n autoInstrumentations: 'all',\n },\n ],\n]);\n\n/**\n * Full preset registry\n */\nexport const presetRegistry: PresetRegistry = {\n backends,\n subscribers,\n plugins,\n platforms,\n quick: quickPresets,\n};\n\n/**\n * Get preset by type and slug\n */\nexport function getPreset(type: PresetType, slug: string): Preset | undefined {\n switch (type) {\n case 'backend':\n return backends.get(slug);\n case 'subscriber':\n return subscribers.get(slug);\n case 'plugin':\n return plugins.get(slug);\n case 'platform':\n return platforms.get(slug);\n }\n}\n\n/**\n * Get all presets of a type\n */\nexport function getPresetsByType(type: PresetType): Map<string, Preset> {\n switch (type) {\n case 'backend':\n return backends as Map<string, Preset>;\n case 'subscriber':\n return subscribers as Map<string, Preset>;\n case 'plugin':\n return plugins as Map<string, Preset>;\n case 'platform':\n return platforms as Map<string, Preset>;\n }\n}\n\n/**\n * Get quick preset by slug\n */\nexport function getQuickPreset(slug: string): QuickPreset | undefined {\n return quickPresets.get(slug);\n}\n\n/**\n * List all preset slugs by type\n */\nexport function listPresetSlugs(type: PresetType): string[] {\n return [...getPresetsByType(type).keys()];\n}\n\n/**\n * Check if a preset exists\n */\nexport function presetExists(type: PresetType, slug: string): boolean {\n return getPresetsByType(type).has(slug);\n}\n\n/**\n * Re-export individual presets for direct access\n */\nexport {\n datadogDirect,\n datadogAgent,\n honeycomb,\n otlpHttp,\n otlpGrpc,\n local,\n posthog,\n mixpanel,\n amplitude,\n segment,\n slack,\n webhook,\n mongoose,\n drizzle,\n awsLambda,\n cloudflare,\n edge,\n};\n","import { select, checkbox, confirm, input } from '@inquirer/prompts';\nimport type { Preset, PresetType } from '../types/index';\n\n/**\n * Runtime selection\n */\nexport type RuntimeSelection = 'node' | 'lambda' | 'cloudflare' | 'edge';\n\n/**\n * Startup style selection\n */\nexport type StartupStyle = 'node-esm' | 'tsx' | 'ts-node' | 'nextjs' | 'other';\n\n/**\n * Prompt for runtime selection\n */\nexport async function promptRuntime(): Promise<RuntimeSelection> {\n return await select({\n message: 'What runtime are you using?',\n choices: [\n { value: 'node' as const, name: 'Node.js' },\n { value: 'lambda' as const, name: 'AWS Lambda' },\n { value: 'cloudflare' as const, name: 'Cloudflare Workers' },\n { value: 'edge' as const, name: 'Edge Runtime (Vercel Edge, etc.)' },\n ],\n default: 'node',\n });\n}\n\n/**\n * Prompt for backend selection\n */\nexport async function promptBackend(\n backends: Map<string, Preset>\n): Promise<string> {\n const choices = [\n { value: 'local', name: 'Local/Console (development only)' },\n ...[...backends.entries()].map(([slug, preset]) => ({\n value: slug,\n name: `${preset.name} - ${preset.description}`,\n })),\n ];\n\n return await select({\n message: 'Where do you want to send telemetry?',\n choices,\n default: 'local',\n });\n}\n\n/**\n * Prompt for logging framework\n */\nexport async function promptLogging(): Promise<string | null> {\n return await select({\n message: 'Which logging framework do you use?',\n choices: [\n { value: null as unknown as string, name: 'None / Not sure' },\n { value: 'pino', name: 'Pino' },\n { value: 'winston', name: 'Winston' },\n ],\n default: null as unknown as string,\n });\n}\n\n/**\n * Prompt for database/ORM selection (multi-select)\n */\nexport async function promptDatabases(\n plugins: Map<string, Preset>\n): Promise<string[]> {\n const choices = [...plugins.entries()]\n .filter(([, preset]) => preset.type === 'plugin')\n .map(([slug, preset]) => ({\n value: slug,\n name: `${preset.name} - ${preset.description}`,\n }));\n\n if (choices.length === 0) {\n return [];\n }\n\n return await checkbox({\n message: 'Which databases/ORMs do you use? (space to select, enter to continue)',\n choices,\n });\n}\n\n/**\n * Prompt for event subscribers (multi-select)\n */\nexport async function promptSubscribers(\n subscribers: Map<string, Preset>\n): Promise<string[]> {\n const choices = [...subscribers.entries()].map(([slug, preset]) => ({\n value: slug,\n name: `${preset.name} - ${preset.description}`,\n }));\n\n if (choices.length === 0) {\n return [];\n }\n\n return await checkbox({\n message: 'Which event destinations? (space to select, enter to continue)',\n choices,\n });\n}\n\n/**\n * Prompt for auto-instrumentation\n */\nexport async function promptAutoInstrumentation(): Promise<'all' | 'none' | 'specific'> {\n return await select({\n message: 'Auto-instrument common libraries?',\n choices: [\n { value: 'all' as const, name: 'All (recommended) - http, express, pg, redis, etc.' },\n { value: 'specific' as const, name: 'Let me choose specific ones' },\n { value: 'none' as const, name: 'None - I\\'ll handle it manually' },\n ],\n default: 'all',\n });\n}\n\n/**\n * Prompt for startup style\n */\nexport async function promptStartupStyle(\n hasTypeScript: boolean\n): Promise<StartupStyle> {\n const choices = hasTypeScript\n ? [\n { value: 'node-esm' as const, name: 'Node ESM (node --import) - Recommended' },\n { value: 'tsx' as const, name: 'tsx (tsx --import) - For development' },\n { value: 'ts-node' as const, name: 'ts-node' },\n { value: 'nextjs' as const, name: 'Next.js' },\n { value: 'other' as const, name: 'Other / Manual' },\n ]\n : [\n { value: 'node-esm' as const, name: 'Node ESM (node --import) - Recommended' },\n { value: 'nextjs' as const, name: 'Next.js' },\n { value: 'other' as const, name: 'Other / Manual' },\n ];\n\n return await select({\n message: 'How do you start your app?',\n choices,\n default: 'node-esm',\n });\n}\n\n/**\n * Prompt for confirmation\n */\nexport async function promptConfirm(message: string, defaultValue = true): Promise<boolean> {\n return await confirm({\n message,\n default: defaultValue,\n });\n}\n\n/**\n * Prompt for existing config action\n */\nexport async function promptExistingConfigAction(): Promise<'update' | 'new' | 'abort'> {\n return await select({\n message: 'Existing instrumentation detected. What would you like to do?',\n choices: [\n { value: 'update' as const, name: 'Update existing file (recommended)' },\n { value: 'new' as const, name: 'Create new file (src/autotel-config.mts)' },\n { value: 'abort' as const, name: 'Abort' },\n ],\n default: 'update',\n });\n}\n\n/**\n * Prompt for text input\n */\nexport async function promptInput(\n message: string,\n defaultValue?: string\n): Promise<string> {\n return await input({\n message,\n default: defaultValue,\n });\n}\n\n/**\n * Prompt for preset selection from a type\n */\nexport async function promptPresetFromType(\n type: PresetType,\n presets: Map<string, Preset>\n): Promise<string | null> {\n const filtered = [...presets.entries()].filter(\n ([, preset]) => preset.type === type\n );\n\n if (filtered.length === 0) {\n return null;\n }\n\n const choices = [\n { value: null as unknown as string, name: 'None' },\n ...filtered.map(([slug, preset]) => ({\n value: slug,\n name: `${preset.name} - ${preset.description}`,\n })),\n ];\n\n return await select({\n message: `Select ${type}:`,\n choices,\n default: null as unknown as string,\n });\n}\n","import chalk from 'chalk';\nimport type { Check, CheckSummary, PackageManager } from '../types/index';\n\n/**\n * Status tokens for consistent output\n */\nexport const STATUS = {\n ok: chalk.green('[OK]'),\n warn: chalk.yellow('[WARN]'),\n error: chalk.red('[ERROR]'),\n info: chalk.blue('[INFO]'),\n skip: chalk.gray('[SKIP]'),\n};\n\n/**\n * Format check output line\n */\nexport function formatCheck(check: Check): string[] {\n const lines: string[] = [];\n const statusToken = STATUS[check.status];\n\n lines.push(` ${statusToken} ${check.message}`);\n\n if (check.details && check.details.length > 0) {\n for (const detail of check.details) {\n lines.push(` ${chalk.dim(detail)}`);\n }\n }\n\n if (check.fix) {\n lines.push(` ${chalk.cyan('Fix:')} ${check.fix.cmd}`);\n }\n\n return lines;\n}\n\n/**\n * Format summary line\n */\nexport function formatSummary(summary: CheckSummary): string {\n const parts: string[] = [];\n\n if (summary.ok > 0) {\n parts.push(chalk.green(`${summary.ok} passed`));\n }\n if (summary.warnings > 0) {\n parts.push(chalk.yellow(`${summary.warnings} warning${summary.warnings > 1 ? 's' : ''}`));\n }\n if (summary.errors > 0) {\n parts.push(chalk.red(`${summary.errors} error${summary.errors > 1 ? 's' : ''}`));\n }\n if (summary.skipped > 0) {\n parts.push(chalk.gray(`${summary.skipped} skipped`));\n }\n\n return `Summary: ${parts.join(', ')}`;\n}\n\n/**\n * Format structured footer\n */\nexport function formatFooter(options: {\n detected?: string;\n wrote?: string[];\n next?: string;\n}): string {\n const lines: string[] = [''];\n\n if (options.detected) {\n lines.push(chalk.dim(`Detected: ${options.detected}`));\n }\n\n if (options.wrote && options.wrote.length > 0) {\n lines.push(chalk.dim(`Wrote: ${options.wrote.join(', ')}`));\n }\n\n if (options.next) {\n lines.push(chalk.cyan(`Next: ${options.next}`));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format package manager detection info\n */\nexport function formatPackageManagerInfo(\n pm: PackageManager,\n lockfilePath: string | null\n): string {\n if (lockfilePath) {\n return `${pm} (via ${chalk.dim(lockfilePath)})`;\n }\n return `${pm} (default, no lockfile found)`;\n}\n\n/**\n * Format workspace info\n */\nexport function formatWorkspaceInfo(\n isMonorepo: boolean,\n workspaceRoot: string | null,\n packageRoot: string\n): string {\n if (!isMonorepo) {\n return `package root ${chalk.dim(packageRoot)}`;\n }\n return `monorepo, workspace root ${chalk.dim(workspaceRoot)}, package root ${chalk.dim(packageRoot)}`;\n}\n\n/**\n * Print heading\n */\nexport function heading(text: string): void {\n console.log(chalk.bold(text));\n}\n\n/**\n * Print info message\n */\nexport function info(text: string): void {\n console.log(chalk.blue(text));\n}\n\n/**\n * Print success message\n */\nexport function success(text: string): void {\n console.log(chalk.green(text));\n}\n\n/**\n * Print warning message\n */\nexport function warn(text: string): void {\n console.log(chalk.yellow(text));\n}\n\n/**\n * Print error message\n */\nexport function error(text: string): void {\n console.log(chalk.red(text));\n}\n\n/**\n * Print dim/muted text\n */\nexport function dim(text: string): void {\n console.log(chalk.dim(text));\n}\n\n/**\n * Format install command\n */\nexport function formatInstallCmd(cmd: string): string {\n return chalk.cyan(`$ ${cmd}`);\n}\n\n/**\n * Format file path relative to cwd\n */\nexport function formatPath(filePath: string): string {\n return chalk.dim(filePath);\n}\n\n/**\n * Quiet output - only warnings and errors\n */\nexport function isQuiet(): boolean {\n return process.env['AUTOTEL_QUIET'] === 'true';\n}\n\n/**\n * Verbose output\n */\nexport function isVerbose(): boolean {\n return process.env['AUTOTEL_VERBOSE'] === 'true';\n}\n\n/**\n * Print only if not quiet\n */\nexport function log(text: string): void {\n if (!isQuiet()) {\n console.log(text);\n }\n}\n\n/**\n * Print only if verbose\n */\nexport function verbose(text: string): void {\n if (isVerbose()) {\n console.log(chalk.gray(`[verbose] ${text}`));\n }\n}\n","import ora, { type Ora } from 'ora';\n\n/**\n * Spinner wrapper for consistent usage\n */\nexport interface SpinnerInstance {\n start: (text?: string) => void;\n stop: () => void;\n succeed: (text?: string) => void;\n fail: (text?: string) => void;\n warn: (text?: string) => void;\n info: (text?: string) => void;\n text: (text: string) => void;\n}\n\n/**\n * Create a spinner\n */\nexport function createSpinner(text?: string): SpinnerInstance {\n const spinner: Ora = ora({\n text,\n spinner: 'dots',\n });\n\n return {\n start: (newText?: string) => {\n if (newText) spinner.text = newText;\n spinner.start();\n },\n stop: () => spinner.stop(),\n succeed: (newText?: string) => spinner.succeed(newText),\n fail: (newText?: string) => spinner.fail(newText),\n warn: (newText?: string) => spinner.warn(newText),\n info: (newText?: string) => spinner.info(newText),\n text: (newText: string) => {\n spinner.text = newText;\n },\n };\n}\n\n/**\n * Run async function with spinner\n */\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n options?: {\n successText?: string | ((result: T) => string);\n failText?: string;\n }\n): Promise<T> {\n const spinner = createSpinner(text);\n spinner.start();\n\n try {\n const result = await fn();\n const successText =\n typeof options?.successText === 'function'\n ? options.successText(result)\n : options?.successText;\n spinner.succeed(successText);\n return result;\n } catch (error) {\n spinner.fail(options?.failText ?? `Failed: ${text}`);\n throw error;\n }\n}\n\n/**\n * No-op spinner for quiet mode or CI\n */\nexport function createNoopSpinner(): SpinnerInstance {\n return {\n start: () => {},\n stop: () => {},\n succeed: () => {},\n fail: () => {},\n warn: () => {},\n info: () => {},\n text: () => {},\n };\n}\n\n/**\n * Check if running in CI environment\n */\nexport function isCI(): boolean {\n return !!(\n process.env['CI'] ||\n process.env['CONTINUOUS_INTEGRATION'] ||\n process.env['BUILD_NUMBER'] ||\n process.env['GITHUB_ACTIONS'] ||\n process.env['GITLAB_CI'] ||\n process.env['CIRCLECI'] ||\n process.env['TRAVIS']\n );\n}\n","import * as semver from 'semver';\nimport type { PackageJson } from '../types/index';\n\n/**\n * Installed package info\n */\nexport interface InstalledPackage {\n name: string;\n version: string;\n isDev: boolean;\n}\n\n/**\n * Missing package info\n */\nexport interface MissingPackage {\n name: string;\n reason: string;\n requiredBy?: string;\n}\n\n/**\n * Audit result for dependency checking\n */\nexport interface DependencyAudit {\n installed: InstalledPackage[];\n missing: MissingPackage[];\n versionMismatch: Array<{\n name: string;\n installed: string;\n expected: string;\n }>;\n}\n\n/**\n * Get all installed packages from package.json\n */\nexport function getInstalledPackages(packageJson: PackageJson): InstalledPackage[] {\n const installed: InstalledPackage[] = [];\n\n const deps = packageJson.dependencies ?? {};\n const devDeps = packageJson.devDependencies ?? {};\n\n for (const [name, version] of Object.entries(deps)) {\n installed.push({ name, version, isDev: false });\n }\n\n for (const [name, version] of Object.entries(devDeps)) {\n // Don't duplicate if in both\n if (!deps[name]) {\n installed.push({ name, version, isDev: true });\n }\n }\n\n return installed;\n}\n\n/**\n * Check if a package is installed\n */\nexport function isPackageInstalled(\n packageJson: PackageJson,\n packageName: string\n): { installed: boolean; version: string | null; isDev: boolean } {\n const deps = packageJson.dependencies ?? {};\n const devDeps = packageJson.devDependencies ?? {};\n\n if (deps[packageName]) {\n return { installed: true, version: deps[packageName] ?? null, isDev: false };\n }\n\n if (devDeps[packageName]) {\n return { installed: true, version: devDeps[packageName] ?? null, isDev: true };\n }\n\n return { installed: false, version: null, isDev: false };\n}\n\n/**\n * Find missing packages from a required list\n */\nexport function findMissingPackages(\n packageJson: PackageJson,\n required: string[],\n reason?: string\n): MissingPackage[] {\n const missing: MissingPackage[] = [];\n\n for (const pkg of required) {\n const { installed } = isPackageInstalled(packageJson, pkg);\n if (!installed) {\n missing.push({\n name: pkg,\n reason: reason ?? 'Required dependency',\n });\n }\n }\n\n return missing;\n}\n\n/**\n * Check version compatibility between autotel packages\n */\nexport function checkAutotelVersions(\n packageJson: PackageJson\n): { compatible: boolean; packages: Array<{ name: string; version: string }> } {\n const autotelPackages = ['autotel', 'autotel-backends', 'autotel-plugins', 'autotel-subscribers'];\n const installed: Array<{ name: string; version: string; major: number }> = [];\n\n for (const pkg of autotelPackages) {\n const { installed: isInstalled, version } = isPackageInstalled(packageJson, pkg);\n if (isInstalled && version) {\n const cleanVersion = version.replace(/^[\\^~]/, '');\n const parsed = semver.parse(cleanVersion);\n if (parsed) {\n installed.push({ name: pkg, version: cleanVersion, major: parsed.major });\n }\n }\n }\n\n if (installed.length <= 1) {\n return { compatible: true, packages: installed };\n }\n\n // Check if all major versions match\n const majors = new Set(installed.map((p) => p.major));\n const compatible = majors.size === 1;\n\n return { compatible, packages: installed };\n}\n\n/**\n * Audit dependencies for a preset\n */\nexport function auditPresetDependencies(\n packageJson: PackageJson,\n requiredPackages: string[],\n presetName: string\n): DependencyAudit {\n const installed = getInstalledPackages(packageJson);\n const missing: MissingPackage[] = [];\n const versionMismatch: DependencyAudit['versionMismatch'] = [];\n\n for (const pkg of requiredPackages) {\n const result = isPackageInstalled(packageJson, pkg);\n if (!result.installed) {\n missing.push({\n name: pkg,\n reason: `Required by ${presetName} preset`,\n requiredBy: presetName,\n });\n }\n }\n\n return {\n installed,\n missing,\n versionMismatch,\n };\n}\n\n/**\n * Get autotel core package info if installed\n */\nexport function getAutotelInfo(packageJson: PackageJson): {\n installed: boolean;\n version: string | null;\n} {\n const { installed, version } = isPackageInstalled(packageJson, 'autotel');\n return { installed, version };\n}\n","import * as path from 'node:path';\nimport type { ProjectContext } from '../types/index';\nimport { readFileSafe } from './fs';\nimport { getEntrypointCandidates } from './project';\n\n/**\n * ESM hook check result\n */\nexport interface EsmCheckResult {\n status: 'ok' | 'warn' | 'info' | 'error';\n message: string;\n details?: string[];\n}\n\n/**\n * Check if autotel/register is imported correctly\n */\nexport function checkRegisterImportOrder(content: string): {\n found: boolean;\n isFirst: boolean;\n lineNumber: number | null;\n} {\n const lines = content.split('\\n');\n let registerLine: number | null = null;\n let firstImportLine: number | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]?.trim() ?? '';\n\n // Skip empty lines and comments\n if (line === '' || line.startsWith('//') || line.startsWith('/*') || line.startsWith('*')) {\n continue;\n }\n\n // Check for imports\n if (line.startsWith('import ') || line.startsWith(\"import'\") || line.startsWith('import\"')) {\n if (firstImportLine === null) {\n firstImportLine = i + 1;\n }\n\n if (line.includes('autotel/register')) {\n registerLine = i + 1;\n }\n }\n }\n\n if (registerLine === null) {\n return { found: false, isFirst: false, lineNumber: null };\n }\n\n return {\n found: true,\n isFirst: registerLine === firstImportLine,\n lineNumber: registerLine,\n };\n}\n\n/**\n * Check ESM hook setup - conservative approach\n */\nexport function checkEsmHook(project: ProjectContext): EsmCheckResult {\n // Check if project uses ESM\n if (!project.isEsm) {\n return {\n status: 'info',\n message: 'Project uses CommonJS; ESM hook check skipped',\n details: [\n 'autotel works best with ESM projects',\n 'Consider adding \"type\": \"module\" to package.json',\n ],\n };\n }\n\n // Find entrypoints to check\n const entrypoints = getEntrypointCandidates(project.packageRoot);\n\n if (entrypoints.length === 0) {\n return {\n status: 'info',\n message: 'Could not find entrypoint files to verify',\n details: [\n 'Ensure autotel/register is imported first in your entrypoint',\n 'Or use --import flag: node --import ./src/instrumentation.mts dist/index.js',\n ],\n };\n }\n\n // Check each entrypoint for autotel/register\n for (const entrypoint of entrypoints) {\n const content = readFileSafe(entrypoint);\n if (content === null) continue;\n\n const result = checkRegisterImportOrder(content);\n\n // If found but not first, that's a definite problem\n if (result.found && !result.isFirst) {\n return {\n status: 'warn',\n message: `autotel/register import found but not first in ${path.basename(entrypoint)}:${result.lineNumber}`,\n details: [\n 'autotel/register must be the first import for instrumentation to work',\n 'Move it to the top of the file, before any other imports',\n ],\n };\n }\n\n // If found and first, good\n if (result.found && result.isFirst) {\n return {\n status: 'ok',\n message: `autotel/register correctly imported first in ${path.basename(entrypoint)}`,\n };\n }\n }\n\n // Not found in any entrypoint - info, not warning\n // User might be using --import flag\n return {\n status: 'info',\n message: 'Could not verify autotel/register import order',\n details: [\n 'Ensure autotel/register is first import in entrypoint',\n 'Or use the recommended approach: node --import ./src/instrumentation.mts',\n ],\n };\n}\n\n/**\n * Get recommended startup command\n */\nexport function getRecommendedStartupCommand(\n project: ProjectContext,\n instrumentationPath: string\n): string {\n const relPath = path.relative(project.packageRoot, instrumentationPath);\n\n if (project.hasTypeScript) {\n // Check for tsx\n const hasTsx =\n project.packageJson.devDependencies?.tsx ||\n project.packageJson.dependencies?.tsx;\n\n if (hasTsx) {\n return `tsx --import ./${relPath} src/index.ts`;\n }\n\n // Default Node ESM\n return `node --import ./${relPath} dist/index.js`;\n }\n\n // JavaScript\n return `node --import ./${relPath} src/index.js`;\n}\n\n/**\n * Check if scripts use --import flag\n */\nexport function checkScriptsUseImport(\n scripts: Record<string, string> | undefined,\n _instrumentationPath: string\n): { found: boolean; scriptName: string | null } {\n if (!scripts) {\n return { found: false, scriptName: null };\n }\n\n for (const [name, script] of Object.entries(scripts)) {\n if (script.includes('--import') && script.includes('instrumentation')) {\n return { found: true, scriptName: name };\n }\n }\n\n return { found: false, scriptName: null };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { readFileSafe } from './fs';\n\n/**\n * Logger instrumentation mapping\n */\nconst LOGGER_INSTRUMENTATION = {\n winston: '@opentelemetry/instrumentation-winston',\n bunyan: '@opentelemetry/instrumentation-bunyan',\n pino: '@opentelemetry/instrumentation-pino',\n} as const;\n\n/**\n * Extract autoInstrumentations from source code\n * Looks for patterns like:\n * - autoInstrumentations: ['winston', 'bunyan']\n * - autoInstrumentations: true\n * - autoInstrumentations: { winston: { enabled: true } }\n */\nexport function extractAutoInstrumentations(\n content: string\n): string[] {\n const instrumentations: string[] = [];\n\n // Pattern 1: Array format: autoInstrumentations: ['winston', 'bunyan']\n const arrayPattern = /autoInstrumentations\\s*:\\s*\\[(.*?)\\]/s;\n const arrayMatch = content.match(arrayPattern);\n if (arrayMatch && arrayMatch[1]) {\n const items = arrayMatch[1]\n .split(',')\n .map((item) => item.trim().replaceAll(/['\"]/g, ''))\n .filter((item) => item.length > 0);\n instrumentations.push(...items);\n }\n\n // Pattern 2: Object format: autoInstrumentations: { winston: { enabled: true } }\n const objectPattern = /autoInstrumentations\\s*:\\s*\\{([^}]+)\\}/s;\n const objectMatch = content.match(objectPattern);\n if (objectMatch && objectMatch[1]) {\n const props = objectMatch[1];\n // Extract keys that have enabled: true\n const enabledPattern = /(\\w+)\\s*:\\s*\\{[^}]*enabled\\s*:\\s*true[^}]*\\}/g;\n let enabledMatch;\n while ((enabledMatch = enabledPattern.exec(props)) !== null) {\n if (enabledMatch[1]) {\n instrumentations.push(enabledMatch[1]);\n }\n }\n }\n\n return [...new Set(instrumentations)]; // Remove duplicates\n}\n\n/**\n * Find all source files that might contain init() calls\n */\nexport function findSourceFiles(packageRoot: string): string[] {\n const sourceFiles: string[] = [];\n const srcDir = path.join(packageRoot, 'src');\n\n // Check common source directories\n const dirsToCheck = [packageRoot, srcDir].filter((dir) =>\n fs.existsSync(dir) && fs.statSync(dir).isDirectory()\n );\n\n for (const dir of dirsToCheck) {\n const files = fs.readdirSync(dir, { recursive: true });\n for (const file of files) {\n if (typeof file !== 'string') continue;\n const filePath = path.join(dir, file);\n try {\n if (\n fs.statSync(filePath).isFile() &&\n /\\.(ts|js|mts|mjs|tsx|jsx)$/.test(file)\n ) {\n sourceFiles.push(filePath);\n }\n } catch {\n // Skip files that can't be accessed\n }\n }\n }\n\n return sourceFiles;\n}\n\n/**\n * Check logger instrumentation configuration\n */\nexport function checkLoggerInstrumentation(\n packageRoot: string,\n deps: Record<string, string>\n): {\n logger: 'winston' | 'bunyan' | 'pino' | null;\n hasLogger: boolean;\n hasInstrumentation: boolean;\n configuredInCode: boolean;\n instrumentationPackage: string | null;\n} {\n // Check if logger packages are installed\n const hasWinston = !!deps['winston'];\n const hasBunyan = !!deps['bunyan'];\n const hasPino = !!deps['pino'];\n\n let logger: 'winston' | 'bunyan' | 'pino' | null = null;\n if (hasWinston) logger = 'winston';\n else if (hasBunyan) logger = 'bunyan';\n else if (hasPino) logger = 'pino';\n\n if (!logger) {\n return {\n logger: null,\n hasLogger: false,\n hasInstrumentation: false,\n configuredInCode: false,\n instrumentationPackage: null,\n };\n }\n\n const instrumentationPackage = LOGGER_INSTRUMENTATION[logger];\n const hasInstrumentation = !!deps[instrumentationPackage];\n\n // Check if logger is configured in source code\n const sourceFiles = findSourceFiles(packageRoot);\n let configuredInCode = false;\n\n for (const filePath of sourceFiles) {\n const content = readFileSafe(filePath);\n if (!content) continue;\n\n // Check if init() is called\n if (!content.includes('init(')) continue;\n\n // Extract autoInstrumentations\n const instrumentations = extractAutoInstrumentations(content);\n if (instrumentations.includes(logger)) {\n configuredInCode = true;\n break;\n }\n }\n\n return {\n logger,\n hasLogger: true,\n hasInstrumentation,\n configuredInCode,\n instrumentationPackage,\n };\n}\n","import type {\n DoctorOptions,\n Check,\n CheckSummary,\n DoctorResult,\n Preset,\n} from '../types/index';\nimport { discoverProject } from '../lib/project';\nimport { detectConfig } from '../lib/config-detector';\nimport { getAutotelInfo, checkAutotelVersions } from '../lib/dependency-auditor';\nimport { checkEsmHook } from '../lib/esm-checker';\nimport { checkEnvVarsPresent } from '../lib/env-generator';\nimport { getInstallCommand } from '../lib/package-manager';\nimport { getPreset } from '../presets/index';\nimport { checkLoggerInstrumentation } from '../lib/logger-checker';\nimport * as output from '../ui/output';\nimport { createSpinner } from '../ui/spinner';\n\n/**\n * All available check definitions\n */\nconst CHECK_DEFINITIONS = [\n { id: 'autotel-installed', title: 'Autotel installed', description: 'Check if autotel is installed' },\n { id: 'peer-deps', title: 'Peer dependencies', description: 'Check if required peer dependencies are installed' },\n { id: 'esm-hook', title: 'ESM hook setup', description: 'Check if autotel/register is imported correctly' },\n { id: 'env-vars', title: 'Environment variables', description: 'Check if required env vars are present' },\n { id: 'version-compat', title: 'Version compatibility', description: 'Check autotel package versions match' },\n { id: 'config-found', title: 'Configuration found', description: 'Check if instrumentation config exists' },\n { id: 'logger-instrumentation', title: 'Logger instrumentation', description: 'Check if logger instrumentation packages are installed' },\n];\n\n/**\n * Infer backend from dependencies and env files\n */\nasync function inferBackend(\n packageRoot: string,\n deps: Record<string, string>\n): Promise<Preset | null> {\n // Check for known backend packages\n if (deps['autotel-backends']) {\n // Check for grpc exporter - likely Honeycomb\n if (deps['@opentelemetry/exporter-trace-otlp-grpc']) {\n return getPreset('backend', 'honeycomb') ?? null;\n }\n // Check for http exporter - could be Datadog or generic\n if (deps['@opentelemetry/exporter-trace-otlp-http']) {\n // Check env files for DD_ prefix\n const ddVars = await checkEnvVarsPresent(packageRoot, ['DATADOG_API_KEY', 'DD_API_KEY']);\n for (const [, result] of ddVars) {\n if (result.found) {\n return getPreset('backend', 'datadog') ?? null;\n }\n }\n return getPreset('backend', 'otlp-http') ?? null;\n }\n }\n\n return null;\n}\n\n/**\n * Run all doctor checks\n */\nasync function runChecks(\n options: DoctorOptions,\n projectRoot: string\n): Promise<Check[]> {\n const project = discoverProject(projectRoot);\n if (!project) {\n return [{\n id: 'project',\n title: 'Project discovery',\n level: 'error',\n status: 'error',\n message: 'No package.json found',\n }];\n }\n\n const checks: Check[] = [];\n const deps = { ...project.packageJson.dependencies, ...project.packageJson.devDependencies };\n\n // Check 1: Autotel installed\n const autotelInfo = getAutotelInfo(project.packageJson);\n if (autotelInfo.installed) {\n checks.push({\n id: 'autotel-installed',\n title: 'Autotel installed',\n level: 'error',\n status: 'ok',\n message: `autotel@${autotelInfo.version} is installed`,\n });\n } else {\n checks.push({\n id: 'autotel-installed',\n title: 'Autotel installed',\n level: 'error',\n status: 'error',\n message: 'autotel is not installed',\n fix: {\n cmd: getInstallCommand(project.packageManager, ['autotel']),\n description: 'Install autotel package',\n },\n });\n }\n\n // Check 2: Config found\n const config = detectConfig(project.packageRoot);\n if (config.found) {\n if (config.type === 'cli-owned') {\n checks.push({\n id: 'config-found',\n title: 'Configuration found',\n level: 'info',\n status: 'ok',\n message: `CLI-owned instrumentation at ${config.path}`,\n });\n } else if (config.type === 'user-created') {\n checks.push({\n id: 'config-found',\n title: 'Configuration found',\n level: 'info',\n status: 'ok',\n message: `User-created instrumentation at ${config.path}`,\n details: ['Add CLI header to enable auto-updates'],\n });\n } else {\n checks.push({\n id: 'config-found',\n title: 'Configuration found',\n level: 'info',\n status: 'ok',\n message: `Config found at ${config.path}`,\n });\n }\n } else {\n checks.push({\n id: 'config-found',\n title: 'Configuration found',\n level: 'info',\n status: 'warn',\n message: 'No instrumentation config found',\n details: [\n 'Run `autotel init` to create a CLI-owned config',\n \"Or add `import 'autotel/register'` and call `init()` manually\",\n ],\n });\n }\n\n // Infer backend for preset-aware checks\n const inferredBackend = await inferBackend(project.packageRoot, deps);\n const canInferPreset = inferredBackend !== null || config.type === 'cli-owned';\n\n // Check 3: Peer dependencies (preset-aware)\n if (canInferPreset && inferredBackend) {\n const missingDeps: string[] = [];\n for (const pkg of inferredBackend.packages.required) {\n if (!deps[pkg]) {\n missingDeps.push(pkg);\n }\n }\n\n if (missingDeps.length > 0) {\n checks.push({\n id: 'peer-deps',\n title: 'Peer dependencies',\n level: 'warning',\n status: 'warn',\n message: 'Missing peer dependencies required by selected backend',\n details: missingDeps.map((d) => `Missing: ${d}`),\n fix: {\n cmd: getInstallCommand(project.packageManager, missingDeps),\n description: 'Install missing peer dependencies',\n },\n });\n } else {\n checks.push({\n id: 'peer-deps',\n title: 'Peer dependencies',\n level: 'warning',\n status: 'ok',\n message: 'All peer dependencies satisfied',\n });\n }\n } else {\n checks.push({\n id: 'peer-deps',\n title: 'Peer dependencies',\n level: 'warning',\n status: 'skip',\n message: 'Could not infer backend; skipping peer dep check',\n details: [\n 'Run `autotel init` to create a CLI-owned config',\n 'Or add header marker to existing instrumentation',\n ],\n });\n }\n\n // Check 4: Env vars (preset-aware)\n if (canInferPreset && inferredBackend && inferredBackend.env.required.length > 0) {\n const requiredVarNames = inferredBackend.env.required.map((v) => v.name);\n const envResults = await checkEnvVarsPresent(\n project.packageRoot,\n requiredVarNames,\n options.envFile\n );\n\n const missingVars: string[] = [];\n for (const [varName, result] of envResults) {\n if (!result.found) {\n missingVars.push(varName);\n }\n }\n\n if (missingVars.length > 0) {\n checks.push({\n id: 'env-vars',\n title: 'Environment variables',\n level: 'warning',\n status: 'warn',\n message: 'Missing required environment variables',\n details: [\n ...missingVars.map((v) => `Missing: ${v}`),\n 'Set in environment or deployment secrets',\n ],\n });\n } else {\n checks.push({\n id: 'env-vars',\n title: 'Environment variables',\n level: 'warning',\n status: 'ok',\n message: 'Required environment variables found',\n });\n }\n } else if (!canInferPreset) {\n checks.push({\n id: 'env-vars',\n title: 'Environment variables',\n level: 'warning',\n status: 'skip',\n message: 'Could not infer backend; skipping env check',\n });\n } else {\n checks.push({\n id: 'env-vars',\n title: 'Environment variables',\n level: 'warning',\n status: 'ok',\n message: 'No required environment variables for this backend',\n });\n }\n\n // Check 5: Version compatibility\n const versionCheck = checkAutotelVersions(project.packageJson);\n if (versionCheck.packages.length > 1) {\n if (versionCheck.compatible) {\n checks.push({\n id: 'version-compat',\n title: 'Version compatibility',\n level: 'warning',\n status: 'ok',\n message: 'All autotel packages are compatible',\n });\n } else {\n checks.push({\n id: 'version-compat',\n title: 'Version compatibility',\n level: 'warning',\n status: 'warn',\n message: 'Autotel packages have mismatched major versions',\n details: versionCheck.packages.map((p) => `${p.name}@${p.version}`),\n });\n }\n } else {\n checks.push({\n id: 'version-compat',\n title: 'Version compatibility',\n level: 'warning',\n status: 'skip',\n message: 'Only one autotel package installed; skipping version check',\n });\n }\n\n // Check 6: ESM hook setup (conservative)\n const esmCheck = checkEsmHook(project);\n checks.push({\n id: 'esm-hook',\n title: 'ESM hook setup',\n level: esmCheck.status === 'warn' ? 'warning' : 'info',\n status: esmCheck.status === 'ok' ? 'ok' :\n esmCheck.status === 'warn' ? 'warn' :\n esmCheck.status === 'error' ? 'error' : 'skip',\n message: esmCheck.message,\n details: esmCheck.details,\n });\n\n // Check 7: Logger instrumentation\n const loggerCheck = checkLoggerInstrumentation(project.packageRoot, deps);\n if (loggerCheck.hasLogger) {\n if (loggerCheck.configuredInCode && !loggerCheck.hasInstrumentation) {\n checks.push({\n id: 'logger-instrumentation',\n title: 'Logger instrumentation',\n level: 'warning',\n status: 'warn',\n message: `${loggerCheck.logger} is configured but instrumentation package is missing`,\n details: [\n `${loggerCheck.logger} is used in autoInstrumentations but ${loggerCheck.instrumentationPackage} is not installed`,\n `Install it: ${getInstallCommand(project.packageManager, [loggerCheck.instrumentationPackage!])}`,\n ],\n fix: {\n cmd: getInstallCommand(project.packageManager, [loggerCheck.instrumentationPackage!]),\n description: `Install ${loggerCheck.instrumentationPackage}`,\n },\n });\n } else if (loggerCheck.hasInstrumentation && loggerCheck.configuredInCode) {\n checks.push({\n id: 'logger-instrumentation',\n title: 'Logger instrumentation',\n level: 'info',\n status: 'ok',\n message: `${loggerCheck.logger} instrumentation is properly configured`,\n });\n } else if (loggerCheck.hasInstrumentation && !loggerCheck.configuredInCode) {\n checks.push({\n id: 'logger-instrumentation',\n title: 'Logger instrumentation',\n level: 'info',\n status: 'ok',\n message: `${loggerCheck.logger} instrumentation package is installed`,\n details: [\n `Add '${loggerCheck.logger}' to autoInstrumentations in your init() call to enable trace context injection`,\n ],\n });\n } else {\n checks.push({\n id: 'logger-instrumentation',\n title: 'Logger instrumentation',\n level: 'info',\n status: 'skip',\n message: `${loggerCheck.logger} is installed but not configured in code`,\n });\n }\n } else {\n checks.push({\n id: 'logger-instrumentation',\n title: 'Logger instrumentation',\n level: 'info',\n status: 'skip',\n message: 'No logger packages detected (winston, bunyan, pino)',\n });\n }\n\n return checks;\n}\n\n/**\n * Calculate summary from checks\n */\nfunction calculateSummary(checks: Check[]): CheckSummary {\n return {\n ok: checks.filter((c) => c.status === 'ok').length,\n warnings: checks.filter((c) => c.status === 'warn').length,\n errors: checks.filter((c) => c.status === 'error').length,\n skipped: checks.filter((c) => c.status === 'skip').length,\n };\n}\n\n/**\n * Determine exit code from checks\n */\nfunction getExitCode(checks: Check[]): number {\n const hasErrors = checks.some((c) => c.status === 'error');\n const hasWarnings = checks.some((c) => c.status === 'warn');\n\n if (hasErrors) return 2;\n if (hasWarnings) return 1;\n return 0;\n}\n\n/**\n * Run the doctor command\n */\nexport async function runDoctor(options: DoctorOptions): Promise<void> {\n // Set output mode\n if (options.verbose) {\n process.env['AUTOTEL_VERBOSE'] = 'true';\n }\n if (options.quiet) {\n process.env['AUTOTEL_QUIET'] = 'true';\n }\n\n // List checks mode\n if (options.listChecks) {\n if (options.json) {\n console.log(JSON.stringify(CHECK_DEFINITIONS, null, 2));\n } else {\n output.heading('Available checks:\\n');\n for (const check of CHECK_DEFINITIONS) {\n console.log(` ${check.id}`);\n console.log(` ${check.description}\\n`);\n }\n }\n return;\n }\n\n const spinner = createSpinner();\n\n // Discover project\n spinner.start('Scanning project...');\n const project = discoverProject(options.cwd);\n\n if (!project) {\n spinner.fail('No package.json found');\n output.error('Run this command in a directory with a package.json, or use --cwd');\n process.exit(2);\n }\n\n spinner.text('Running checks...');\n\n // Run all checks\n const checks = await runChecks(options, options.cwd);\n const summary = calculateSummary(checks);\n\n spinner.stop();\n\n // JSON output\n if (options.json) {\n const result: DoctorResult = {\n project: project.packageRoot,\n checks,\n summary,\n };\n console.log(JSON.stringify(result, null, 2));\n process.exit(getExitCode(checks));\n }\n\n // Human output\n output.heading(`autotel doctor\\n`);\n output.dim(`Scanning ${project.packageRoot}...\\n`);\n\n for (const check of checks) {\n const lines = output.formatCheck(check);\n for (const line of lines) {\n console.log(line);\n }\n }\n\n console.log('');\n console.log(output.formatSummary(summary));\n\n // Run fixes if requested\n if (options.fix) {\n const fixableChecks = checks.filter((c) => c.fix && c.status !== 'ok');\n\n if (fixableChecks.length === 0) {\n output.info('\\nNo fixes needed');\n } else {\n output.info(`\\nApplying ${fixableChecks.length} fix(es)...`);\n\n for (const check of fixableChecks) {\n if (!check.fix) continue;\n\n // Only auto-fix safe operations\n if (check.id === 'autotel-installed' || check.id === 'peer-deps') {\n output.info(`Running: ${check.fix.cmd}`);\n try {\n const { execSync } = await import('node:child_process');\n execSync(check.fix.cmd, { cwd: project.packageRoot, stdio: 'inherit' });\n output.success(`Fixed: ${check.title}`);\n } catch {\n output.error(`Failed to fix: ${check.title}`);\n }\n } else {\n output.dim(`Skipping auto-fix for ${check.id} (not safe to auto-fix)`);\n output.dim(`Manual fix: ${check.fix.cmd}`);\n }\n }\n }\n }\n\n process.exit(getExitCode(checks));\n}\n","import { execSync } from 'node:child_process';\nimport type { AddOptions, Preset, PresetType } from '../types/index';\nimport { discoverProject } from '../lib/project';\nimport { detectConfig, isFeatureConfigured } from '../lib/config-detector';\nimport { getInstallCommand } from '../lib/package-manager';\nimport { atomicWrite, readFileSafe } from '../lib/fs';\nimport {\n getPreset,\n getPresetsByType,\n listPresetSlugs,\n} from '../presets/index';\nimport * as output from '../ui/output';\nimport { createSpinner } from '../ui/spinner';\n\n/**\n * Format preset list for output\n */\nfunction formatPresetList(presets: Map<string, Preset>, json: boolean): void {\n if (json) {\n const list = [...presets.entries()].map(([slug, preset]) => ({\n slug,\n name: preset.name,\n description: preset.description,\n requiredEnv: preset.env.required.map((e) => e.name),\n }));\n console.log(JSON.stringify(list, null, 2));\n return;\n }\n\n for (const [slug, preset] of presets) {\n console.log(` ${slug}`);\n console.log(` ${preset.description}`);\n if (preset.env.required.length > 0) {\n const envNames = preset.env.required.map((e) => e.name).join(', ');\n output.dim(` Required env: ${envNames}`);\n }\n console.log('');\n }\n}\n\n/**\n * Show help for a specific preset\n */\nfunction showPresetHelp(preset: Preset): void {\n output.heading(`\\n${preset.name}\\n`);\n console.log(preset.description);\n console.log('');\n\n output.heading('Packages:');\n for (const pkg of preset.packages.required) {\n console.log(` ${pkg}`);\n }\n if (preset.packages.optional.length > 0) {\n console.log(' Optional:');\n for (const pkg of preset.packages.optional) {\n console.log(` ${pkg}`);\n }\n }\n console.log('');\n\n if (preset.env.required.length > 0) {\n output.heading('Required Environment Variables:');\n for (const envVar of preset.env.required) {\n console.log(` ${envVar.name}`);\n console.log(` ${envVar.description}`);\n if (envVar.example) {\n output.dim(` Example: ${envVar.example}`);\n }\n }\n console.log('');\n }\n\n if (preset.env.optional.length > 0) {\n output.heading('Optional Environment Variables:');\n for (const envVar of preset.env.optional) {\n console.log(` ${envVar.name}`);\n console.log(` ${envVar.description}`);\n }\n console.log('');\n }\n\n output.heading('Next Steps:');\n for (const step of preset.nextSteps) {\n console.log(` - ${step}`);\n }\n}\n\n/**\n * Parse preset type from string\n */\nfunction parsePresetType(type: string): PresetType | null {\n const validTypes: PresetType[] = ['backend', 'subscriber', 'plugin', 'platform'];\n if (validTypes.includes(type as PresetType)) {\n return type as PresetType;\n }\n return null;\n}\n\n/**\n * Update instrumentation file with new preset\n */\nexport function addPresetToFile(\n content: string,\n preset: Preset\n): string {\n // This is a simplified implementation\n // In a full implementation, we'd parse the file and insert at the right sections\n // For now, we'll add imports and config at the end of each section\n\n let result = content;\n\n // Add imports\n for (const imp of preset.imports) {\n const importLine = imp.sideEffect\n ? `import '${imp.source}';`\n : imp.default\n ? `import ${imp.default} from '${imp.source}';`\n : `import { ${imp.specifiers?.join(', ')} } from '${imp.source}';`;\n\n // Check if import already exists (match the full import statement pattern)\n const importPattern = imp.sideEffect\n ? `import '${imp.source}'`\n : imp.default\n ? `from '${imp.source}'`\n : `from '${imp.source}'`;\n if (!result.includes(importPattern)) {\n // Find the appropriate section marker and add after it\n const sectionMarker = preset.type === 'backend' || preset.type === 'platform' ? '// --- AUTOTEL:BACKEND ---' :\n preset.type === 'plugin' ? '// --- AUTOTEL:PLUGINS ---' :\n preset.type === 'subscriber' ? '// --- AUTOTEL:SUBSCRIBERS ---' : null;\n\n if (sectionMarker && result.includes(sectionMarker)) {\n result = result.replace(sectionMarker, `${sectionMarker}\\n${importLine}`);\n } else {\n // Add at the end of imports section\n const initIndex = result.indexOf('init({');\n if (initIndex > 0) {\n result = result.slice(0, initIndex) + `${importLine}\\n\\n` + result.slice(initIndex);\n }\n }\n }\n }\n\n // Add config block\n const configCode = preset.configBlock.code;\n const configSection = preset.configBlock.section;\n\n if (configSection === 'BACKEND_CONFIG') {\n // Replace backend config section\n const backendMarker = '// --- AUTOTEL:BACKEND_CONFIG ---';\n if (result.includes(backendMarker)) {\n // Find the marker and the next line(s) until we hit another marker or closing brace\n const markerIndex = result.indexOf(backendMarker);\n const afterMarker = result.slice(markerIndex + backendMarker.length);\n\n // Find where the config ends (next marker, subscribers:, or closing });)\n const nextMarkerMatch = afterMarker.match(/\\n\\s*(\\/\\/ --- AUTOTEL:|subscribers:|}\\);)/);\n const endIndex = nextMarkerMatch\n ? markerIndex + backendMarker.length + (nextMarkerMatch.index ?? 0)\n : markerIndex + backendMarker.length;\n\n result = result.slice(0, markerIndex) +\n backendMarker + '\\n ' + configCode + '\\n' +\n result.slice(endIndex);\n } else {\n // Insert after init({ if no marker exists\n const initMatch = result.match(/init\\(\\{/);\n if (initMatch && initMatch.index !== undefined) {\n const insertPoint = initMatch.index + 'init({'.length;\n result = result.slice(0, insertPoint) +\n '\\n ' + backendMarker + '\\n ' + configCode +\n result.slice(insertPoint);\n }\n }\n } else if (configSection === 'SUBSCRIBERS_CONFIG') {\n // Find subscribers array and add\n const subscribersMatch = result.match(/subscribers:\\s*\\[([^\\]]*)\\]/s);\n if (subscribersMatch) {\n const existingSubscribers = subscribersMatch[1]?.trim();\n const newSubscribers = existingSubscribers\n ? `${existingSubscribers}\\n ${configCode}`\n : `\\n ${configCode}\\n `;\n result = result.replace(subscribersMatch[0], `subscribers: [${newSubscribers}]`);\n } else {\n // No subscribers array exists - create one\n // Find the closing }); of init() - it's the first }); after init({\n const subscribersMarker = '// --- AUTOTEL:SUBSCRIBERS_CONFIG ---';\n const initStart = result.indexOf('init({');\n if (initStart !== -1) {\n const afterInit = result.slice(initStart);\n const closingMatch = afterInit.match(/}\\);/);\n if (closingMatch && closingMatch.index !== undefined) {\n const insertPoint = initStart + closingMatch.index;\n result = result.slice(0, insertPoint) +\n '\\n ' + subscribersMarker + '\\n subscribers: [\\n ' +\n configCode + '\\n ],\\n' +\n result.slice(insertPoint);\n }\n }\n }\n } else if (configSection === 'PLUGIN_INIT') {\n // Add at end before file ends\n const pluginMarker = '// --- AUTOTEL:PLUGIN_INIT ---';\n if (result.includes(pluginMarker)) {\n result = result.replace(pluginMarker, `${pluginMarker}\\n${configCode}`);\n } else {\n result = result.trimEnd() + `\\n\\n${pluginMarker}\\n${configCode}\\n`;\n }\n }\n\n return result;\n}\n\n/**\n * Run the add command\n */\nexport async function runAdd(\n type: string | undefined,\n name: string | undefined,\n options: AddOptions\n): Promise<void> {\n // Set output mode\n if (options.verbose) {\n process.env['AUTOTEL_VERBOSE'] = 'true';\n }\n if (options.quiet) {\n process.env['AUTOTEL_QUIET'] = 'true';\n }\n\n // List all presets\n if (options.list && !type) {\n output.heading('\\nAvailable presets:\\n');\n\n output.heading('Backends:');\n formatPresetList(getPresetsByType('backend'), options.json);\n\n output.heading('Subscribers:');\n formatPresetList(getPresetsByType('subscriber'), options.json);\n\n output.heading('Plugins:');\n formatPresetList(getPresetsByType('plugin'), options.json);\n\n output.heading('Platforms:');\n formatPresetList(getPresetsByType('platform'), options.json);\n\n return;\n }\n\n // Validate type\n if (!type) {\n output.error('Usage: autotel add <type> <name>');\n output.info('Types: backend, subscriber, plugin, platform');\n output.info('Run `autotel add --list` to see all presets');\n process.exit(1);\n }\n\n const presetType = parsePresetType(type);\n if (!presetType) {\n output.error(`Invalid type: ${type}`);\n output.info('Valid types: backend, subscriber, plugin, platform');\n process.exit(1);\n }\n\n // List presets for type\n if (options.list) {\n output.heading(`\\n${presetType} presets:\\n`);\n formatPresetList(getPresetsByType(presetType), options.json);\n return;\n }\n\n // Validate name\n if (!name) {\n output.error(`Usage: autotel add ${type} <name>`);\n output.info(`Available ${type}s: ${listPresetSlugs(presetType).join(', ')}`);\n process.exit(1);\n }\n\n // Get preset\n const preset = getPreset(presetType, name);\n if (!preset) {\n output.error(`Unknown ${type}: ${name}`);\n output.info(`Available ${type}s: ${listPresetSlugs(presetType).join(', ')}`);\n process.exit(1);\n }\n\n // Show help for preset\n if (process.argv.includes('--help') || process.argv.includes('-h')) {\n showPresetHelp(preset);\n return;\n }\n\n const spinner = createSpinner();\n\n // Discover project\n spinner.start('Discovering project...');\n const project = discoverProject(options.cwd);\n\n if (!project) {\n spinner.fail('No package.json found');\n output.error('Run this command in a directory with a package.json, or use --cwd');\n process.exit(1);\n }\n\n spinner.succeed(`Found ${project.packageJson.name ?? 'project'}`);\n\n // Check if already installed\n const deps = { ...project.packageJson.dependencies, ...project.packageJson.devDependencies };\n const allInstalled = preset.packages.required.every((pkg) => deps[pkg]);\n\n // Check if already configured\n const config = detectConfig(project.packageRoot);\n let alreadyConfigured = false;\n\n if (config.instrumentationFile) {\n alreadyConfigured = isFeatureConfigured(config.instrumentationFile, presetType);\n }\n\n // Idempotency check\n if (allInstalled && alreadyConfigured) {\n output.success(`[OK] ${preset.name} is already installed and configured`);\n return;\n }\n\n if (allInstalled) {\n output.info(`Packages already installed`);\n }\n\n if (alreadyConfigured) {\n output.info(`Already configured in instrumentation file`);\n }\n\n // Dry run\n if (options.dryRun) {\n output.heading('\\nDry run - no changes will be made\\n');\n\n if (!allInstalled) {\n const cmd = getInstallCommand(project.packageManager, preset.packages.required);\n output.info(`Would run: ${cmd}`);\n }\n\n if (!alreadyConfigured) {\n output.info(`Would update instrumentation file with ${preset.name} config`);\n }\n\n return;\n }\n\n // Install packages\n if (!allInstalled && !options.noInstall) {\n const missingPkgs = preset.packages.required.filter((pkg) => !deps[pkg]);\n const cmd = getInstallCommand(project.packageManager, missingPkgs);\n\n if (options.printInstallCmd) {\n output.info(`Install command: ${cmd}`);\n } else {\n spinner.start('Installing packages...');\n try {\n execSync(cmd, { cwd: project.packageRoot, stdio: 'pipe' });\n spinner.succeed('Packages installed');\n } catch {\n spinner.fail('Failed to install packages');\n output.error(`Run manually: ${cmd}`);\n }\n }\n }\n\n // Update instrumentation file\n if (!alreadyConfigured) {\n if (!config.found || config.type === 'none') {\n output.warn('No instrumentation file found');\n output.info('Run `autotel init` first to create one');\n process.exit(1);\n }\n\n if (config.type === 'user-created' && !options.force) {\n output.warn('Instrumentation file exists but is not CLI-owned');\n output.info('Use --force to modify, or add CLI header to the file');\n process.exit(1);\n }\n\n const instrPath = config.path!;\n const content = readFileSafe(instrPath);\n\n if (content) {\n spinner.start('Updating instrumentation file...');\n const updatedContent = addPresetToFile(content, preset);\n atomicWrite(instrPath, updatedContent, {\n root: project.packageRoot,\n backup: options.force,\n });\n spinner.succeed('Instrumentation file updated');\n }\n }\n\n // Print next steps\n console.log(output.formatFooter({\n detected: `${project.packageManager}`,\n next: preset.nextSteps[0],\n }));\n\n if (preset.nextSteps.length > 1) {\n console.log('\\nAdditional steps:');\n for (const step of preset.nextSteps.slice(1)) {\n console.log(` - ${step}`);\n }\n }\n}\n","import * as path from 'node:path';\nimport { glob } from 'glob';\nimport type { CodemodTraceOptions } from '../types/index';\nimport { readFileSafe, fileExists } from '../lib/fs';\nimport { transformFile } from '../lib/codemod-trace';\nimport * as output from '../ui/output';\n\nconst CODEMOD_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);\nconst GLOB_META = /[*?[\\]]/;\n\n/**\n * Resolve path argument to a list of absolute file paths.\n * - If path has no glob metacharacters and is an existing file, return that file.\n * - Otherwise treat as glob; restrict to .ts, .tsx, .js, .jsx; exclude node_modules and *.d.ts.\n */\nexport async function resolveCodemodFiles(\n pathArg: string,\n cwd: string\n): Promise<string[]> {\n const isGlob = GLOB_META.test(pathArg);\n if (!isGlob) {\n const absolute = path.isAbsolute(pathArg) ? pathArg : path.resolve(cwd, pathArg);\n if (fileExists(absolute)) {\n const ext = path.extname(absolute);\n if (CODEMOD_EXTENSIONS.has(ext) && !absolute.endsWith('.d.ts')) {\n return [absolute];\n }\n return [];\n }\n }\n\n const pattern = path.isAbsolute(pathArg) ? pathArg : path.join(cwd, pathArg);\n const matches = await glob(pattern, {\n cwd,\n absolute: true,\n ignore: ['**/node_modules/**', '**/*.d.ts'],\n });\n\n return matches.filter((f) => {\n const ext = path.extname(f);\n return CODEMOD_EXTENSIONS.has(ext) && !f.endsWith('.d.ts');\n });\n}\n\n/**\n * Run the codemod trace command: resolve files, transform each, write or dry-run.\n */\nexport async function runCodemodTrace(options: CodemodTraceOptions): Promise<void> {\n const { path: pathArg, cwd, dryRun, namePattern, skip, printFiles, verbose, quiet } = options;\n\n const files = await resolveCodemodFiles(pathArg, cwd);\n if (files.length === 0) {\n if (!quiet) {\n output.error(`No matching files found for: ${pathArg}`);\n }\n process.exitCode = 1;\n return;\n }\n\n const skipRegExps = skip?.map((s) => new RegExp(s)) ?? [];\n const transformOptions = { namePattern, skip: skipRegExps.length > 0 ? skipRegExps : undefined };\n\n let totalWrapped = 0;\n let totalChanged = 0;\n\n for (const filePath of files) {\n const content = readFileSafe(filePath);\n if (content === null) {\n if (verbose) output.dim(`Skip ${filePath} (unreadable)`);\n continue;\n }\n\n let result: Awaited<ReturnType<typeof transformFile>>;\n try {\n result = transformFile(content, filePath, transformOptions);\n } catch (error) {\n if (!quiet) {\n output.error(`Failed to transform ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (verbose && error instanceof Error && error.stack) output.dim(error.stack);\n process.exitCode = 1;\n continue;\n }\n\n\n const relativePath = path.relative(cwd, filePath);\n\n if (result.changed) {\n totalWrapped += result.wrappedCount;\n totalChanged += 1;\n if (!dryRun) {\n const fs = await import('node:fs');\n fs.writeFileSync(filePath, result.modified, 'utf8');\n }\n }\n\n const showSummary = printFiles || dryRun || result.changed;\n if (showSummary && !quiet) {\n if (result.changed) {\n console.log(`✔ ${relativePath} (${result.wrappedCount} wrapped)`);\n } else if (result.skipped.length > 0) {\n const reasons = [...new Set(result.skipped.map((s) => s.reason))].join('; ');\n console.log(`↷ ${relativePath} (skipped: ${reasons})`);\n }\n }\n }\n\n if (dryRun && totalChanged > 0 && !quiet) {\n console.log('');\n output.dim(`Dry run: ${totalChanged} file(s) would be updated, ${totalWrapped} function(s) wrapped.`);\n }\n}\n","import * as path from 'node:path';\nimport { Project, type SourceFile, type Node, SyntaxKind } from 'ts-morph';\n\nexport interface TransformResult {\n modified: string;\n changed: boolean;\n wrappedCount: number;\n skipped: { name: string; reason: string }[];\n}\n\nexport interface TransformOptions {\n namePattern?: string;\n skip?: RegExp[];\n}\n\nconst TRACE_IMPORT_MODULE = 'autotel';\n\nfunction hasTraceImport(sourceFile: SourceFile): boolean {\n for (const imp of sourceFile.getImportDeclarations()) {\n if (imp.getModuleSpecifierValue() !== TRACE_IMPORT_MODULE) continue;\n for (const spec of imp.getNamedImports()) {\n const name = spec.getName();\n if (name === 'trace') return true;\n const alias = spec.getAliasNode()?.getText();\n if (alias === 'trace' || name === 'trace') return true;\n }\n }\n return false;\n}\n\nfunction addTraceImport(sourceFile: SourceFile): void {\n if (hasTraceImport(sourceFile)) return;\n sourceFile.insertImportDeclaration(0, {\n moduleSpecifier: TRACE_IMPORT_MODULE,\n namedImports: ['trace'],\n });\n}\n\nfunction expandNamePattern(\n pattern: string,\n name: string,\n filePath: string,\n cwd: string\n): string {\n const file = path.basename(filePath, path.extname(filePath));\n const relPath = path.relative(cwd, filePath).replaceAll('\\\\', '/');\n return pattern\n .replaceAll('{name}', name)\n .replaceAll('{file}', file)\n .replaceAll('{path}', relPath);\n}\n\nfunction getSpanName(\n name: string,\n filePath: string,\n options: TransformOptions\n): string {\n if (options.namePattern) {\n return expandNamePattern(options.namePattern, name, filePath, process.cwd());\n }\n return name;\n}\n\nfunction shouldSkipName(name: string, options: TransformOptions): boolean {\n if (!options.skip?.length) return false;\n return options.skip.some((re) => re.test(name));\n}\n\nfunction isAlreadyWrapped(node: Node): boolean {\n const text = node.getText();\n const trimmed = text.trimStart();\n return trimmed.startsWith('trace(');\n}\n\nfunction bodyContainsSuper(body: Node): boolean {\n let found = false;\n body.forEachDescendant((desc) => {\n if (desc.getKind() === SyntaxKind.SuperKeyword) found = true;\n });\n return found;\n}\n\nfunction isGenerator(method: { isGenerator(): boolean }): boolean {\n return method.isGenerator?.() ?? false;\n}\n\nfunction isInsideTraceCall(node: Node): boolean {\n let current: Node | undefined = node.getParent();\n while (current) {\n if (current.getKind() === SyntaxKind.CallExpression) {\n const expr = (current as Node & { getExpression(): Node }).getExpression?.();\n if (expr?.getText() === 'trace') return true;\n }\n current = current.getParent();\n }\n return false;\n}\n\n/**\n * Transform a single file: wrap eligible functions in trace(), add import if needed.\n * No-op if no eligible functions or all skipped (no file change, no import added).\n */\nexport function transformFile(\n content: string,\n filePath: string,\n options: TransformOptions\n): TransformResult {\n const skipped: { name: string; reason: string }[] = [];\n let wrappedCount = 0;\n\n const project = new Project({ useInMemoryFileSystem: true });\n const sourceFile = project.createSourceFile(filePath, content);\n const edits: { node: Node; newText: string }[] = [];\n\n // Helper to record skip and return\n function skip(name: string, reason: string): boolean {\n skipped.push({ name, reason });\n return true;\n }\n\n // Default export function: ts-morph exposes it via getExportedDeclarations(\"default\"), not getExportAssignment\n const defaultDecls = sourceFile.getExportedDeclarations().get('default');\n const defaultFn =\n defaultDecls?.[0] &&\n (defaultDecls[0].getKind() === SyntaxKind.FunctionDeclaration ||\n defaultDecls[0].getKind() === SyntaxKind.FunctionExpression)\n ? defaultDecls[0]\n : undefined;\n const allFns = sourceFile.getFunctions().filter((f) => !f.isOverload());\n const onlyDefaultExportFn =\n defaultFn &&\n allFns.length === 1 &&\n (allFns[0] === defaultFn || allFns[0]!.getStart() === defaultFn.getStart());\n\n // 1. Function declarations (including export function); skip if file has only default export fn\n for (const fn of allFns) {\n if (onlyDefaultExportFn) continue; // handle in step 2 only\n if (isInsideTraceCall(fn)) continue; // inside trace() e.g. from prior replacement\n const name = fn.getName();\n if (!name) continue; // anonymous, skip for v1\n const spanName = getSpanName(name, filePath, options);\n if (shouldSkipName(spanName, options)) {\n skip(spanName, 'name match');\n continue;\n }\n if (isAlreadyWrapped(fn)) {\n skip(spanName, 'already wrapped');\n continue;\n }\n const mod = fn.getModifiers().map((m) => m.getText()).join(' ');\n const modPrefix = mod ? mod + ' ' : '';\n const fnText = fn.getText();\n const rest = fnText.replace(/^function\\s*\\w*\\s*/, '');\n const newText = `${modPrefix}const ${name} = trace('${spanName}', function ${name}${rest};`;\n edits.push({ node: fn, newText });\n wrappedCount += 1;\n }\n\n // 2. Default export function (export default function name() {})\n if (defaultFn) {\n const name = (defaultFn as { getName?: () => string }).getName?.();\n if (!name) {\n skip('(default export)', 'anonymous default export');\n } else {\n const spanName = getSpanName(name, filePath, options);\n if (shouldSkipName(spanName, options)) {\n skip(spanName, 'name match');\n } else {\n const fn = defaultFn as Node & { getParameters(): Node[]; getBody(): Node | undefined };\n const params = fn.getParameters?.() ?? [];\n const paramsText = params.map((p) => p.getText()).join(', ');\n const body = fn.getBody?.();\n const bodyText = body?.getText() ?? '{}';\n const decl = `const ${name} = trace('${spanName}', function ${name}(${paramsText}) ${bodyText};`;\n const full = decl + '\\nexport default ' + name + ';';\n edits.push({ node: defaultFn, newText: full });\n wrappedCount += 1;\n }\n }\n }\n\n // 3. Variable declarations with arrow or function expression\n for (const stmt of sourceFile.getVariableStatements()) {\n for (const decl of stmt.getDeclarationList().getDeclarations()) {\n const init = decl.getInitializer();\n if (!init) continue;\n const kind = init.getKind();\n const isArrow = kind === SyntaxKind.ArrowFunction;\n const isFnExpr = kind === SyntaxKind.FunctionExpression;\n const isCall = kind === SyntaxKind.CallExpression;\n if (isCall) {\n const callExpr = init as Node & { getExpression(): Node };\n const exprText = callExpr.getExpression().getText();\n if (exprText === 'trace') {\n const name = decl.getName();\n if (typeof name === 'string') {\n const spanName = getSpanName(name, filePath, options);\n skipped.push({ name: spanName, reason: 'already wrapped' });\n }\n continue;\n }\n }\n if (!isArrow && !isFnExpr) continue;\n const name = decl.getName();\n if (typeof name !== 'string') continue; // array/object binding\n const spanName = getSpanName(name, filePath, options);\n if (shouldSkipName(spanName, options)) {\n skip(spanName, 'name match');\n continue;\n }\n if (isAlreadyWrapped(init)) {\n skipped.push({ name: spanName, reason: 'already wrapped' });\n continue;\n }\n const initText = init.getText();\n const newInit = `trace('${spanName}', ${initText})`;\n edits.push({ node: init, newText: newInit });\n wrappedCount += 1;\n }\n }\n\n // 4. Class methods\n for (const clazz of sourceFile.getClasses()) {\n const className = clazz.getName();\n if (!className) continue;\n for (const _ctor of clazz.getConstructors()) {\n skipped.push({ name: `${className}.constructor`, reason: 'constructor' });\n }\n for (const method of clazz.getMethods()) {\n const getter = method.getFirstChildByKind(SyntaxKind.GetKeyword);\n const setter = method.getFirstChildByKind(SyntaxKind.SetKeyword);\n if (getter || setter) {\n skip(method.getName() ?? '(getter/setter)', 'getter/setter');\n continue;\n }\n if (isGenerator(method)) {\n skip(`${className}.${method.getName()}`, 'generator');\n continue;\n }\n const methodName = method.getName();\n const spanName = getSpanName(`${className}.${methodName}`, filePath, options);\n if (shouldSkipName(spanName, options)) {\n skip(spanName, 'name match');\n continue;\n }\n const body = method.getBody();\n if (!body) continue;\n if (bodyContainsSuper(body)) {\n skip(spanName, 'super');\n continue;\n }\n const bodyText = body.getText();\n const innerBody = bodyText.slice(1, -1).trim();\n const isAsync = method.isAsync();\n const prefix = isAsync ? 'async ' : '';\n const newBody = `{\\n return trace('${spanName}', ${prefix}() => {\\n${innerBody}\\n})();\\n}`;\n edits.push({ node: body, newText: newBody });\n wrappedCount += 1;\n }\n }\n\n // 5. Object method shorthand (const o = { method() {} })\n for (const stmt of sourceFile.getVariableStatements()) {\n for (const decl of stmt.getDeclarationList().getDeclarations()) {\n const init = decl.getInitializer();\n if (!init || init.getKind() !== SyntaxKind.ObjectLiteralExpression) continue;\n const obj = init as { getProperties(): Node[] };\n for (const prop of obj.getProperties()) {\n if (prop.getKind() !== SyntaxKind.MethodDeclaration) continue;\n const method = prop as Node & { getName(): string; getBody(): Node; isGenerator?(): boolean };\n const methodName = method.getName();\n const spanName = getSpanName(methodName, filePath, options);\n if (shouldSkipName(spanName, options)) {\n skip(spanName, 'name match');\n continue;\n }\n if (method.isGenerator?.()) {\n skip(spanName, 'generator');\n continue;\n }\n const body = method.getBody();\n if (!body) continue;\n if (bodyContainsSuper(body)) {\n skip(spanName, 'super');\n continue;\n }\n const bodyText = body.getText();\n const innerBody = bodyText.slice(1, -1).trim();\n const newBody = `{\\n return trace('${spanName}', () => {\\n${innerBody}\\n})();\\n}`;\n edits.push({ node: body, newText: newBody });\n wrappedCount += 1;\n }\n }\n }\n\n // Apply edits in reverse document order so positions stay valid\n edits.sort((a, b) => b.node.getStart() - a.node.getStart());\n for (const { node, newText } of edits) {\n node.replaceWithText(newText);\n }\n\n if (wrappedCount > 0 && !hasTraceImport(sourceFile)) {\n addTraceImport(sourceFile);\n }\n\n const modified = sourceFile.getFullText();\n const changed = wrappedCount > 0;\n\n return {\n modified: changed ? modified : content,\n changed,\n wrappedCount,\n skipped,\n };\n}\n","import { run } from './cli';\n\n// Run the CLI\nrun().catch((error) => {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n});\n"],"mappings":"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","names":["path","path","error","path","path","relative","path","backends","plugins","subscribers","prodPkgs","devPkgs","path","path","fs","execSync","execSync","execSync","path","glob","path","name","spanName","glob","verbose","error","fs","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/lib/project.ts","../src/lib/fs.ts","../src/lib/package-manager.ts","../src/lib/config-detector.ts","../src/lib/code-builder.ts","../src/lib/env-generator.ts","../src/lib/dependency-planner.ts","../src/presets/backends/datadog.ts","../src/presets/backends/honeycomb.ts","../src/presets/backends/otlp.ts","../src/presets/subscribers/posthog.ts","../src/presets/subscribers/mixpanel.ts","../src/presets/plugins/mongoose.ts","../src/presets/platforms/aws.ts","../src/presets/index.ts","../src/ui/prompts.ts","../src/ui/output.ts","../src/ui/spinner.ts","../src/lib/dependency-auditor.ts","../src/lib/esm-checker.ts","../src/lib/logger-checker.ts","../src/commands/doctor.ts","../src/commands/add.ts","../src/commands/codemod-trace.ts","../src/lib/codemod-trace.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport type { InitOptions, DoctorOptions, AddOptions, CodemodTraceOptions } from './types/index';\nimport { runInit } from './commands/init';\nimport { runDoctor } from './commands/doctor';\nimport { runAdd } from './commands/add';\nimport { runCodemodTrace } from './commands/codemod-trace';\n\n/**\n * Create the CLI program\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('autotel')\n .description('CLI for autotel - setup wizard, diagnostics, and incremental features')\n .version('0.1.0');\n\n // Global options\n const addGlobalOptions = (cmd: Command): Command => {\n return cmd\n .option('--cwd <path>', 'Target directory', process.cwd())\n .option('--verbose', 'Show detailed output')\n .option('--quiet', 'Only show warnings and errors');\n };\n\n // Init command\n const initCmd = new Command('init')\n .description('Initialize autotel in your project')\n .option('--dry-run', 'Skip installation and print what would be done')\n .option('--no-install', 'Generate files only, skip package installation')\n .option('--print-install-cmd', 'Output the install command without running it')\n .option('-y, --yes', 'Accept defaults, non-interactive')\n .option('--preset <name>', 'Use a quick preset (e.g., node-datadog-pino)')\n .option('--force', 'Overwrite existing config (creates backup first)')\n .option('--workspace-root', 'Install at workspace root instead of package root')\n .action(async (opts) => {\n const options: InitOptions = {\n cwd: opts.cwd ?? process.cwd(),\n dryRun: opts.dryRun ?? false,\n noInstall: opts.noInstall ?? false,\n printInstallCmd: opts.printInstallCmd ?? false,\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n workspaceRoot: opts.workspaceRoot ?? false,\n yes: opts.yes ?? false,\n preset: opts.preset,\n force: opts.force ?? false,\n };\n\n // --dry-run implies --no-install and --print-install-cmd\n if (options.dryRun) {\n options.noInstall = true;\n options.printInstallCmd = true;\n }\n\n await runInit(options);\n });\n\n addGlobalOptions(initCmd);\n program.addCommand(initCmd);\n\n // Doctor command\n const doctorCmd = new Command('doctor')\n .description('Run diagnostics on your autotel setup')\n .option('--json', 'Output machine-readable JSON')\n .option('--fix', 'Auto-fix resolvable issues')\n .option('--list-checks', 'List all available checks')\n .option('--env-file <path>', 'Specify env file to check')\n .action(async (opts) => {\n const options: DoctorOptions = {\n cwd: opts.cwd ?? process.cwd(),\n dryRun: false,\n noInstall: false,\n printInstallCmd: false,\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n workspaceRoot: false,\n json: opts.json ?? false,\n fix: opts.fix ?? false,\n listChecks: opts.listChecks ?? false,\n envFile: opts.envFile,\n };\n\n await runDoctor(options);\n });\n\n addGlobalOptions(doctorCmd);\n program.addCommand(doctorCmd);\n\n // Add command\n const addCmd = new Command('add')\n .description('Add a backend, subscriber, plugin, or platform')\n .argument('[type]', 'Preset type (backend, subscriber, plugin, platform)')\n .argument('[name]', 'Preset name (e.g., datadog, posthog, mongoose)')\n .option('--list', 'List available presets for the given type')\n .option('--dry-run', 'Skip installation and print what would be done')\n .option('--no-install', 'Generate files only, skip package installation')\n .option('--print-install-cmd', 'Output the install command without running it')\n .option('-y, --yes', 'Accept defaults, non-interactive')\n .option('--force', 'Overwrite non-CLI-owned config (creates backup first)')\n .option('--json', 'Output machine-readable JSON (for --list)')\n .option('--workspace-root', 'Install at workspace root instead of package root')\n .action(async (type, name, opts) => {\n const options: AddOptions = {\n cwd: opts.cwd ?? process.cwd(),\n dryRun: opts.dryRun ?? false,\n noInstall: opts.noInstall ?? false,\n printInstallCmd: opts.printInstallCmd ?? false,\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n workspaceRoot: opts.workspaceRoot ?? false,\n list: opts.list ?? false,\n yes: opts.yes ?? false,\n force: opts.force ?? false,\n json: opts.json ?? false,\n };\n\n // --dry-run implies --no-install and --print-install-cmd\n if (options.dryRun) {\n options.noInstall = true;\n options.printInstallCmd = true;\n }\n\n await runAdd(type, name, options);\n });\n\n addGlobalOptions(addCmd);\n program.addCommand(addCmd);\n\n // Codemod command\n const codemodCmd = new Command('codemod')\n .description('Codemod commands for adopting autotel');\n const traceCmd = new Command('trace')\n .description('Wrap functions in trace() with span name from function/variable/method name')\n .argument('<path>', 'File path or glob (e.g. src/index.ts, src/**/*.ts)')\n .option('--dry-run', 'Print changes without writing files')\n .option('--name-pattern <pattern>', 'Span name template: {name}, {file}, {path}')\n .option('--skip <regex>...', 'Skip functions whose name matches (repeatable)')\n .option('--print-files', 'Print per-file summary (wrapped count, skipped)')\n .action(async (pathArg: string, opts) => {\n const options: CodemodTraceOptions = {\n cwd: opts.cwd ?? process.cwd(),\n dryRun: opts.dryRun ?? false,\n noInstall: false,\n printInstallCmd: false,\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n workspaceRoot: false,\n path: pathArg,\n namePattern: opts.namePattern,\n skip: Array.isArray(opts.skip) && opts.skip.length > 0 ? opts.skip : undefined,\n printFiles: opts.printFiles ?? false,\n };\n await runCodemodTrace(options);\n });\n addGlobalOptions(traceCmd);\n codemodCmd.addCommand(traceCmd);\n addGlobalOptions(codemodCmd);\n program.addCommand(codemodCmd);\n\n return program;\n}\n\n/**\n * Run the CLI\n */\nexport async function run(): Promise<void> {\n const program = createProgram();\n await program.parseAsync(process.argv);\n}\n","import * as path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport type { InitOptions, Preset, EnvVar } from '../types/index';\nimport { discoverProject, getInstrumentationPath } from '../lib/project';\nimport { getInstallCommand } from '../lib/package-manager';\nimport { detectConfig } from '../lib/config-detector';\nimport {\n createCodeFile,\n addImport,\n setBackendConfig,\n addSubscriberConfig,\n addPluginInit,\n renderCodeFile,\n} from '../lib/code-builder';\nimport { generateEnvExample } from '../lib/env-generator';\nimport { atomicWrite, fileExists } from '../lib/fs';\nimport {\n buildDependencyPlan,\n getProdPackages,\n getDevPackages,\n} from '../lib/dependency-planner';\nimport {\n backends,\n subscribers,\n plugins,\n getQuickPreset,\n getPreset,\n} from '../presets/index';\nimport {\n promptRuntime,\n promptBackend,\n promptLogging,\n promptDatabases,\n promptSubscribers,\n promptAutoInstrumentation,\n promptStartupStyle,\n promptExistingConfigAction,\n} from '../ui/prompts';\nimport * as output from '../ui/output';\nimport { createSpinner, isCI } from '../ui/spinner';\n\n/**\n * Run the init command\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const spinner = createSpinner();\n\n // Set output mode\n if (options.verbose) {\n process.env['AUTOTEL_VERBOSE'] = 'true';\n }\n if (options.quiet) {\n process.env['AUTOTEL_QUIET'] = 'true';\n }\n\n // Discover project\n spinner.start('Discovering project...');\n const project = discoverProject(options.cwd);\n\n if (!project) {\n spinner.fail('No package.json found');\n output.error('Run this command in a directory with a package.json, or use --cwd');\n process.exit(1);\n }\n\n spinner.succeed(`Found ${project.packageJson.name ?? 'project'}`);\n output.verbose(`Package root: ${project.packageRoot}`);\n output.verbose(`Package manager: ${project.packageManager}`);\n\n // Check for existing config\n const existingConfig = detectConfig(project.packageRoot);\n\n if (existingConfig.found && !options.force) {\n output.info(`Existing instrumentation detected at ${existingConfig.path}`);\n\n if (options.yes || isCI()) {\n output.warn('Use --force to overwrite existing config');\n process.exit(0);\n }\n\n const action = await promptExistingConfigAction();\n if (action === 'abort') {\n output.info('Aborted');\n process.exit(0);\n }\n // For 'update' or 'new', continue with the flow\n }\n\n // Determine selections\n const selectedPresets: Preset[] = [];\n let autoInstrumentations: 'all' | 'none' | string[] = 'all';\n let startupStyle = 'node-esm';\n\n // Check for quick preset\n if (options.preset) {\n const quickPreset = getQuickPreset(options.preset);\n if (quickPreset) {\n output.info(`Using quick preset: ${quickPreset.name}`);\n const backendPreset = getPreset('backend', quickPreset.backend);\n if (backendPreset) {\n selectedPresets.push(backendPreset);\n }\n if (quickPreset.subscribers) {\n for (const sub of quickPreset.subscribers) {\n const subPreset = getPreset('subscriber', sub);\n if (subPreset) selectedPresets.push(subPreset);\n }\n }\n if (quickPreset.plugins) {\n for (const plug of quickPreset.plugins) {\n const plugPreset = getPreset('plugin', plug);\n if (plugPreset) selectedPresets.push(plugPreset);\n }\n }\n autoInstrumentations = quickPreset.autoInstrumentations;\n } else {\n output.error(`Unknown preset: ${options.preset}`);\n output.info('Available presets: node-datadog-pino, node-datadog-agent, node-honeycomb, node-otlp');\n process.exit(1);\n }\n } else if (options.yes || isCI()) {\n // Default profile for --yes\n output.info('Using defaults (local backend, all auto-instrumentations)');\n const localPreset = getPreset('backend', 'local');\n if (localPreset) {\n selectedPresets.push(localPreset);\n }\n } else {\n // Interactive prompts\n const runtime = await promptRuntime();\n output.verbose(`Runtime: ${runtime}`);\n\n // Backend\n const backendSlug = await promptBackend(backends);\n const backendPreset = getPreset('backend', backendSlug);\n if (backendPreset) {\n selectedPresets.push(backendPreset);\n }\n\n // Logging (future enhancement - not fully implemented)\n await promptLogging();\n\n // Databases/Plugins\n const pluginSlugs = await promptDatabases(plugins);\n for (const slug of pluginSlugs) {\n const preset = getPreset('plugin', slug);\n if (preset) selectedPresets.push(preset);\n }\n\n // Subscribers\n const subscriberSlugs = await promptSubscribers(subscribers);\n for (const slug of subscriberSlugs) {\n const preset = getPreset('subscriber', slug);\n if (preset) selectedPresets.push(preset);\n }\n\n // Auto-instrumentation\n const autoChoice = await promptAutoInstrumentation();\n if (autoChoice === 'none') {\n autoInstrumentations = 'none';\n } else if (autoChoice === 'specific') {\n // For now, just use all - specific selection would need another prompt\n autoInstrumentations = 'all';\n }\n\n // Startup style\n if (runtime === 'node') {\n startupStyle = await promptStartupStyle(project.hasTypeScript);\n }\n }\n\n // Build code file\n const codeFile = createCodeFile();\n\n // Add core imports\n addImport(codeFile, { source: 'autotel/register', sideEffect: true });\n addImport(codeFile, { source: 'autotel', specifiers: ['init'] });\n\n // Add preset imports and config\n for (const preset of selectedPresets) {\n for (const imp of preset.imports) {\n const section = preset.type === 'backend' || preset.type === 'platform' ? 'backend' :\n preset.type === 'plugin' ? 'plugin' :\n preset.type === 'subscriber' ? 'subscriber' : undefined;\n addImport(codeFile, imp, section);\n }\n\n if (preset.configBlock.section === 'BACKEND_CONFIG') {\n setBackendConfig(codeFile, preset.configBlock.code);\n } else if (preset.configBlock.section === 'SUBSCRIBERS_CONFIG') {\n addSubscriberConfig(codeFile, preset.configBlock.code);\n } else if (preset.configBlock.section === 'PLUGIN_INIT') {\n addPluginInit(codeFile, preset.configBlock.code);\n }\n }\n\n // If no backend config was set, add placeholder\n if (!codeFile.backendConfig) {\n setBackendConfig(codeFile, '// Local/console mode - no backend configured');\n }\n\n const instrumentationContent = renderCodeFile(codeFile);\n\n // Build dependency plan\n const depPlan = buildDependencyPlan({\n presets: selectedPresets,\n autoInstrumentations,\n });\n\n // Collect env vars\n const envVars: EnvVar[] = [];\n for (const preset of selectedPresets) {\n envVars.push(...preset.env.required, ...preset.env.optional);\n }\n\n const envExampleContent = generateEnvExample(envVars);\n\n // Determine paths\n const instrumentationPath = getInstrumentationPath(project.packageRoot, project.hasTypeScript);\n const envExamplePath = path.join(project.packageRoot, '.env.example');\n\n // Dry run - just print what would happen\n if (options.dryRun) {\n output.heading('\\nDry run - no files will be written\\n');\n\n output.info(`Would write: ${path.relative(project.cwd, instrumentationPath)}`);\n console.log('---');\n console.log(instrumentationContent);\n console.log('---\\n');\n\n if (envExampleContent) {\n output.info(`Would write: ${path.relative(project.cwd, envExamplePath)}`);\n console.log('---');\n console.log(envExampleContent);\n console.log('---\\n');\n }\n\n const prodPkgs = getProdPackages(depPlan);\n const devPkgs = getDevPackages(depPlan);\n\n if (prodPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, prodPkgs);\n output.info(`Would run: ${cmd}`);\n }\n if (devPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, devPkgs, { dev: true });\n output.info(`Would run: ${cmd}`);\n }\n\n process.exit(0);\n }\n\n // Write files\n spinner.start('Writing instrumentation file...');\n const { backupPath: instrBackup } = atomicWrite(instrumentationPath, instrumentationContent, {\n root: project.packageRoot,\n backup: options.force,\n });\n if (instrBackup) {\n output.verbose(`Backup created: ${instrBackup}`);\n }\n spinner.succeed(`Wrote ${path.relative(project.cwd, instrumentationPath)}`);\n\n // Write .env.example if we have env vars\n if (envExampleContent && !fileExists(envExamplePath)) {\n spinner.start('Writing .env.example...');\n atomicWrite(envExamplePath, envExampleContent, { root: project.packageRoot });\n spinner.succeed(`Wrote ${path.relative(project.cwd, envExamplePath)}`);\n }\n\n // Install dependencies\n const prodPkgs = getProdPackages(depPlan);\n const devPkgs = getDevPackages(depPlan);\n\n if (!options.noInstall && (prodPkgs.length > 0 || devPkgs.length > 0)) {\n if (prodPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, prodPkgs);\n if (options.printInstallCmd) {\n output.info(`Install command: ${cmd}`);\n } else {\n spinner.start('Installing dependencies...');\n try {\n execSync(cmd, { cwd: project.packageRoot, stdio: 'pipe' });\n spinner.succeed('Dependencies installed');\n } catch {\n spinner.fail('Failed to install dependencies');\n output.error(`Run manually: ${cmd}`);\n }\n }\n }\n\n if (devPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, devPkgs, { dev: true });\n if (options.printInstallCmd) {\n output.info(`Install command (dev): ${cmd}`);\n } else {\n spinner.start('Installing dev dependencies...');\n try {\n execSync(cmd, { cwd: project.packageRoot, stdio: 'pipe' });\n spinner.succeed('Dev dependencies installed');\n } catch {\n spinner.fail('Failed to install dev dependencies');\n output.error(`Run manually: ${cmd}`);\n }\n }\n }\n } else if (options.noInstall && (prodPkgs.length > 0 || devPkgs.length > 0)) {\n output.info('Skipping installation (--no-install)');\n if (prodPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, prodPkgs);\n output.dim(`Run: ${cmd}`);\n }\n if (devPkgs.length > 0) {\n const cmd = getInstallCommand(project.packageManager, devPkgs, { dev: true });\n output.dim(`Run: ${cmd}`);\n }\n }\n\n // Print next steps\n const relInstrPath = path.relative(project.packageRoot, instrumentationPath);\n\n let nextStepCmd: string;\n switch (startupStyle) {\n case 'tsx':\n nextStepCmd = `tsx --import ./${relInstrPath} src/index.ts`;\n break;\n case 'node-esm':\n default:\n nextStepCmd = `node --import ./${relInstrPath} dist/index.js`;\n }\n\n // Print footer\n const pmInfo = project.workspace.isMonorepo\n ? `${project.packageManager} workspace, package root ${project.packageRoot}`\n : `${project.packageManager}`;\n\n const writtenFiles = [path.relative(project.cwd, instrumentationPath)];\n if (envExampleContent && !fileExists(envExamplePath)) {\n writtenFiles.push('.env.example');\n }\n\n console.log(output.formatFooter({\n detected: pmInfo,\n wrote: writtenFiles,\n next: nextStepCmd,\n }));\n\n // Print additional next steps from presets\n const allNextSteps = selectedPresets.flatMap((p) => p.nextSteps);\n if (allNextSteps.length > 0) {\n console.log('\\nNext steps:');\n for (const step of allNextSteps) {\n console.log(` - ${step}`);\n }\n }\n}\n","import * as path from 'node:path';\nimport type { PackageJson, ProjectContext, WorkspaceInfo } from '../types/index';\nimport { fileExists, dirExists, readJsonSafe, findUpward } from './fs';\nimport { detectPackageManager, detectWorkspaceRoot } from './package-manager';\n\n/**\n * Find package.json starting from cwd, walking up if needed\n */\nexport function findPackageJson(startDir: string): {\n packageJsonPath: string;\n packageRoot: string;\n} | null {\n const packageJsonPath = findUpward(startDir, 'package.json');\n if (!packageJsonPath) {\n return null;\n }\n return {\n packageJsonPath,\n packageRoot: path.dirname(packageJsonPath),\n };\n}\n\n/**\n * Detect if project uses TypeScript\n */\nexport function detectTypeScript(packageRoot: string): boolean {\n // Check for tsconfig.json\n if (fileExists(path.join(packageRoot, 'tsconfig.json'))) {\n return true;\n }\n\n // Check for typescript in dependencies\n const pkgJson = readJsonSafe<PackageJson>(path.join(packageRoot, 'package.json'));\n if (pkgJson) {\n const deps = { ...pkgJson.dependencies, ...pkgJson.devDependencies };\n if ('typescript' in deps) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Detect if project uses ESM\n */\nexport function detectEsm(packageJson: PackageJson): boolean {\n return packageJson.type === 'module';\n}\n\n/**\n * Build workspace info\n */\nexport function buildWorkspaceInfo(\n packageRoot: string,\n cwd: string\n): WorkspaceInfo {\n const { workspaceRoot, workspaceType } = detectWorkspaceRoot(cwd);\n\n return {\n isMonorepo: workspaceRoot !== null && workspaceRoot !== packageRoot,\n workspaceRoot,\n packageRoot,\n workspaceType,\n };\n}\n\n/**\n * Discover project context from a directory\n */\nexport function discoverProject(cwd: string): ProjectContext | null {\n const resolvedCwd = path.resolve(cwd);\n\n // Find package.json\n const pkgResult = findPackageJson(resolvedCwd);\n if (!pkgResult) {\n return null;\n }\n\n const { packageJsonPath, packageRoot } = pkgResult;\n\n // Read package.json\n const packageJson = readJsonSafe<PackageJson>(packageJsonPath);\n if (!packageJson) {\n return null;\n }\n\n // Detect package manager\n const { packageManager, lockfilePath } = detectPackageManager(packageRoot);\n\n // Build workspace info\n const workspace = buildWorkspaceInfo(packageRoot, resolvedCwd);\n\n // Detect features\n const hasTypeScript = detectTypeScript(packageRoot);\n const isEsm = detectEsm(packageJson);\n\n return {\n cwd: resolvedCwd,\n packageRoot,\n packageJson,\n packageJsonPath,\n packageManager,\n lockfilePath,\n workspace,\n hasTypeScript,\n isEsm,\n };\n}\n\n/**\n * Get common entrypoint candidates\n */\nexport function getEntrypointCandidates(packageRoot: string): string[] {\n const candidates = [\n 'src/index.ts',\n 'src/main.ts',\n 'src/index.mts',\n 'src/main.mts',\n 'server.ts',\n 'app.ts',\n 'index.ts',\n 'src/index.js',\n 'src/main.js',\n 'server.js',\n 'app.js',\n 'index.js',\n ];\n\n return candidates\n .map((c) => path.join(packageRoot, c))\n .filter((p) => fileExists(p));\n}\n\n/**\n * Get instrumentation file path based on project conventions\n */\nexport function getInstrumentationPath(\n packageRoot: string,\n hasTypeScript: boolean\n): string {\n // Check if src/ exists (as directory or has files inside)\n const srcDir = path.join(packageRoot, 'src');\n const hasSrcDir = dirExists(srcDir) ||\n fileExists(path.join(packageRoot, 'src', 'index.ts')) ||\n fileExists(path.join(packageRoot, 'src', 'index.js'));\n\n const dir = hasSrcDir ? path.join(packageRoot, 'src') : packageRoot;\n const ext = hasTypeScript ? 'mts' : 'mjs';\n\n return path.join(dir, `instrumentation.${ext}`);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { randomBytes } from 'node:crypto';\n\n/**\n * Check if a path is within the allowed root directory\n */\nexport function isPathWithinRoot(targetPath: string, rootPath: string): boolean {\n const resolvedTarget = path.resolve(targetPath);\n const resolvedRoot = path.resolve(rootPath);\n return resolvedTarget.startsWith(resolvedRoot + path.sep) || resolvedTarget === resolvedRoot;\n}\n\n/**\n * Ensure parent directory exists\n */\nexport function ensureDir(filePath: string): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Read file safely, returning null if not found\n */\nexport function readFileSafe(filePath: string): string | null {\n try {\n return fs.readFileSync(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\n/**\n * Check if file exists\n */\nexport function fileExists(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Check if directory exists\n */\nexport function dirExists(dirPath: string): boolean {\n try {\n return fs.statSync(dirPath).isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Create backup of a file with .bak extension\n */\nexport function createBackup(filePath: string): string | null {\n if (!fileExists(filePath)) {\n return null;\n }\n const backupPath = `${filePath}.bak`;\n fs.copyFileSync(filePath, backupPath);\n return backupPath;\n}\n\n/**\n * Atomic write - write to temp file then rename\n */\nexport function atomicWrite(\n filePath: string,\n content: string,\n options: { root: string; backup?: boolean }\n): { backupPath: string | null } {\n const resolvedPath = path.resolve(filePath);\n\n // Security: ensure we're writing within root\n if (!isPathWithinRoot(resolvedPath, options.root)) {\n throw new Error(\n `Path traversal detected: ${filePath} resolves outside root ${options.root}`\n );\n }\n\n // Create backup if requested and file exists\n let backupPath: string | null = null;\n if (options.backup && fileExists(resolvedPath)) {\n backupPath = createBackup(resolvedPath);\n }\n\n // Ensure parent directory exists\n ensureDir(resolvedPath);\n\n // Write to temp file first\n const tempPath = `${resolvedPath}.${randomBytes(4).toString('hex')}.tmp`;\n\n try {\n fs.writeFileSync(tempPath, content, 'utf8');\n fs.renameSync(tempPath, resolvedPath);\n } catch (error) {\n // Clean up temp file on error\n try {\n fs.unlinkSync(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n\n return { backupPath };\n}\n\n/**\n * Read JSON file safely\n */\nexport function readJsonSafe<T>(filePath: string): T | null {\n const content = readFileSafe(filePath);\n if (content === null) {\n return null;\n }\n try {\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Find a file by walking up the directory tree\n */\nexport function findUpward(\n startDir: string,\n filename: string,\n stopAtRoot = true\n): string | null {\n let currentDir = path.resolve(startDir);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const filePath = path.join(currentDir, filename);\n if (fileExists(filePath)) {\n return filePath;\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n if (stopAtRoot && currentDir === root) {\n break;\n }\n }\n\n // Check root as well\n const rootFilePath = path.join(root, filename);\n if (fileExists(rootFilePath)) {\n return rootFilePath;\n }\n\n return null;\n}\n\n/**\n * Find all files matching a pattern by walking up\n */\nexport function findAllUpward(\n startDir: string,\n filenames: string[]\n): Map<string, string> {\n const found = new Map<string, string>();\n let currentDir = path.resolve(startDir);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n for (const filename of filenames) {\n if (!found.has(filename)) {\n const filePath = path.join(currentDir, filename);\n if (fileExists(filePath)) {\n found.set(filename, filePath);\n }\n }\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return found;\n}\n","import * as path from 'node:path';\nimport type { PackageManager } from '../types/index';\nimport { fileExists, findAllUpward, readFileSafe } from './fs';\n\n/**\n * Lockfile to package manager mapping\n */\nconst LOCKFILE_MAP: Record<string, PackageManager> = {\n 'pnpm-lock.yaml': 'pnpm',\n 'bun.lockb': 'bun',\n 'yarn.lock': 'yarn',\n 'package-lock.json': 'npm',\n};\n\n/**\n * All lockfile names in priority order\n */\nconst LOCKFILES = ['pnpm-lock.yaml', 'bun.lockb', 'yarn.lock', 'package-lock.json'];\n\n/**\n * Priority order when multiple lockfiles at same level (pnpm > bun > yarn > npm)\n */\nconst PM_PRIORITY: PackageManager[] = ['pnpm', 'bun', 'yarn', 'npm'];\n\n/**\n * Detect package manager from nearest lockfile\n * Algorithm: Find closest lockfile to cwd, working upward\n */\nexport function detectPackageManager(startDir: string): {\n packageManager: PackageManager;\n lockfilePath: string | null;\n} {\n const foundLockfiles = findAllUpward(startDir, LOCKFILES);\n\n if (foundLockfiles.size === 0) {\n return { packageManager: 'npm', lockfilePath: null };\n }\n\n // Find the closest lockfile (deepest path = closest to startDir)\n let closestLockfile: string | null = null;\n let closestDepth = -1;\n let closestPM: PackageManager = 'npm';\n\n for (const [lockfileName, lockfilePath] of foundLockfiles) {\n const depth = lockfilePath.split(path.sep).length;\n const pm = LOCKFILE_MAP[lockfileName];\n\n if (pm === undefined) continue;\n\n // Deeper path = closer to startDir (wins), or same depth with higher priority\n if (\n depth > closestDepth ||\n (depth === closestDepth && PM_PRIORITY.indexOf(pm) < PM_PRIORITY.indexOf(closestPM))\n ) {\n closestDepth = depth;\n closestLockfile = lockfilePath;\n closestPM = pm;\n }\n }\n\n return {\n packageManager: closestPM,\n lockfilePath: closestLockfile,\n };\n}\n\n/**\n * Get install command for a package manager\n */\nexport function getInstallCommand(\n pm: PackageManager,\n packages: string[],\n options: { dev?: boolean; workspaceRoot?: boolean } = {}\n): string {\n const pkgList = packages.join(' ');\n const { dev = false, workspaceRoot = false } = options;\n\n switch (pm) {\n case 'pnpm': {\n const devFlag = dev ? ' -D' : '';\n const wsFlag = workspaceRoot ? ' -w' : '';\n return `pnpm add${devFlag}${wsFlag} ${pkgList}`;\n }\n case 'bun': {\n const devFlag = dev ? ' -d' : '';\n return `bun add${devFlag} ${pkgList}`;\n }\n case 'yarn': {\n const devFlag = dev ? ' -D' : '';\n const wsFlag = workspaceRoot ? ' -W' : '';\n return `yarn add${devFlag}${wsFlag} ${pkgList}`;\n }\n case 'npm':\n default: {\n const devFlag = dev ? ' --save-dev' : '';\n return `npm install${devFlag} ${pkgList}`;\n }\n }\n}\n\n/**\n * Get run command for a package manager\n */\nexport function getRunCommand(pm: PackageManager, script: string): string {\n switch (pm) {\n case 'pnpm':\n return `pnpm ${script}`;\n case 'bun':\n return `bun run ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'npm':\n default:\n return `npm run ${script}`;\n }\n}\n\n/**\n * Get exec command for a package manager (npx equivalent)\n */\nexport function getExecCommand(pm: PackageManager): string {\n switch (pm) {\n case 'pnpm':\n return 'pnpm dlx';\n case 'bun':\n return 'bunx';\n case 'yarn':\n return 'yarn dlx';\n case 'npm':\n default:\n return 'npx';\n }\n}\n\n/**\n * Detect workspace root markers\n */\nexport function detectWorkspaceRoot(startDir: string): {\n workspaceRoot: string | null;\n workspaceType: 'pnpm' | 'yarn' | 'npm' | 'lerna' | null;\n} {\n let currentDir = path.resolve(startDir);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n // Check for pnpm workspace\n if (fileExists(path.join(currentDir, 'pnpm-workspace.yaml'))) {\n return { workspaceRoot: currentDir, workspaceType: 'pnpm' };\n }\n\n // Check for Lerna\n if (fileExists(path.join(currentDir, 'lerna.json'))) {\n return { workspaceRoot: currentDir, workspaceType: 'lerna' };\n }\n\n // Check for workspaces in package.json\n const pkgJsonPath = path.join(currentDir, 'package.json');\n const pkgJsonContent = readFileSafe(pkgJsonPath);\n if (pkgJsonContent) {\n try {\n const pkgJson = JSON.parse(pkgJsonContent) as { workspaces?: unknown };\n if (pkgJson.workspaces) {\n // Determine if yarn or npm based on lockfile\n const hasYarnLock = fileExists(path.join(currentDir, 'yarn.lock'));\n return {\n workspaceRoot: currentDir,\n workspaceType: hasYarnLock ? 'yarn' : 'npm',\n };\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return { workspaceRoot: null, workspaceType: null };\n}\n","import * as path from 'node:path';\nimport type { ConfigDetection, InstrumentationFile, InstrumentationSection } from '../types/index';\nimport { fileExists, readFileSafe } from './fs';\nimport { hasCliOwnershipHeader, getSectionMarkers } from './code-builder';\n\n/**\n * Common instrumentation file locations\n */\nconst INSTRUMENTATION_LOCATIONS = [\n 'src/instrumentation.mts',\n 'src/instrumentation.ts',\n 'src/instrumentation.mjs',\n 'src/instrumentation.js',\n 'instrumentation.mts',\n 'instrumentation.ts',\n 'instrumentation.mjs',\n 'instrumentation.js',\n];\n\n/**\n * Find instrumentation file\n */\nexport function findInstrumentationFile(packageRoot: string): InstrumentationFile | null {\n for (const location of INSTRUMENTATION_LOCATIONS) {\n const filePath = path.join(packageRoot, location);\n if (fileExists(filePath)) {\n const content = readFileSafe(filePath);\n if (content === null) {\n continue;\n }\n\n const isCliOwned = hasCliOwnershipHeader(content);\n const markerStrings = getSectionMarkers(content);\n const sections = markerStrings.filter((m): m is InstrumentationSection =>\n ['BACKEND', 'PLUGINS', 'SUBSCRIBERS', 'BACKEND_CONFIG', 'SUBSCRIBERS_CONFIG', 'PLUGIN_INIT'].includes(m)\n );\n\n return {\n path: filePath,\n isCliOwned,\n sections,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Check for autotel.yaml config\n */\nexport function findAutotelYaml(packageRoot: string): string | null {\n const candidates = ['autotel.yaml', 'autotel.yml', '.autotelrc.yaml', '.autotelrc.yml'];\n for (const candidate of candidates) {\n const filePath = path.join(packageRoot, candidate);\n if (fileExists(filePath)) {\n return filePath;\n }\n }\n return null;\n}\n\n/**\n * Detect existing configuration\n */\nexport function detectConfig(packageRoot: string): ConfigDetection {\n // Check for CLI-owned instrumentation file\n const instrumentationFile = findInstrumentationFile(packageRoot);\n if (instrumentationFile?.isCliOwned) {\n return {\n found: true,\n type: 'cli-owned',\n path: instrumentationFile.path,\n instrumentationFile,\n };\n }\n\n // Check for user-created instrumentation file\n if (instrumentationFile && !instrumentationFile.isCliOwned) {\n return {\n found: true,\n type: 'user-created',\n path: instrumentationFile.path,\n instrumentationFile,\n };\n }\n\n // Check for autotel.yaml\n const yamlPath = findAutotelYaml(packageRoot);\n if (yamlPath) {\n return {\n found: true,\n type: 'autotel-yaml',\n path: yamlPath,\n instrumentationFile: null,\n };\n }\n\n return {\n found: false,\n type: 'none',\n path: null,\n instrumentationFile: null,\n };\n}\n\n/**\n * Check if a specific feature is already configured\n */\nexport function isFeatureConfigured(\n instrumentationFile: InstrumentationFile,\n feature: 'backend' | 'subscriber' | 'plugin' | 'platform'\n): boolean {\n switch (feature) {\n case 'backend':\n case 'platform':\n return instrumentationFile.sections.includes('BACKEND') ||\n instrumentationFile.sections.includes('BACKEND_CONFIG');\n case 'subscriber':\n return instrumentationFile.sections.includes('SUBSCRIBERS') ||\n instrumentationFile.sections.includes('SUBSCRIBERS_CONFIG');\n case 'plugin':\n return instrumentationFile.sections.includes('PLUGINS') ||\n instrumentationFile.sections.includes('PLUGIN_INIT');\n }\n}\n","import type { Import } from '../types/index';\n\n/**\n * CLI ownership header comment\n */\nconst CLI_HEADER = `/**\n * autotel instrumentation - managed by autotel-cli\n * Run \\`autotel add <feature>\\` to update this file\n */`;\n\n/**\n * Section marker format\n */\nconst SECTION_MARKER = (name: string): string => `// --- AUTOTEL:${name} ---`;\n\n/**\n * Code file structure\n */\nexport interface CodeFile {\n imports: Import[];\n backendImports: Import[];\n pluginImports: Import[];\n subscriberImports: Import[];\n backendConfig: string | null;\n subscribersConfig: string[];\n pluginInit: string[];\n}\n\n/**\n * Create empty code file\n */\nexport function createCodeFile(): CodeFile {\n return {\n imports: [],\n backendImports: [],\n pluginImports: [],\n subscriberImports: [],\n backendConfig: null,\n subscribersConfig: [],\n pluginInit: [],\n };\n}\n\n/**\n * Add import to code file\n */\nexport function addImport(file: CodeFile, imp: Import, section?: 'backend' | 'plugin' | 'subscriber'): void {\n switch (section) {\n case 'backend':\n file.backendImports.push(imp);\n break;\n case 'plugin':\n file.pluginImports.push(imp);\n break;\n case 'subscriber':\n file.subscriberImports.push(imp);\n break;\n default:\n file.imports.push(imp);\n }\n}\n\n/**\n * Set backend config\n */\nexport function setBackendConfig(file: CodeFile, config: string): void {\n file.backendConfig = config;\n}\n\n/**\n * Add subscriber config\n */\nexport function addSubscriberConfig(file: CodeFile, config: string): void {\n file.subscribersConfig.push(config);\n}\n\n/**\n * Add plugin init\n */\nexport function addPluginInit(file: CodeFile, init: string): void {\n file.pluginInit.push(init);\n}\n\n/**\n * Sort imports for stable output\n * Order: side-effect (autotel/register first), external packages, relative imports\n */\nfunction sortImports(imports: Import[]): Import[] {\n const sideEffect: Import[] = [];\n const external: Import[] = [];\n const relative: Import[] = [];\n\n for (const imp of imports) {\n if (imp.sideEffect) {\n // autotel/register should be first among side-effects\n if (imp.source === 'autotel/register') {\n sideEffect.unshift(imp);\n } else {\n sideEffect.push(imp);\n }\n } else if (imp.source.startsWith('.') || imp.source.startsWith('/')) {\n relative.push(imp);\n } else {\n external.push(imp);\n }\n }\n\n // Sort each group alphabetically by source\n const sortBySource = (a: Import, b: Import): number => a.source.localeCompare(b.source);\n external.sort(sortBySource);\n relative.sort(sortBySource);\n\n return [...sideEffect, ...external, ...relative];\n}\n\n/**\n * Render single import statement\n */\nfunction renderImport(imp: Import): string {\n if (imp.sideEffect) {\n return `import '${imp.source}';`;\n }\n\n const parts: string[] = [];\n\n if (imp.default) {\n parts.push(imp.default);\n }\n\n if (imp.specifiers && imp.specifiers.length > 0) {\n const specifiers = imp.specifiers.join(', ');\n parts.push(`{ ${specifiers} }`);\n }\n\n if (parts.length === 0) {\n return `import '${imp.source}';`;\n }\n\n return `import ${parts.join(', ')} from '${imp.source}';`;\n}\n\n/**\n * Render imports section\n */\nfunction renderImports(imports: Import[]): string {\n if (imports.length === 0) {\n return '';\n }\n const sorted = sortImports(imports);\n return sorted.map(renderImport).join('\\n');\n}\n\n/**\n * Render code file to string\n */\nexport function renderCodeFile(file: CodeFile): string {\n // Header\n const lines: string[] = [CLI_HEADER, ''];\n\n // Main imports (autotel/register first)\n const mainImports = sortImports(file.imports);\n if (mainImports.length > 0) {\n lines.push(renderImports(mainImports));\n lines.push('');\n }\n\n // Backend imports\n if (file.backendImports.length > 0) {\n lines.push(SECTION_MARKER('BACKEND'));\n lines.push(renderImports(file.backendImports));\n lines.push('');\n }\n\n // Plugin imports\n if (file.pluginImports.length > 0) {\n lines.push(SECTION_MARKER('PLUGINS'));\n lines.push(renderImports(file.pluginImports));\n lines.push('');\n }\n\n // Subscriber imports\n if (file.subscriberImports.length > 0) {\n lines.push(SECTION_MARKER('SUBSCRIBERS'));\n lines.push(renderImports(file.subscriberImports));\n lines.push('');\n }\n\n // Init call\n lines.push('init({');\n\n // Backend config\n if (file.backendConfig) {\n lines.push(' ' + SECTION_MARKER('BACKEND_CONFIG'));\n lines.push(` ${file.backendConfig}`);\n }\n\n // Subscribers config\n if (file.subscribersConfig.length > 0) {\n lines.push('');\n lines.push(' ' + SECTION_MARKER('SUBSCRIBERS_CONFIG'));\n lines.push(' subscribers: [');\n for (const sub of file.subscribersConfig) {\n lines.push(` ${sub}`);\n }\n lines.push(' ],');\n }\n\n lines.push('});');\n\n // Plugin init\n if (file.pluginInit.length > 0) {\n lines.push('');\n lines.push(SECTION_MARKER('PLUGIN_INIT'));\n for (const init of file.pluginInit) {\n lines.push(init);\n }\n }\n\n // Ensure file ends with newline\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Check if content has CLI ownership header\n */\nexport function hasCliOwnershipHeader(content: string): boolean {\n return content.includes('autotel instrumentation - managed by autotel-cli');\n}\n\n/**\n * Check if content has a specific section marker\n */\nexport function hasSectionMarker(content: string, section: string): boolean {\n return content.includes(SECTION_MARKER(section));\n}\n\n/**\n * Get all section markers present in content\n */\nexport function getSectionMarkers(content: string): string[] {\n const markers: string[] = [];\n const regex = /\\/\\/ --- AUTOTEL:(\\w+) ---/g;\n let match;\n while ((match = regex.exec(content)) !== null) {\n if (match[1]) {\n markers.push(match[1]);\n }\n }\n return markers;\n}\n\n/**\n * Build minimal instrumentation file (for --yes defaults)\n */\nexport function buildMinimalInstrumentation(): string {\n const file = createCodeFile();\n\n // Add core imports\n addImport(file, { source: 'autotel/register', sideEffect: true });\n addImport(file, { source: 'autotel', specifiers: ['init'] });\n\n // No backend config for local/console default\n file.backendConfig = '// Local/console mode - no backend configured';\n\n return renderCodeFile(file);\n}\n","import * as path from 'node:path';\nimport type { EnvVar } from '../types/index';\nimport { fileExists, readFileSafe } from './fs';\nimport { glob } from 'glob';\n\n/**\n * Generate .env.example content from env vars\n */\nexport function generateEnvExample(envVars: EnvVar[]): string {\n if (envVars.length === 0) {\n return '';\n }\n\n const lines: string[] = [\n '# Autotel configuration',\n '# Copy to .env and fill in values',\n '',\n ];\n\n for (const envVar of envVars) {\n // Add description as comment\n lines.push(`# ${envVar.description}`);\n\n // Add sensitivity warning\n if (envVar.sensitive) {\n lines.push('# ⚠️ SENSITIVE: Do not commit this value');\n }\n\n // Add example or placeholder\n const value = envVar.example ?? '';\n lines.push(`${envVar.name}=${value}`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Parse env file into key-value pairs\n */\nexport function parseEnvFile(content: string): Map<string, string> {\n const vars = new Map<string, string>();\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip comments and empty lines\n if (trimmed.startsWith('#') || trimmed === '') {\n continue;\n }\n\n // Parse key=value\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex > 0) {\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // Remove quotes if present\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n\n vars.set(key, value);\n }\n }\n\n return vars;\n}\n\n/**\n * Find all env files in a directory\n */\nexport async function findEnvFiles(packageRoot: string): Promise<string[]> {\n const patterns = ['.env', '.env.local', '.env.*'];\n const files: string[] = [];\n\n for (const pattern of patterns) {\n try {\n const matches = await glob(pattern, {\n cwd: packageRoot,\n absolute: true,\n dot: true,\n });\n files.push(...matches);\n } catch {\n // Ignore glob errors\n }\n }\n\n // Remove duplicates and filter existing files\n return [...new Set(files)].filter((f) => fileExists(f));\n}\n\n/**\n * Check if env var is present in any env file\n */\nexport async function checkEnvVarPresent(\n packageRoot: string,\n varName: string,\n specificFile?: string\n): Promise<{ found: boolean; file: string | null }> {\n const files = specificFile\n ? [path.resolve(packageRoot, specificFile)]\n : await findEnvFiles(packageRoot);\n\n for (const file of files) {\n const content = readFileSafe(file);\n if (content === null) {\n continue;\n }\n\n const vars = parseEnvFile(content);\n if (vars.has(varName)) {\n return { found: true, file };\n }\n }\n\n return { found: false, file: null };\n}\n\n/**\n * Check multiple env vars presence\n */\nexport async function checkEnvVarsPresent(\n packageRoot: string,\n varNames: string[],\n specificFile?: string\n): Promise<Map<string, { found: boolean; file: string | null }>> {\n const results = new Map<string, { found: boolean; file: string | null }>();\n\n for (const varName of varNames) {\n const result = await checkEnvVarPresent(packageRoot, varName, specificFile);\n results.set(varName, result);\n }\n\n return results;\n}\n","import type { Preset, PackageRequirements } from '../types/index';\n\n/**\n * Dependency plan for installation\n */\nexport interface DependencyPlan {\n required: string[];\n optional: string[];\n devOnly: string[];\n}\n\n/**\n * Create empty dependency plan\n */\nexport function createDependencyPlan(): DependencyPlan {\n return {\n required: [],\n optional: [],\n devOnly: [],\n };\n}\n\n/**\n * Merge packages into plan without duplicates\n */\nfunction mergePackages(target: string[], source: string[]): void {\n for (const pkg of source) {\n if (!target.includes(pkg)) {\n target.push(pkg);\n }\n }\n}\n\n/**\n * Add preset packages to dependency plan\n */\nexport function addPresetToPlan(plan: DependencyPlan, preset: Preset): void {\n mergePackages(plan.required, preset.packages.required);\n mergePackages(plan.optional, preset.packages.optional);\n mergePackages(plan.devOnly, preset.packages.devOnly);\n}\n\n/**\n * Add multiple presets to dependency plan\n */\nexport function addPresetsToPlan(plan: DependencyPlan, presets: Preset[]): void {\n for (const preset of presets) {\n addPresetToPlan(plan, preset);\n }\n}\n\n/**\n * Get all packages that should be installed\n */\nexport function getProdPackages(plan: DependencyPlan): string[] {\n return [...plan.required, ...plan.optional];\n}\n\n/**\n * Get dev packages that should be installed\n */\nexport function getDevPackages(plan: DependencyPlan): string[] {\n return [...plan.devOnly];\n}\n\n/**\n * Add core autotel packages\n */\nexport function addCorePackages(plan: DependencyPlan): void {\n mergePackages(plan.required, ['autotel']);\n}\n\n/**\n * Add auto-instrumentation packages\n */\nexport function addAutoInstrumentationPackages(\n plan: DependencyPlan,\n selection: 'all' | 'none' | string[]\n): void {\n if (selection === 'none') {\n return;\n }\n\n if (selection === 'all') {\n mergePackages(plan.required, ['@opentelemetry/auto-instrumentations-node']);\n return;\n }\n\n // Specific instrumentations\n for (const name of selection) {\n mergePackages(plan.required, [`@opentelemetry/instrumentation-${name}`]);\n }\n}\n\n/**\n * Build dependency plan from selections\n */\nexport function buildDependencyPlan(options: {\n presets: Preset[];\n autoInstrumentations: 'all' | 'none' | string[];\n}): DependencyPlan {\n const plan = createDependencyPlan();\n\n // Add core\n addCorePackages(plan);\n\n // Add presets\n addPresetsToPlan(plan, options.presets);\n\n // Add auto-instrumentations\n addAutoInstrumentationPackages(plan, options.autoInstrumentations);\n\n return plan;\n}\n\n/**\n * Combine package requirements\n */\nexport function combinePackageRequirements(\n requirements: PackageRequirements[]\n): PackageRequirements {\n const combined: PackageRequirements = {\n required: [],\n optional: [],\n devOnly: [],\n };\n\n for (const req of requirements) {\n mergePackages(combined.required, req.required);\n mergePackages(combined.optional, req.optional);\n mergePackages(combined.devOnly, req.devOnly);\n }\n\n return combined;\n}\n","import type { BackendPreset } from '../../types/index';\n\n/**\n * Datadog Direct preset - send traces directly to Datadog\n */\nexport const datadogDirect: BackendPreset = {\n name: 'Datadog (Direct)',\n slug: 'datadog',\n type: 'backend',\n description: 'Send traces directly to Datadog via OTLP HTTP',\n protocol: 'http',\n exporter: 'otlp-http',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-http',\n ],\n optional: [\n '@opentelemetry/sdk-logs',\n '@opentelemetry/exporter-logs-otlp-http',\n ],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'DATADOG_API_KEY',\n description: 'Datadog API key for authentication',\n example: 'your-api-key',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'DATADOG_SITE',\n description: 'Datadog region (e.g., datadoghq.eu for EU)',\n example: 'datadoghq.com',\n sensitive: false,\n },\n {\n name: 'DD_ENV',\n description: 'Environment tag (e.g., production, staging)',\n example: 'production',\n sensitive: false,\n },\n {\n name: 'DD_SERVICE',\n description: 'Service name override',\n example: 'my-service',\n sensitive: false,\n },\n {\n name: 'DD_VERSION',\n description: 'Version tag',\n example: '1.0.0',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/datadog',\n specifiers: ['createDatadogConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createDatadogConfig({\n apiKey: process.env.DATADOG_API_KEY,\n site: process.env.DATADOG_SITE,\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Set DATADOG_API_KEY environment variable',\n 'Optionally set DD_ENV, DD_SERVICE, DD_VERSION for unified service tagging',\n ],\n};\n\n/**\n * Datadog Agent preset - send traces to local Datadog Agent\n */\nexport const datadogAgent: BackendPreset = {\n name: 'Datadog (Agent)',\n slug: 'datadog-agent',\n type: 'backend',\n description: 'Send traces to Datadog via local agent',\n protocol: 'http',\n exporter: 'otlp-http',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-http',\n ],\n optional: [\n '@opentelemetry/sdk-logs',\n '@opentelemetry/exporter-logs-otlp-http',\n ],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [\n {\n name: 'DD_AGENT_HOST',\n description: 'Datadog Agent hostname',\n example: 'localhost',\n sensitive: false,\n },\n {\n name: 'DD_OTLP_PORT',\n description: 'OTLP receiver port on Agent',\n example: '4318',\n sensitive: false,\n },\n {\n name: 'DD_ENV',\n description: 'Environment tag (e.g., production, staging)',\n example: 'production',\n sensitive: false,\n },\n {\n name: 'DD_SERVICE',\n description: 'Service name override',\n example: 'my-service',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/datadog',\n specifiers: ['createDatadogAgentConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createDatadogAgentConfig({\n agentHost: process.env.DD_AGENT_HOST ?? 'localhost',\n otlpPort: process.env.DD_OTLP_PORT ?? '4318',\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Ensure Datadog Agent is running with OTLP receiver enabled',\n 'Agent handles authentication - no API key needed in app',\n ],\n};\n","import type { BackendPreset } from '../../types/index';\n\n/**\n * Honeycomb preset\n */\nexport const honeycomb: BackendPreset = {\n name: 'Honeycomb',\n slug: 'honeycomb',\n type: 'backend',\n description: 'Send traces to Honeycomb via OTLP gRPC',\n protocol: 'grpc',\n exporter: 'otlp-grpc',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-grpc',\n ],\n optional: [\n '@opentelemetry/sdk-logs',\n '@opentelemetry/exporter-logs-otlp-grpc',\n ],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'HONEYCOMB_API_KEY',\n description: 'Honeycomb API key (Ingest Key)',\n example: 'your-api-key',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'HONEYCOMB_DATASET',\n description: 'Dataset name (Classic accounts only)',\n example: 'my-dataset',\n sensitive: false,\n },\n {\n name: 'OTEL_SERVICE_NAME',\n description: 'Service name for traces',\n example: 'my-service',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/honeycomb',\n specifiers: ['createHoneycombConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createHoneycombConfig({\n apiKey: process.env.HONEYCOMB_API_KEY,\n dataset: process.env.HONEYCOMB_DATASET,\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Set HONEYCOMB_API_KEY environment variable',\n 'Get your API key from Honeycomb Team Settings > API Keys',\n ],\n};\n","import type { BackendPreset } from '../../types/index';\n\n/**\n * Generic OTLP HTTP preset\n */\nexport const otlpHttp: BackendPreset = {\n name: 'OTLP (HTTP)',\n slug: 'otlp-http',\n type: 'backend',\n description: 'Send traces to any OTLP-compatible endpoint via HTTP',\n protocol: 'http',\n exporter: 'otlp-http',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-http',\n ],\n optional: [\n '@opentelemetry/sdk-logs',\n '@opentelemetry/exporter-logs-otlp-http',\n ],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'OTLP endpoint URL',\n example: 'http://localhost:4318',\n sensitive: false,\n },\n ],\n optional: [\n {\n name: 'OTEL_EXPORTER_OTLP_HEADERS',\n description: 'Headers for authentication (key=value pairs)',\n example: 'Authorization=Bearer token',\n sensitive: true,\n },\n {\n name: 'OTEL_SERVICE_NAME',\n description: 'Service name for traces',\n example: 'my-service',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/otlp',\n specifiers: ['createOtlpHttpConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createOtlpHttpConfig({\n endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Set OTEL_EXPORTER_OTLP_ENDPOINT to your collector or backend URL',\n 'Add authentication headers if required by your endpoint',\n ],\n};\n\n/**\n * Generic OTLP gRPC preset\n */\nexport const otlpGrpc: BackendPreset = {\n name: 'OTLP (gRPC)',\n slug: 'otlp-grpc',\n type: 'backend',\n description: 'Send traces to any OTLP-compatible endpoint via gRPC',\n protocol: 'grpc',\n exporter: 'otlp-grpc',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-grpc',\n ],\n optional: [\n '@opentelemetry/sdk-logs',\n '@opentelemetry/exporter-logs-otlp-grpc',\n ],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'OTLP gRPC endpoint URL',\n example: 'http://localhost:4317',\n sensitive: false,\n },\n ],\n optional: [\n {\n name: 'OTEL_EXPORTER_OTLP_HEADERS',\n description: 'Headers for authentication (key=value pairs)',\n example: 'Authorization=Bearer token',\n sensitive: true,\n },\n {\n name: 'OTEL_SERVICE_NAME',\n description: 'Service name for traces',\n example: 'my-service',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/otlp',\n specifiers: ['createOtlpGrpcConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createOtlpGrpcConfig({\n endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Set OTEL_EXPORTER_OTLP_ENDPOINT to your collector or backend URL',\n 'gRPC typically uses port 4317 (HTTP uses 4318)',\n ],\n};\n\n/**\n * Local/Console preset (development only)\n */\nexport const local: BackendPreset = {\n name: 'Local/Console',\n slug: 'local',\n type: 'backend',\n description: 'Print traces to console (development only)',\n protocol: 'http',\n exporter: 'otlp-http',\n packages: {\n required: [],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [],\n configBlock: {\n type: 'backend',\n code: '// Local/console mode - no backend configured',\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Traces will be logged to console',\n 'Run `autotel add backend <provider>` to add a real backend',\n ],\n};\n","import type { SubscriberPreset } from '../../types/index';\n\n/**\n * PostHog subscriber preset\n */\nexport const posthog: SubscriberPreset = {\n name: 'PostHog',\n slug: 'posthog',\n type: 'subscriber',\n description: 'Send events to PostHog for product analytics',\n packages: {\n required: [\n 'autotel-subscribers',\n 'posthog-node',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'POSTHOG_API_KEY',\n description: 'PostHog Project API Key',\n example: 'phc_...',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'POSTHOG_HOST',\n description: 'PostHog host URL (for self-hosted)',\n example: 'https://app.posthog.com',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-subscribers/posthog',\n specifiers: ['PostHogSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new PostHogSubscriber({\n apiKey: process.env.POSTHOG_API_KEY,\n host: process.env.POSTHOG_HOST,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Set POSTHOG_API_KEY from PostHog Project Settings',\n 'Events will be sent to PostHog as custom events',\n ],\n};\n\n// Alias for test compatibility\nexport { posthog as posthogSubscriber };\n","import type { SubscriberPreset } from '../../types/index';\n\n/**\n * Mixpanel subscriber preset\n */\nexport const mixpanel: SubscriberPreset = {\n name: 'Mixpanel',\n slug: 'mixpanel',\n type: 'subscriber',\n description: 'Send events to Mixpanel for product analytics',\n packages: {\n required: [\n 'autotel-subscribers',\n 'mixpanel',\n ],\n optional: [],\n devOnly: [\n '@types/mixpanel',\n ],\n },\n env: {\n required: [\n {\n name: 'MIXPANEL_TOKEN',\n description: 'Mixpanel Project Token',\n example: 'your-project-token',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'MIXPANEL_API_HOST',\n description: 'Mixpanel API host (for EU data residency)',\n example: 'api-eu.mixpanel.com',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-subscribers/mixpanel',\n specifiers: ['MixpanelSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new MixpanelSubscriber({\n token: process.env.MIXPANEL_TOKEN,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Set MIXPANEL_TOKEN from Mixpanel Project Settings',\n 'Events will be tracked as Mixpanel events',\n ],\n};\n\n/**\n * Amplitude subscriber preset\n */\nexport const amplitude: SubscriberPreset = {\n name: 'Amplitude',\n slug: 'amplitude',\n type: 'subscriber',\n description: 'Send events to Amplitude for product analytics',\n packages: {\n required: [\n 'autotel-subscribers',\n '@amplitude/analytics-node',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'AMPLITUDE_API_KEY',\n description: 'Amplitude API Key',\n example: 'your-api-key',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'AMPLITUDE_SERVER_URL',\n description: 'Amplitude server URL (for EU data center)',\n example: 'https://api.eu.amplitude.com/2/httpapi',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-subscribers/amplitude',\n specifiers: ['AmplitudeSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new AmplitudeSubscriber({\n apiKey: process.env.AMPLITUDE_API_KEY,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Set AMPLITUDE_API_KEY from Amplitude Project Settings',\n 'Events will be sent to Amplitude',\n ],\n};\n\n/**\n * Segment subscriber preset\n */\nexport const segment: SubscriberPreset = {\n name: 'Segment',\n slug: 'segment',\n type: 'subscriber',\n description: 'Send events to Segment for routing to destinations',\n packages: {\n required: [\n 'autotel-subscribers',\n '@segment/analytics-node',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'SEGMENT_WRITE_KEY',\n description: 'Segment Source Write Key',\n example: 'your-write-key',\n sensitive: true,\n },\n ],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-subscribers/segment',\n specifiers: ['SegmentSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new SegmentSubscriber({\n writeKey: process.env.SEGMENT_WRITE_KEY,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Set SEGMENT_WRITE_KEY from your Segment Source settings',\n 'Configure destinations in Segment to route events',\n ],\n};\n\n/**\n * Slack subscriber preset\n */\nexport const slack: SubscriberPreset = {\n name: 'Slack',\n slug: 'slack',\n type: 'subscriber',\n description: 'Send event notifications to Slack',\n packages: {\n required: [\n 'autotel-subscribers',\n '@slack/web-api',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'SLACK_WEBHOOK_URL',\n description: 'Slack Incoming Webhook URL',\n example: 'https://hooks.slack.com/services/...',\n sensitive: true,\n },\n ],\n optional: [\n {\n name: 'SLACK_CHANNEL',\n description: 'Default channel for notifications',\n example: '#alerts',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-subscribers/slack',\n specifiers: ['SlackSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new SlackSubscriber({\n webhookUrl: process.env.SLACK_WEBHOOK_URL,\n channel: process.env.SLACK_CHANNEL,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Create an Incoming Webhook in your Slack workspace',\n 'Set SLACK_WEBHOOK_URL with the webhook URL',\n ],\n};\n\n/**\n * Generic Webhook subscriber preset\n */\nexport const webhook: SubscriberPreset = {\n name: 'Webhook',\n slug: 'webhook',\n type: 'subscriber',\n description: 'Send events to a custom webhook endpoint',\n packages: {\n required: [\n 'autotel-subscribers',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'WEBHOOK_URL',\n description: 'Webhook endpoint URL',\n example: 'https://api.example.com/events',\n sensitive: false,\n },\n ],\n optional: [\n {\n name: 'WEBHOOK_SECRET',\n description: 'Shared secret for webhook signatures',\n example: 'your-secret',\n sensitive: true,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-subscribers/webhook',\n specifiers: ['WebhookSubscriber'],\n },\n ],\n configBlock: {\n type: 'subscriber',\n code: `new WebhookSubscriber({\n url: process.env.WEBHOOK_URL,\n secret: process.env.WEBHOOK_SECRET,\n }),`,\n section: 'SUBSCRIBERS_CONFIG',\n },\n nextSteps: [\n 'Set WEBHOOK_URL to your endpoint',\n 'Implement the webhook receiver to handle incoming events',\n ],\n};\n","import type { PluginPreset } from '../../types/index';\n\n/**\n * Mongoose plugin preset\n */\nexport const mongoose: PluginPreset = {\n name: 'Mongoose',\n slug: 'mongoose',\n type: 'plugin',\n description: 'Instrument Mongoose ODM for MongoDB tracing',\n packages: {\n required: [\n 'autotel-plugins',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-plugins/mongoose',\n specifiers: ['instrumentMongoose'],\n },\n {\n source: 'mongoose',\n default: 'mongoose',\n },\n ],\n configBlock: {\n type: 'plugin',\n code: 'instrumentMongoose(mongoose);',\n section: 'PLUGIN_INIT',\n },\n nextSteps: [\n 'Mongoose operations will now be traced',\n 'Spans will include query, collection, and timing information',\n ],\n};\n\n/**\n * Drizzle plugin preset\n */\nexport const drizzle: PluginPreset = {\n name: 'Drizzle',\n slug: 'drizzle',\n type: 'plugin',\n description: 'Instrument Drizzle ORM for database tracing',\n packages: {\n required: [\n 'autotel-plugins',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-plugins/drizzle',\n specifiers: ['instrumentDrizzle'],\n },\n ],\n configBlock: {\n type: 'plugin',\n code: '// Call instrumentDrizzle(db) with your Drizzle instance',\n section: 'PLUGIN_INIT',\n },\n nextSteps: [\n 'Import instrumentDrizzle and call it with your Drizzle instance',\n 'Example: const db = instrumentDrizzle(drizzle(pool))',\n ],\n};\n","import type { PlatformPreset } from '../../types/index';\n\n/**\n * AWS Lambda platform preset\n */\nexport const awsLambda: PlatformPreset = {\n name: 'AWS Lambda',\n slug: 'aws-lambda',\n type: 'platform',\n description: 'AWS Lambda support with cold start handling',\n packages: {\n required: [\n 'autotel-platforms',\n '@opentelemetry/instrumentation-aws-lambda',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [\n {\n name: 'AWS_LAMBDA_FUNCTION_NAME',\n description: 'Lambda function name (auto-set by AWS)',\n example: 'my-function',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-platforms/aws',\n specifiers: ['createLambdaConfig'],\n },\n ],\n configBlock: {\n type: 'platform',\n code: '...createLambdaConfig(),',\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Add the Lambda layer or bundle instrumentation with your function',\n 'Set OTEL_* environment variables in Lambda configuration',\n ],\n};\n\n/**\n * Cloudflare Workers platform preset\n */\nexport const cloudflare: PlatformPreset = {\n name: 'Cloudflare Workers',\n slug: 'cloudflare',\n type: 'platform',\n description: 'Cloudflare Workers support',\n packages: {\n required: [\n 'autotel-platforms',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-platforms/cloudflare',\n specifiers: ['createCloudflareConfig'],\n },\n ],\n configBlock: {\n type: 'platform',\n code: '...createCloudflareConfig(),',\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Workers have limited API support - some features may not be available',\n 'Use waitUntil() for async span flushing',\n ],\n};\n\n/**\n * Edge runtime platform preset\n */\nexport const edge: PlatformPreset = {\n name: 'Edge Runtime',\n slug: 'edge',\n type: 'platform',\n description: 'Vercel Edge, Deno Deploy, and other edge runtimes',\n packages: {\n required: [\n 'autotel-platforms',\n ],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-platforms/edge',\n specifiers: ['createEdgeConfig'],\n },\n ],\n configBlock: {\n type: 'platform',\n code: '...createEdgeConfig(),',\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Edge runtimes have limited API support',\n 'Auto-instrumentation may not work - use manual instrumentation',\n ],\n};\n","import type {\n BackendPreset,\n SubscriberPreset,\n PluginPreset,\n PlatformPreset,\n QuickPreset,\n PresetRegistry,\n Preset,\n PresetType,\n} from '../types/index';\n\n// Import all presets\nimport { datadogDirect, datadogAgent } from './backends/datadog';\nimport { honeycomb } from './backends/honeycomb';\nimport { otlpHttp, otlpGrpc, local } from './backends/otlp';\nimport { posthog } from './subscribers/posthog';\nimport { mixpanel, amplitude, segment, slack, webhook } from './subscribers/mixpanel';\nimport { mongoose, drizzle } from './plugins/mongoose';\nimport { awsLambda, cloudflare, edge } from './platforms/aws';\n\n/**\n * Backend presets registry\n */\nexport const backends = new Map<string, BackendPreset>([\n ['datadog', datadogDirect],\n ['datadog-agent', datadogAgent],\n ['honeycomb', honeycomb],\n ['otlp-http', otlpHttp],\n ['otlp-grpc', otlpGrpc],\n ['local', local],\n]);\n\n/**\n * Subscriber presets registry\n */\nexport const subscribers = new Map<string, SubscriberPreset>([\n ['posthog', posthog],\n ['mixpanel', mixpanel],\n ['amplitude', amplitude],\n ['segment', segment],\n ['slack', slack],\n ['webhook', webhook],\n]);\n\n/**\n * Plugin presets registry\n */\nexport const plugins = new Map<string, PluginPreset>([\n ['mongoose', mongoose],\n ['drizzle', drizzle],\n]);\n\n/**\n * Platform presets registry\n */\nexport const platforms = new Map<string, PlatformPreset>([\n ['aws-lambda', awsLambda],\n ['cloudflare', cloudflare],\n ['edge', edge],\n]);\n\n/**\n * Quick presets (named bundles)\n */\nexport const quickPresets = new Map<string, QuickPreset>([\n [\n 'node-datadog-pino',\n {\n name: 'Node.js + Datadog + Pino',\n slug: 'node-datadog-pino',\n description: 'Standard Node.js setup with Datadog and Pino logging',\n backend: 'datadog',\n logging: 'pino',\n autoInstrumentations: 'all',\n },\n ],\n [\n 'node-datadog-agent',\n {\n name: 'Node.js + Datadog Agent',\n slug: 'node-datadog-agent',\n description: 'Node.js with Datadog Agent for local development',\n backend: 'datadog-agent',\n logging: 'pino',\n autoInstrumentations: 'all',\n },\n ],\n [\n 'node-honeycomb',\n {\n name: 'Node.js + Honeycomb',\n slug: 'node-honeycomb',\n description: 'Standard Node.js setup with Honeycomb',\n backend: 'honeycomb',\n autoInstrumentations: 'all',\n },\n ],\n [\n 'node-otlp',\n {\n name: 'Node.js + Generic OTLP',\n slug: 'node-otlp',\n description: 'Node.js with generic OTLP endpoint',\n backend: 'otlp-http',\n autoInstrumentations: 'all',\n },\n ],\n]);\n\n/**\n * Full preset registry\n */\nexport const presetRegistry: PresetRegistry = {\n backends,\n subscribers,\n plugins,\n platforms,\n quick: quickPresets,\n};\n\n/**\n * Get preset by type and slug\n */\nexport function getPreset(type: PresetType, slug: string): Preset | undefined {\n switch (type) {\n case 'backend':\n return backends.get(slug);\n case 'subscriber':\n return subscribers.get(slug);\n case 'plugin':\n return plugins.get(slug);\n case 'platform':\n return platforms.get(slug);\n }\n}\n\n/**\n * Get all presets of a type\n */\nexport function getPresetsByType(type: PresetType): Map<string, Preset> {\n switch (type) {\n case 'backend':\n return backends as Map<string, Preset>;\n case 'subscriber':\n return subscribers as Map<string, Preset>;\n case 'plugin':\n return plugins as Map<string, Preset>;\n case 'platform':\n return platforms as Map<string, Preset>;\n }\n}\n\n/**\n * Get quick preset by slug\n */\nexport function getQuickPreset(slug: string): QuickPreset | undefined {\n return quickPresets.get(slug);\n}\n\n/**\n * List all preset slugs by type\n */\nexport function listPresetSlugs(type: PresetType): string[] {\n return [...getPresetsByType(type).keys()];\n}\n\n/**\n * Check if a preset exists\n */\nexport function presetExists(type: PresetType, slug: string): boolean {\n return getPresetsByType(type).has(slug);\n}\n\n/**\n * Re-export individual presets for direct access\n */\nexport {\n datadogDirect,\n datadogAgent,\n honeycomb,\n otlpHttp,\n otlpGrpc,\n local,\n posthog,\n mixpanel,\n amplitude,\n segment,\n slack,\n webhook,\n mongoose,\n drizzle,\n awsLambda,\n cloudflare,\n edge,\n};\n","import { select, checkbox, confirm, input } from '@inquirer/prompts';\nimport type { Preset, PresetType } from '../types/index';\n\n/**\n * Runtime selection\n */\nexport type RuntimeSelection = 'node' | 'lambda' | 'cloudflare' | 'edge';\n\n/**\n * Startup style selection\n */\nexport type StartupStyle = 'node-esm' | 'tsx' | 'ts-node' | 'nextjs' | 'other';\n\n/**\n * Prompt for runtime selection\n */\nexport async function promptRuntime(): Promise<RuntimeSelection> {\n return await select({\n message: 'What runtime are you using?',\n choices: [\n { value: 'node' as const, name: 'Node.js' },\n { value: 'lambda' as const, name: 'AWS Lambda' },\n { value: 'cloudflare' as const, name: 'Cloudflare Workers' },\n { value: 'edge' as const, name: 'Edge Runtime (Vercel Edge, etc.)' },\n ],\n default: 'node',\n });\n}\n\n/**\n * Prompt for backend selection\n */\nexport async function promptBackend(\n backends: Map<string, Preset>\n): Promise<string> {\n const choices = [\n { value: 'local', name: 'Local/Console (development only)' },\n ...[...backends.entries()].map(([slug, preset]) => ({\n value: slug,\n name: `${preset.name} - ${preset.description}`,\n })),\n ];\n\n return await select({\n message: 'Where do you want to send telemetry?',\n choices,\n default: 'local',\n });\n}\n\n/**\n * Prompt for logging framework\n */\nexport async function promptLogging(): Promise<string | null> {\n return await select({\n message: 'Which logging framework do you use?',\n choices: [\n { value: null as unknown as string, name: 'None / Not sure' },\n { value: 'pino', name: 'Pino' },\n { value: 'winston', name: 'Winston' },\n ],\n default: null as unknown as string,\n });\n}\n\n/**\n * Prompt for database/ORM selection (multi-select)\n */\nexport async function promptDatabases(\n plugins: Map<string, Preset>\n): Promise<string[]> {\n const choices = [...plugins.entries()]\n .filter(([, preset]) => preset.type === 'plugin')\n .map(([slug, preset]) => ({\n value: slug,\n name: `${preset.name} - ${preset.description}`,\n }));\n\n if (choices.length === 0) {\n return [];\n }\n\n return await checkbox({\n message: 'Which databases/ORMs do you use? (space to select, enter to continue)',\n choices,\n });\n}\n\n/**\n * Prompt for event subscribers (multi-select)\n */\nexport async function promptSubscribers(\n subscribers: Map<string, Preset>\n): Promise<string[]> {\n const choices = [...subscribers.entries()].map(([slug, preset]) => ({\n value: slug,\n name: `${preset.name} - ${preset.description}`,\n }));\n\n if (choices.length === 0) {\n return [];\n }\n\n return await checkbox({\n message: 'Which event destinations? (space to select, enter to continue)',\n choices,\n });\n}\n\n/**\n * Prompt for auto-instrumentation\n */\nexport async function promptAutoInstrumentation(): Promise<'all' | 'none' | 'specific'> {\n return await select({\n message: 'Auto-instrument common libraries?',\n choices: [\n { value: 'all' as const, name: 'All (recommended) - http, express, pg, redis, etc.' },\n { value: 'specific' as const, name: 'Let me choose specific ones' },\n { value: 'none' as const, name: 'None - I\\'ll handle it manually' },\n ],\n default: 'all',\n });\n}\n\n/**\n * Prompt for startup style\n */\nexport async function promptStartupStyle(\n hasTypeScript: boolean\n): Promise<StartupStyle> {\n const choices = hasTypeScript\n ? [\n { value: 'node-esm' as const, name: 'Node ESM (node --import) - Recommended' },\n { value: 'tsx' as const, name: 'tsx (tsx --import) - For development' },\n { value: 'ts-node' as const, name: 'ts-node' },\n { value: 'nextjs' as const, name: 'Next.js' },\n { value: 'other' as const, name: 'Other / Manual' },\n ]\n : [\n { value: 'node-esm' as const, name: 'Node ESM (node --import) - Recommended' },\n { value: 'nextjs' as const, name: 'Next.js' },\n { value: 'other' as const, name: 'Other / Manual' },\n ];\n\n return await select({\n message: 'How do you start your app?',\n choices,\n default: 'node-esm',\n });\n}\n\n/**\n * Prompt for confirmation\n */\nexport async function promptConfirm(message: string, defaultValue = true): Promise<boolean> {\n return await confirm({\n message,\n default: defaultValue,\n });\n}\n\n/**\n * Prompt for existing config action\n */\nexport async function promptExistingConfigAction(): Promise<'update' | 'new' | 'abort'> {\n return await select({\n message: 'Existing instrumentation detected. What would you like to do?',\n choices: [\n { value: 'update' as const, name: 'Update existing file (recommended)' },\n { value: 'new' as const, name: 'Create new file (src/autotel-config.mts)' },\n { value: 'abort' as const, name: 'Abort' },\n ],\n default: 'update',\n });\n}\n\n/**\n * Prompt for text input\n */\nexport async function promptInput(\n message: string,\n defaultValue?: string\n): Promise<string> {\n return await input({\n message,\n default: defaultValue,\n });\n}\n\n/**\n * Prompt for preset selection from a type\n */\nexport async function promptPresetFromType(\n type: PresetType,\n presets: Map<string, Preset>\n): Promise<string | null> {\n const filtered = [...presets.entries()].filter(\n ([, preset]) => preset.type === type\n );\n\n if (filtered.length === 0) {\n return null;\n }\n\n const choices = [\n { value: null as unknown as string, name: 'None' },\n ...filtered.map(([slug, preset]) => ({\n value: slug,\n name: `${preset.name} - ${preset.description}`,\n })),\n ];\n\n return await select({\n message: `Select ${type}:`,\n choices,\n default: null as unknown as string,\n });\n}\n","import chalk from 'chalk';\nimport type { Check, CheckSummary, PackageManager } from '../types/index';\n\n/**\n * Status tokens for consistent output\n */\nexport const STATUS = {\n ok: chalk.green('[OK]'),\n warn: chalk.yellow('[WARN]'),\n error: chalk.red('[ERROR]'),\n info: chalk.blue('[INFO]'),\n skip: chalk.gray('[SKIP]'),\n};\n\n/**\n * Format check output line\n */\nexport function formatCheck(check: Check): string[] {\n const lines: string[] = [];\n const statusToken = STATUS[check.status];\n\n lines.push(` ${statusToken} ${check.message}`);\n\n if (check.details && check.details.length > 0) {\n for (const detail of check.details) {\n lines.push(` ${chalk.dim(detail)}`);\n }\n }\n\n if (check.fix) {\n lines.push(` ${chalk.cyan('Fix:')} ${check.fix.cmd}`);\n }\n\n return lines;\n}\n\n/**\n * Format summary line\n */\nexport function formatSummary(summary: CheckSummary): string {\n const parts: string[] = [];\n\n if (summary.ok > 0) {\n parts.push(chalk.green(`${summary.ok} passed`));\n }\n if (summary.warnings > 0) {\n parts.push(chalk.yellow(`${summary.warnings} warning${summary.warnings > 1 ? 's' : ''}`));\n }\n if (summary.errors > 0) {\n parts.push(chalk.red(`${summary.errors} error${summary.errors > 1 ? 's' : ''}`));\n }\n if (summary.skipped > 0) {\n parts.push(chalk.gray(`${summary.skipped} skipped`));\n }\n\n return `Summary: ${parts.join(', ')}`;\n}\n\n/**\n * Format structured footer\n */\nexport function formatFooter(options: {\n detected?: string;\n wrote?: string[];\n next?: string;\n}): string {\n const lines: string[] = [''];\n\n if (options.detected) {\n lines.push(chalk.dim(`Detected: ${options.detected}`));\n }\n\n if (options.wrote && options.wrote.length > 0) {\n lines.push(chalk.dim(`Wrote: ${options.wrote.join(', ')}`));\n }\n\n if (options.next) {\n lines.push(chalk.cyan(`Next: ${options.next}`));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format package manager detection info\n */\nexport function formatPackageManagerInfo(\n pm: PackageManager,\n lockfilePath: string | null\n): string {\n if (lockfilePath) {\n return `${pm} (via ${chalk.dim(lockfilePath)})`;\n }\n return `${pm} (default, no lockfile found)`;\n}\n\n/**\n * Format workspace info\n */\nexport function formatWorkspaceInfo(\n isMonorepo: boolean,\n workspaceRoot: string | null,\n packageRoot: string\n): string {\n if (!isMonorepo) {\n return `package root ${chalk.dim(packageRoot)}`;\n }\n return `monorepo, workspace root ${chalk.dim(workspaceRoot)}, package root ${chalk.dim(packageRoot)}`;\n}\n\n/**\n * Print heading\n */\nexport function heading(text: string): void {\n console.log(chalk.bold(text));\n}\n\n/**\n * Print info message\n */\nexport function info(text: string): void {\n console.log(chalk.blue(text));\n}\n\n/**\n * Print success message\n */\nexport function success(text: string): void {\n console.log(chalk.green(text));\n}\n\n/**\n * Print warning message\n */\nexport function warn(text: string): void {\n console.log(chalk.yellow(text));\n}\n\n/**\n * Print error message\n */\nexport function error(text: string): void {\n console.log(chalk.red(text));\n}\n\n/**\n * Print dim/muted text\n */\nexport function dim(text: string): void {\n console.log(chalk.dim(text));\n}\n\n/**\n * Format install command\n */\nexport function formatInstallCmd(cmd: string): string {\n return chalk.cyan(`$ ${cmd}`);\n}\n\n/**\n * Format file path relative to cwd\n */\nexport function formatPath(filePath: string): string {\n return chalk.dim(filePath);\n}\n\n/**\n * Quiet output - only warnings and errors\n */\nexport function isQuiet(): boolean {\n return process.env['AUTOTEL_QUIET'] === 'true';\n}\n\n/**\n * Verbose output\n */\nexport function isVerbose(): boolean {\n return process.env['AUTOTEL_VERBOSE'] === 'true';\n}\n\n/**\n * Print only if not quiet\n */\nexport function log(text: string): void {\n if (!isQuiet()) {\n console.log(text);\n }\n}\n\n/**\n * Print only if verbose\n */\nexport function verbose(text: string): void {\n if (isVerbose()) {\n console.log(chalk.gray(`[verbose] ${text}`));\n }\n}\n","import ora, { type Ora } from 'ora';\n\n/**\n * Spinner wrapper for consistent usage\n */\nexport interface SpinnerInstance {\n start: (text?: string) => void;\n stop: () => void;\n succeed: (text?: string) => void;\n fail: (text?: string) => void;\n warn: (text?: string) => void;\n info: (text?: string) => void;\n text: (text: string) => void;\n}\n\n/**\n * Create a spinner\n */\nexport function createSpinner(text?: string): SpinnerInstance {\n const spinner: Ora = ora({\n text,\n spinner: 'dots',\n });\n\n return {\n start: (newText?: string) => {\n if (newText) spinner.text = newText;\n spinner.start();\n },\n stop: () => spinner.stop(),\n succeed: (newText?: string) => spinner.succeed(newText),\n fail: (newText?: string) => spinner.fail(newText),\n warn: (newText?: string) => spinner.warn(newText),\n info: (newText?: string) => spinner.info(newText),\n text: (newText: string) => {\n spinner.text = newText;\n },\n };\n}\n\n/**\n * Run async function with spinner\n */\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n options?: {\n successText?: string | ((result: T) => string);\n failText?: string;\n }\n): Promise<T> {\n const spinner = createSpinner(text);\n spinner.start();\n\n try {\n const result = await fn();\n const successText =\n typeof options?.successText === 'function'\n ? options.successText(result)\n : options?.successText;\n spinner.succeed(successText);\n return result;\n } catch (error) {\n spinner.fail(options?.failText ?? `Failed: ${text}`);\n throw error;\n }\n}\n\n/**\n * No-op spinner for quiet mode or CI\n */\nexport function createNoopSpinner(): SpinnerInstance {\n return {\n start: () => {},\n stop: () => {},\n succeed: () => {},\n fail: () => {},\n warn: () => {},\n info: () => {},\n text: () => {},\n };\n}\n\n/**\n * Check if running in CI environment\n */\nexport function isCI(): boolean {\n return !!(\n process.env['CI'] ||\n process.env['CONTINUOUS_INTEGRATION'] ||\n process.env['BUILD_NUMBER'] ||\n process.env['GITHUB_ACTIONS'] ||\n process.env['GITLAB_CI'] ||\n process.env['CIRCLECI'] ||\n process.env['TRAVIS']\n );\n}\n","import * as semver from 'semver';\nimport type { PackageJson } from '../types/index';\n\n/**\n * Installed package info\n */\nexport interface InstalledPackage {\n name: string;\n version: string;\n isDev: boolean;\n}\n\n/**\n * Missing package info\n */\nexport interface MissingPackage {\n name: string;\n reason: string;\n requiredBy?: string;\n}\n\n/**\n * Audit result for dependency checking\n */\nexport interface DependencyAudit {\n installed: InstalledPackage[];\n missing: MissingPackage[];\n versionMismatch: Array<{\n name: string;\n installed: string;\n expected: string;\n }>;\n}\n\n/**\n * Get all installed packages from package.json\n */\nexport function getInstalledPackages(packageJson: PackageJson): InstalledPackage[] {\n const installed: InstalledPackage[] = [];\n\n const deps = packageJson.dependencies ?? {};\n const devDeps = packageJson.devDependencies ?? {};\n\n for (const [name, version] of Object.entries(deps)) {\n installed.push({ name, version, isDev: false });\n }\n\n for (const [name, version] of Object.entries(devDeps)) {\n // Don't duplicate if in both\n if (!deps[name]) {\n installed.push({ name, version, isDev: true });\n }\n }\n\n return installed;\n}\n\n/**\n * Check if a package is installed\n */\nexport function isPackageInstalled(\n packageJson: PackageJson,\n packageName: string\n): { installed: boolean; version: string | null; isDev: boolean } {\n const deps = packageJson.dependencies ?? {};\n const devDeps = packageJson.devDependencies ?? {};\n\n if (deps[packageName]) {\n return { installed: true, version: deps[packageName] ?? null, isDev: false };\n }\n\n if (devDeps[packageName]) {\n return { installed: true, version: devDeps[packageName] ?? null, isDev: true };\n }\n\n return { installed: false, version: null, isDev: false };\n}\n\n/**\n * Find missing packages from a required list\n */\nexport function findMissingPackages(\n packageJson: PackageJson,\n required: string[],\n reason?: string\n): MissingPackage[] {\n const missing: MissingPackage[] = [];\n\n for (const pkg of required) {\n const { installed } = isPackageInstalled(packageJson, pkg);\n if (!installed) {\n missing.push({\n name: pkg,\n reason: reason ?? 'Required dependency',\n });\n }\n }\n\n return missing;\n}\n\n/**\n * Check version compatibility between autotel packages\n */\nexport function checkAutotelVersions(\n packageJson: PackageJson\n): { compatible: boolean; packages: Array<{ name: string; version: string }> } {\n const autotelPackages = ['autotel', 'autotel-backends', 'autotel-plugins', 'autotel-subscribers'];\n const installed: Array<{ name: string; version: string; major: number }> = [];\n\n for (const pkg of autotelPackages) {\n const { installed: isInstalled, version } = isPackageInstalled(packageJson, pkg);\n if (isInstalled && version) {\n const cleanVersion = version.replace(/^[\\^~]/, '');\n const parsed = semver.parse(cleanVersion);\n if (parsed) {\n installed.push({ name: pkg, version: cleanVersion, major: parsed.major });\n }\n }\n }\n\n if (installed.length <= 1) {\n return { compatible: true, packages: installed };\n }\n\n // Check if all major versions match\n const majors = new Set(installed.map((p) => p.major));\n const compatible = majors.size === 1;\n\n return { compatible, packages: installed };\n}\n\n/**\n * Audit dependencies for a preset\n */\nexport function auditPresetDependencies(\n packageJson: PackageJson,\n requiredPackages: string[],\n presetName: string\n): DependencyAudit {\n const installed = getInstalledPackages(packageJson);\n const missing: MissingPackage[] = [];\n const versionMismatch: DependencyAudit['versionMismatch'] = [];\n\n for (const pkg of requiredPackages) {\n const result = isPackageInstalled(packageJson, pkg);\n if (!result.installed) {\n missing.push({\n name: pkg,\n reason: `Required by ${presetName} preset`,\n requiredBy: presetName,\n });\n }\n }\n\n return {\n installed,\n missing,\n versionMismatch,\n };\n}\n\n/**\n * Get autotel core package info if installed\n */\nexport function getAutotelInfo(packageJson: PackageJson): {\n installed: boolean;\n version: string | null;\n} {\n const { installed, version } = isPackageInstalled(packageJson, 'autotel');\n return { installed, version };\n}\n","import * as path from 'node:path';\nimport type { ProjectContext } from '../types/index';\nimport { readFileSafe } from './fs';\nimport { getEntrypointCandidates } from './project';\n\n/**\n * ESM hook check result\n */\nexport interface EsmCheckResult {\n status: 'ok' | 'warn' | 'info' | 'error';\n message: string;\n details?: string[];\n}\n\n/**\n * Check if autotel/register is imported correctly\n */\nexport function checkRegisterImportOrder(content: string): {\n found: boolean;\n isFirst: boolean;\n lineNumber: number | null;\n} {\n const lines = content.split('\\n');\n let registerLine: number | null = null;\n let firstImportLine: number | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]?.trim() ?? '';\n\n // Skip empty lines and comments\n if (line === '' || line.startsWith('//') || line.startsWith('/*') || line.startsWith('*')) {\n continue;\n }\n\n // Check for imports\n if (line.startsWith('import ') || line.startsWith(\"import'\") || line.startsWith('import\"')) {\n if (firstImportLine === null) {\n firstImportLine = i + 1;\n }\n\n if (line.includes('autotel/register')) {\n registerLine = i + 1;\n }\n }\n }\n\n if (registerLine === null) {\n return { found: false, isFirst: false, lineNumber: null };\n }\n\n return {\n found: true,\n isFirst: registerLine === firstImportLine,\n lineNumber: registerLine,\n };\n}\n\n/**\n * Check ESM hook setup - conservative approach\n */\nexport function checkEsmHook(project: ProjectContext): EsmCheckResult {\n // Check if project uses ESM\n if (!project.isEsm) {\n return {\n status: 'info',\n message: 'Project uses CommonJS; ESM hook check skipped',\n details: [\n 'autotel works best with ESM projects',\n 'Consider adding \"type\": \"module\" to package.json',\n ],\n };\n }\n\n // Find entrypoints to check\n const entrypoints = getEntrypointCandidates(project.packageRoot);\n\n if (entrypoints.length === 0) {\n return {\n status: 'info',\n message: 'Could not find entrypoint files to verify',\n details: [\n 'Ensure autotel/register is imported first in your entrypoint',\n 'Or use --import flag: node --import ./src/instrumentation.mts dist/index.js',\n ],\n };\n }\n\n // Check each entrypoint for autotel/register\n for (const entrypoint of entrypoints) {\n const content = readFileSafe(entrypoint);\n if (content === null) continue;\n\n const result = checkRegisterImportOrder(content);\n\n // If found but not first, that's a definite problem\n if (result.found && !result.isFirst) {\n return {\n status: 'warn',\n message: `autotel/register import found but not first in ${path.basename(entrypoint)}:${result.lineNumber}`,\n details: [\n 'autotel/register must be the first import for instrumentation to work',\n 'Move it to the top of the file, before any other imports',\n ],\n };\n }\n\n // If found and first, good\n if (result.found && result.isFirst) {\n return {\n status: 'ok',\n message: `autotel/register correctly imported first in ${path.basename(entrypoint)}`,\n };\n }\n }\n\n // Not found in any entrypoint - info, not warning\n // User might be using --import flag\n return {\n status: 'info',\n message: 'Could not verify autotel/register import order',\n details: [\n 'Ensure autotel/register is first import in entrypoint',\n 'Or use the recommended approach: node --import ./src/instrumentation.mts',\n ],\n };\n}\n\n/**\n * Get recommended startup command\n */\nexport function getRecommendedStartupCommand(\n project: ProjectContext,\n instrumentationPath: string\n): string {\n const relPath = path.relative(project.packageRoot, instrumentationPath);\n\n if (project.hasTypeScript) {\n // Check for tsx\n const hasTsx =\n project.packageJson.devDependencies?.tsx ||\n project.packageJson.dependencies?.tsx;\n\n if (hasTsx) {\n return `tsx --import ./${relPath} src/index.ts`;\n }\n\n // Default Node ESM\n return `node --import ./${relPath} dist/index.js`;\n }\n\n // JavaScript\n return `node --import ./${relPath} src/index.js`;\n}\n\n/**\n * Check if scripts use --import flag\n */\nexport function checkScriptsUseImport(\n scripts: Record<string, string> | undefined,\n _instrumentationPath: string\n): { found: boolean; scriptName: string | null } {\n if (!scripts) {\n return { found: false, scriptName: null };\n }\n\n for (const [name, script] of Object.entries(scripts)) {\n if (script.includes('--import') && script.includes('instrumentation')) {\n return { found: true, scriptName: name };\n }\n }\n\n return { found: false, scriptName: null };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { readFileSafe } from './fs';\n\n/**\n * Logger instrumentation mapping\n */\nconst LOGGER_INSTRUMENTATION = {\n winston: '@opentelemetry/instrumentation-winston',\n bunyan: '@opentelemetry/instrumentation-bunyan',\n pino: '@opentelemetry/instrumentation-pino',\n} as const;\n\n/**\n * Extract autoInstrumentations from source code\n * Looks for patterns like:\n * - autoInstrumentations: ['winston', 'bunyan']\n * - autoInstrumentations: true\n * - autoInstrumentations: { winston: { enabled: true } }\n */\nexport function extractAutoInstrumentations(\n content: string\n): string[] {\n const instrumentations: string[] = [];\n\n // Pattern 1: Array format: autoInstrumentations: ['winston', 'bunyan']\n const arrayPattern = /autoInstrumentations\\s*:\\s*\\[(.*?)\\]/s;\n const arrayMatch = content.match(arrayPattern);\n if (arrayMatch && arrayMatch[1]) {\n const items = arrayMatch[1]\n .split(',')\n .map((item) => item.trim().replaceAll(/['\"]/g, ''))\n .filter((item) => item.length > 0);\n instrumentations.push(...items);\n }\n\n // Pattern 2: Object format: autoInstrumentations: { winston: { enabled: true } }\n const objectPattern = /autoInstrumentations\\s*:\\s*\\{([^}]+)\\}/s;\n const objectMatch = content.match(objectPattern);\n if (objectMatch && objectMatch[1]) {\n const props = objectMatch[1];\n // Extract keys that have enabled: true\n const enabledPattern = /(\\w+)\\s*:\\s*\\{[^}]*enabled\\s*:\\s*true[^}]*\\}/g;\n let enabledMatch;\n while ((enabledMatch = enabledPattern.exec(props)) !== null) {\n if (enabledMatch[1]) {\n instrumentations.push(enabledMatch[1]);\n }\n }\n }\n\n return [...new Set(instrumentations)]; // Remove duplicates\n}\n\n/**\n * Find all source files that might contain init() calls\n */\nexport function findSourceFiles(packageRoot: string): string[] {\n const sourceFiles: string[] = [];\n const srcDir = path.join(packageRoot, 'src');\n\n // Check common source directories\n const dirsToCheck = [packageRoot, srcDir].filter((dir) =>\n fs.existsSync(dir) && fs.statSync(dir).isDirectory()\n );\n\n for (const dir of dirsToCheck) {\n const files = fs.readdirSync(dir, { recursive: true });\n for (const file of files) {\n if (typeof file !== 'string') continue;\n const filePath = path.join(dir, file);\n try {\n if (\n fs.statSync(filePath).isFile() &&\n /\\.(ts|js|mts|mjs|tsx|jsx)$/.test(file)\n ) {\n sourceFiles.push(filePath);\n }\n } catch {\n // Skip files that can't be accessed\n }\n }\n }\n\n return sourceFiles;\n}\n\n/**\n * Check logger instrumentation configuration\n */\nexport function checkLoggerInstrumentation(\n packageRoot: string,\n deps: Record<string, string>\n): {\n logger: 'winston' | 'bunyan' | 'pino' | null;\n hasLogger: boolean;\n hasInstrumentation: boolean;\n configuredInCode: boolean;\n instrumentationPackage: string | null;\n} {\n // Check if logger packages are installed\n const hasWinston = !!deps['winston'];\n const hasBunyan = !!deps['bunyan'];\n const hasPino = !!deps['pino'];\n\n let logger: 'winston' | 'bunyan' | 'pino' | null = null;\n if (hasWinston) logger = 'winston';\n else if (hasBunyan) logger = 'bunyan';\n else if (hasPino) logger = 'pino';\n\n if (!logger) {\n return {\n logger: null,\n hasLogger: false,\n hasInstrumentation: false,\n configuredInCode: false,\n instrumentationPackage: null,\n };\n }\n\n const instrumentationPackage = LOGGER_INSTRUMENTATION[logger];\n const hasInstrumentation = !!deps[instrumentationPackage];\n\n // Check if logger is configured in source code\n const sourceFiles = findSourceFiles(packageRoot);\n let configuredInCode = false;\n\n for (const filePath of sourceFiles) {\n const content = readFileSafe(filePath);\n if (!content) continue;\n\n // Check if init() is called\n if (!content.includes('init(')) continue;\n\n // Extract autoInstrumentations\n const instrumentations = extractAutoInstrumentations(content);\n if (instrumentations.includes(logger)) {\n configuredInCode = true;\n break;\n }\n }\n\n return {\n logger,\n hasLogger: true,\n hasInstrumentation,\n configuredInCode,\n instrumentationPackage,\n };\n}\n","import type {\n DoctorOptions,\n Check,\n CheckSummary,\n DoctorResult,\n Preset,\n} from '../types/index';\nimport { discoverProject } from '../lib/project';\nimport { detectConfig } from '../lib/config-detector';\nimport { getAutotelInfo, checkAutotelVersions } from '../lib/dependency-auditor';\nimport { checkEsmHook } from '../lib/esm-checker';\nimport { checkEnvVarsPresent } from '../lib/env-generator';\nimport { getInstallCommand } from '../lib/package-manager';\nimport { getPreset } from '../presets/index';\nimport { checkLoggerInstrumentation } from '../lib/logger-checker';\nimport * as output from '../ui/output';\nimport { createSpinner } from '../ui/spinner';\n\n/**\n * All available check definitions\n */\nconst CHECK_DEFINITIONS = [\n { id: 'autotel-installed', title: 'Autotel installed', description: 'Check if autotel is installed' },\n { id: 'peer-deps', title: 'Peer dependencies', description: 'Check if required peer dependencies are installed' },\n { id: 'esm-hook', title: 'ESM hook setup', description: 'Check if autotel/register is imported correctly' },\n { id: 'env-vars', title: 'Environment variables', description: 'Check if required env vars are present' },\n { id: 'version-compat', title: 'Version compatibility', description: 'Check autotel package versions match' },\n { id: 'config-found', title: 'Configuration found', description: 'Check if instrumentation config exists' },\n { id: 'logger-instrumentation', title: 'Logger instrumentation', description: 'Check if logger instrumentation packages are installed' },\n];\n\n/**\n * Infer backend from dependencies and env files\n */\nasync function inferBackend(\n packageRoot: string,\n deps: Record<string, string>\n): Promise<Preset | null> {\n // Check for known backend packages\n if (deps['autotel-backends']) {\n // Check for grpc exporter - likely Honeycomb\n if (deps['@opentelemetry/exporter-trace-otlp-grpc']) {\n return getPreset('backend', 'honeycomb') ?? null;\n }\n // Check for http exporter - could be Datadog or generic\n if (deps['@opentelemetry/exporter-trace-otlp-http']) {\n // Check env files for DD_ prefix\n const ddVars = await checkEnvVarsPresent(packageRoot, ['DATADOG_API_KEY', 'DD_API_KEY']);\n for (const [, result] of ddVars) {\n if (result.found) {\n return getPreset('backend', 'datadog') ?? null;\n }\n }\n return getPreset('backend', 'otlp-http') ?? null;\n }\n }\n\n return null;\n}\n\n/**\n * Run all doctor checks\n */\nasync function runChecks(\n options: DoctorOptions,\n projectRoot: string\n): Promise<Check[]> {\n const project = discoverProject(projectRoot);\n if (!project) {\n return [{\n id: 'project',\n title: 'Project discovery',\n level: 'error',\n status: 'error',\n message: 'No package.json found',\n }];\n }\n\n const checks: Check[] = [];\n const deps = { ...project.packageJson.dependencies, ...project.packageJson.devDependencies };\n\n // Check 1: Autotel installed\n const autotelInfo = getAutotelInfo(project.packageJson);\n if (autotelInfo.installed) {\n checks.push({\n id: 'autotel-installed',\n title: 'Autotel installed',\n level: 'error',\n status: 'ok',\n message: `autotel@${autotelInfo.version} is installed`,\n });\n } else {\n checks.push({\n id: 'autotel-installed',\n title: 'Autotel installed',\n level: 'error',\n status: 'error',\n message: 'autotel is not installed',\n fix: {\n cmd: getInstallCommand(project.packageManager, ['autotel']),\n description: 'Install autotel package',\n },\n });\n }\n\n // Check 2: Config found\n const config = detectConfig(project.packageRoot);\n if (config.found) {\n if (config.type === 'cli-owned') {\n checks.push({\n id: 'config-found',\n title: 'Configuration found',\n level: 'info',\n status: 'ok',\n message: `CLI-owned instrumentation at ${config.path}`,\n });\n } else if (config.type === 'user-created') {\n checks.push({\n id: 'config-found',\n title: 'Configuration found',\n level: 'info',\n status: 'ok',\n message: `User-created instrumentation at ${config.path}`,\n details: ['Add CLI header to enable auto-updates'],\n });\n } else {\n checks.push({\n id: 'config-found',\n title: 'Configuration found',\n level: 'info',\n status: 'ok',\n message: `Config found at ${config.path}`,\n });\n }\n } else {\n checks.push({\n id: 'config-found',\n title: 'Configuration found',\n level: 'info',\n status: 'warn',\n message: 'No instrumentation config found',\n details: [\n 'Run `autotel init` to create a CLI-owned config',\n \"Or add `import 'autotel/register'` and call `init()` manually\",\n ],\n });\n }\n\n // Infer backend for preset-aware checks\n const inferredBackend = await inferBackend(project.packageRoot, deps);\n const canInferPreset = inferredBackend !== null || config.type === 'cli-owned';\n\n // Check 3: Peer dependencies (preset-aware)\n if (canInferPreset && inferredBackend) {\n const missingDeps: string[] = [];\n for (const pkg of inferredBackend.packages.required) {\n if (!deps[pkg]) {\n missingDeps.push(pkg);\n }\n }\n\n if (missingDeps.length > 0) {\n checks.push({\n id: 'peer-deps',\n title: 'Peer dependencies',\n level: 'warning',\n status: 'warn',\n message: 'Missing peer dependencies required by selected backend',\n details: missingDeps.map((d) => `Missing: ${d}`),\n fix: {\n cmd: getInstallCommand(project.packageManager, missingDeps),\n description: 'Install missing peer dependencies',\n },\n });\n } else {\n checks.push({\n id: 'peer-deps',\n title: 'Peer dependencies',\n level: 'warning',\n status: 'ok',\n message: 'All peer dependencies satisfied',\n });\n }\n } else {\n checks.push({\n id: 'peer-deps',\n title: 'Peer dependencies',\n level: 'warning',\n status: 'skip',\n message: 'Could not infer backend; skipping peer dep check',\n details: [\n 'Run `autotel init` to create a CLI-owned config',\n 'Or add header marker to existing instrumentation',\n ],\n });\n }\n\n // Check 4: Env vars (preset-aware)\n if (canInferPreset && inferredBackend && inferredBackend.env.required.length > 0) {\n const requiredVarNames = inferredBackend.env.required.map((v) => v.name);\n const envResults = await checkEnvVarsPresent(\n project.packageRoot,\n requiredVarNames,\n options.envFile\n );\n\n const missingVars: string[] = [];\n for (const [varName, result] of envResults) {\n if (!result.found) {\n missingVars.push(varName);\n }\n }\n\n if (missingVars.length > 0) {\n checks.push({\n id: 'env-vars',\n title: 'Environment variables',\n level: 'warning',\n status: 'warn',\n message: 'Missing required environment variables',\n details: [\n ...missingVars.map((v) => `Missing: ${v}`),\n 'Set in environment or deployment secrets',\n ],\n });\n } else {\n checks.push({\n id: 'env-vars',\n title: 'Environment variables',\n level: 'warning',\n status: 'ok',\n message: 'Required environment variables found',\n });\n }\n } else if (!canInferPreset) {\n checks.push({\n id: 'env-vars',\n title: 'Environment variables',\n level: 'warning',\n status: 'skip',\n message: 'Could not infer backend; skipping env check',\n });\n } else {\n checks.push({\n id: 'env-vars',\n title: 'Environment variables',\n level: 'warning',\n status: 'ok',\n message: 'No required environment variables for this backend',\n });\n }\n\n // Check 5: Version compatibility\n const versionCheck = checkAutotelVersions(project.packageJson);\n if (versionCheck.packages.length > 1) {\n if (versionCheck.compatible) {\n checks.push({\n id: 'version-compat',\n title: 'Version compatibility',\n level: 'warning',\n status: 'ok',\n message: 'All autotel packages are compatible',\n });\n } else {\n checks.push({\n id: 'version-compat',\n title: 'Version compatibility',\n level: 'warning',\n status: 'warn',\n message: 'Autotel packages have mismatched major versions',\n details: versionCheck.packages.map((p) => `${p.name}@${p.version}`),\n });\n }\n } else {\n checks.push({\n id: 'version-compat',\n title: 'Version compatibility',\n level: 'warning',\n status: 'skip',\n message: 'Only one autotel package installed; skipping version check',\n });\n }\n\n // Check 6: ESM hook setup (conservative)\n const esmCheck = checkEsmHook(project);\n checks.push({\n id: 'esm-hook',\n title: 'ESM hook setup',\n level: esmCheck.status === 'warn' ? 'warning' : 'info',\n status: esmCheck.status === 'ok' ? 'ok' :\n esmCheck.status === 'warn' ? 'warn' :\n esmCheck.status === 'error' ? 'error' : 'skip',\n message: esmCheck.message,\n details: esmCheck.details,\n });\n\n // Check 7: Logger instrumentation\n const loggerCheck = checkLoggerInstrumentation(project.packageRoot, deps);\n if (loggerCheck.hasLogger) {\n if (loggerCheck.configuredInCode && !loggerCheck.hasInstrumentation) {\n checks.push({\n id: 'logger-instrumentation',\n title: 'Logger instrumentation',\n level: 'warning',\n status: 'warn',\n message: `${loggerCheck.logger} is configured but instrumentation package is missing`,\n details: [\n `${loggerCheck.logger} is used in autoInstrumentations but ${loggerCheck.instrumentationPackage} is not installed`,\n `Install it: ${getInstallCommand(project.packageManager, [loggerCheck.instrumentationPackage!])}`,\n ],\n fix: {\n cmd: getInstallCommand(project.packageManager, [loggerCheck.instrumentationPackage!]),\n description: `Install ${loggerCheck.instrumentationPackage}`,\n },\n });\n } else if (loggerCheck.hasInstrumentation && loggerCheck.configuredInCode) {\n checks.push({\n id: 'logger-instrumentation',\n title: 'Logger instrumentation',\n level: 'info',\n status: 'ok',\n message: `${loggerCheck.logger} instrumentation is properly configured`,\n });\n } else if (loggerCheck.hasInstrumentation && !loggerCheck.configuredInCode) {\n checks.push({\n id: 'logger-instrumentation',\n title: 'Logger instrumentation',\n level: 'info',\n status: 'ok',\n message: `${loggerCheck.logger} instrumentation package is installed`,\n details: [\n `Add '${loggerCheck.logger}' to autoInstrumentations in your init() call to enable trace context injection`,\n ],\n });\n } else {\n checks.push({\n id: 'logger-instrumentation',\n title: 'Logger instrumentation',\n level: 'info',\n status: 'skip',\n message: `${loggerCheck.logger} is installed but not configured in code`,\n });\n }\n } else {\n checks.push({\n id: 'logger-instrumentation',\n title: 'Logger instrumentation',\n level: 'info',\n status: 'skip',\n message: 'No logger packages detected (winston, bunyan, pino)',\n });\n }\n\n return checks;\n}\n\n/**\n * Calculate summary from checks\n */\nfunction calculateSummary(checks: Check[]): CheckSummary {\n return {\n ok: checks.filter((c) => c.status === 'ok').length,\n warnings: checks.filter((c) => c.status === 'warn').length,\n errors: checks.filter((c) => c.status === 'error').length,\n skipped: checks.filter((c) => c.status === 'skip').length,\n };\n}\n\n/**\n * Determine exit code from checks\n */\nfunction getExitCode(checks: Check[]): number {\n const hasErrors = checks.some((c) => c.status === 'error');\n const hasWarnings = checks.some((c) => c.status === 'warn');\n\n if (hasErrors) return 2;\n if (hasWarnings) return 1;\n return 0;\n}\n\n/**\n * Run the doctor command\n */\nexport async function runDoctor(options: DoctorOptions): Promise<void> {\n // Set output mode\n if (options.verbose) {\n process.env['AUTOTEL_VERBOSE'] = 'true';\n }\n if (options.quiet) {\n process.env['AUTOTEL_QUIET'] = 'true';\n }\n\n // List checks mode\n if (options.listChecks) {\n if (options.json) {\n console.log(JSON.stringify(CHECK_DEFINITIONS, null, 2));\n } else {\n output.heading('Available checks:\\n');\n for (const check of CHECK_DEFINITIONS) {\n console.log(` ${check.id}`);\n console.log(` ${check.description}\\n`);\n }\n }\n return;\n }\n\n const spinner = createSpinner();\n\n // Discover project\n spinner.start('Scanning project...');\n const project = discoverProject(options.cwd);\n\n if (!project) {\n spinner.fail('No package.json found');\n output.error('Run this command in a directory with a package.json, or use --cwd');\n process.exit(2);\n }\n\n spinner.text('Running checks...');\n\n // Run all checks\n const checks = await runChecks(options, options.cwd);\n const summary = calculateSummary(checks);\n\n spinner.stop();\n\n // JSON output\n if (options.json) {\n const result: DoctorResult = {\n project: project.packageRoot,\n checks,\n summary,\n };\n console.log(JSON.stringify(result, null, 2));\n process.exit(getExitCode(checks));\n }\n\n // Human output\n output.heading(`autotel doctor\\n`);\n output.dim(`Scanning ${project.packageRoot}...\\n`);\n\n for (const check of checks) {\n const lines = output.formatCheck(check);\n for (const line of lines) {\n console.log(line);\n }\n }\n\n console.log('');\n console.log(output.formatSummary(summary));\n\n // Run fixes if requested\n if (options.fix) {\n const fixableChecks = checks.filter((c) => c.fix && c.status !== 'ok');\n\n if (fixableChecks.length === 0) {\n output.info('\\nNo fixes needed');\n } else {\n output.info(`\\nApplying ${fixableChecks.length} fix(es)...`);\n\n for (const check of fixableChecks) {\n if (!check.fix) continue;\n\n // Only auto-fix safe operations\n if (check.id === 'autotel-installed' || check.id === 'peer-deps') {\n output.info(`Running: ${check.fix.cmd}`);\n try {\n const { execSync } = await import('node:child_process');\n execSync(check.fix.cmd, { cwd: project.packageRoot, stdio: 'inherit' });\n output.success(`Fixed: ${check.title}`);\n } catch {\n output.error(`Failed to fix: ${check.title}`);\n }\n } else {\n output.dim(`Skipping auto-fix for ${check.id} (not safe to auto-fix)`);\n output.dim(`Manual fix: ${check.fix.cmd}`);\n }\n }\n }\n }\n\n process.exit(getExitCode(checks));\n}\n","import { execSync } from 'node:child_process';\nimport type { AddOptions, Preset, PresetType } from '../types/index';\nimport { discoverProject } from '../lib/project';\nimport { detectConfig, isFeatureConfigured } from '../lib/config-detector';\nimport { getInstallCommand } from '../lib/package-manager';\nimport { atomicWrite, readFileSafe } from '../lib/fs';\nimport {\n getPreset,\n getPresetsByType,\n listPresetSlugs,\n} from '../presets/index';\nimport * as output from '../ui/output';\nimport { createSpinner } from '../ui/spinner';\n\n/**\n * Format preset list for output\n */\nfunction formatPresetList(presets: Map<string, Preset>, json: boolean): void {\n if (json) {\n const list = [...presets.entries()].map(([slug, preset]) => ({\n slug,\n name: preset.name,\n description: preset.description,\n requiredEnv: preset.env.required.map((e) => e.name),\n }));\n console.log(JSON.stringify(list, null, 2));\n return;\n }\n\n for (const [slug, preset] of presets) {\n console.log(` ${slug}`);\n console.log(` ${preset.description}`);\n if (preset.env.required.length > 0) {\n const envNames = preset.env.required.map((e) => e.name).join(', ');\n output.dim(` Required env: ${envNames}`);\n }\n console.log('');\n }\n}\n\n/**\n * Show help for a specific preset\n */\nfunction showPresetHelp(preset: Preset): void {\n output.heading(`\\n${preset.name}\\n`);\n console.log(preset.description);\n console.log('');\n\n output.heading('Packages:');\n for (const pkg of preset.packages.required) {\n console.log(` ${pkg}`);\n }\n if (preset.packages.optional.length > 0) {\n console.log(' Optional:');\n for (const pkg of preset.packages.optional) {\n console.log(` ${pkg}`);\n }\n }\n console.log('');\n\n if (preset.env.required.length > 0) {\n output.heading('Required Environment Variables:');\n for (const envVar of preset.env.required) {\n console.log(` ${envVar.name}`);\n console.log(` ${envVar.description}`);\n if (envVar.example) {\n output.dim(` Example: ${envVar.example}`);\n }\n }\n console.log('');\n }\n\n if (preset.env.optional.length > 0) {\n output.heading('Optional Environment Variables:');\n for (const envVar of preset.env.optional) {\n console.log(` ${envVar.name}`);\n console.log(` ${envVar.description}`);\n }\n console.log('');\n }\n\n output.heading('Next Steps:');\n for (const step of preset.nextSteps) {\n console.log(` - ${step}`);\n }\n}\n\n/**\n * Parse preset type from string\n */\nfunction parsePresetType(type: string): PresetType | null {\n const validTypes: PresetType[] = ['backend', 'subscriber', 'plugin', 'platform'];\n if (validTypes.includes(type as PresetType)) {\n return type as PresetType;\n }\n return null;\n}\n\n/**\n * Update instrumentation file with new preset\n */\nexport function addPresetToFile(\n content: string,\n preset: Preset\n): string {\n // This is a simplified implementation\n // In a full implementation, we'd parse the file and insert at the right sections\n // For now, we'll add imports and config at the end of each section\n\n let result = content;\n\n // Add imports\n for (const imp of preset.imports) {\n const importLine = imp.sideEffect\n ? `import '${imp.source}';`\n : imp.default\n ? `import ${imp.default} from '${imp.source}';`\n : `import { ${imp.specifiers?.join(', ')} } from '${imp.source}';`;\n\n // Check if import already exists (match the full import statement pattern)\n const importPattern = imp.sideEffect\n ? `import '${imp.source}'`\n : imp.default\n ? `from '${imp.source}'`\n : `from '${imp.source}'`;\n if (!result.includes(importPattern)) {\n // Find the appropriate section marker and add after it\n const sectionMarker = preset.type === 'backend' || preset.type === 'platform' ? '// --- AUTOTEL:BACKEND ---' :\n preset.type === 'plugin' ? '// --- AUTOTEL:PLUGINS ---' :\n preset.type === 'subscriber' ? '// --- AUTOTEL:SUBSCRIBERS ---' : null;\n\n if (sectionMarker && result.includes(sectionMarker)) {\n result = result.replace(sectionMarker, `${sectionMarker}\\n${importLine}`);\n } else {\n // Add at the end of imports section\n const initIndex = result.indexOf('init({');\n if (initIndex > 0) {\n result = result.slice(0, initIndex) + `${importLine}\\n\\n` + result.slice(initIndex);\n }\n }\n }\n }\n\n // Add config block\n const configCode = preset.configBlock.code;\n const configSection = preset.configBlock.section;\n\n if (configSection === 'BACKEND_CONFIG') {\n // Replace backend config section\n const backendMarker = '// --- AUTOTEL:BACKEND_CONFIG ---';\n if (result.includes(backendMarker)) {\n // Find the marker and the next line(s) until we hit another marker or closing brace\n const markerIndex = result.indexOf(backendMarker);\n const afterMarker = result.slice(markerIndex + backendMarker.length);\n\n // Find where the config ends (next marker, subscribers:, or closing });)\n const nextMarkerMatch = afterMarker.match(/\\n\\s*(\\/\\/ --- AUTOTEL:|subscribers:|}\\);)/);\n const endIndex = nextMarkerMatch\n ? markerIndex + backendMarker.length + (nextMarkerMatch.index ?? 0)\n : markerIndex + backendMarker.length;\n\n result = result.slice(0, markerIndex) +\n backendMarker + '\\n ' + configCode + '\\n' +\n result.slice(endIndex);\n } else {\n // Insert after init({ if no marker exists\n const initMatch = result.match(/init\\(\\{/);\n if (initMatch && initMatch.index !== undefined) {\n const insertPoint = initMatch.index + 'init({'.length;\n result = result.slice(0, insertPoint) +\n '\\n ' + backendMarker + '\\n ' + configCode +\n result.slice(insertPoint);\n }\n }\n } else if (configSection === 'SUBSCRIBERS_CONFIG') {\n // Find subscribers array and add\n const subscribersMatch = result.match(/subscribers:\\s*\\[([^\\]]*)\\]/s);\n if (subscribersMatch) {\n const existingSubscribers = subscribersMatch[1]?.trim();\n const newSubscribers = existingSubscribers\n ? `${existingSubscribers}\\n ${configCode}`\n : `\\n ${configCode}\\n `;\n result = result.replace(subscribersMatch[0], `subscribers: [${newSubscribers}]`);\n } else {\n // No subscribers array exists - create one\n // Find the closing }); of init() - it's the first }); after init({\n const subscribersMarker = '// --- AUTOTEL:SUBSCRIBERS_CONFIG ---';\n const initStart = result.indexOf('init({');\n if (initStart !== -1) {\n const afterInit = result.slice(initStart);\n const closingMatch = afterInit.match(/}\\);/);\n if (closingMatch && closingMatch.index !== undefined) {\n const insertPoint = initStart + closingMatch.index;\n result = result.slice(0, insertPoint) +\n '\\n ' + subscribersMarker + '\\n subscribers: [\\n ' +\n configCode + '\\n ],\\n' +\n result.slice(insertPoint);\n }\n }\n }\n } else if (configSection === 'PLUGIN_INIT') {\n // Add at end before file ends\n const pluginMarker = '// --- AUTOTEL:PLUGIN_INIT ---';\n if (result.includes(pluginMarker)) {\n result = result.replace(pluginMarker, `${pluginMarker}\\n${configCode}`);\n } else {\n result = result.trimEnd() + `\\n\\n${pluginMarker}\\n${configCode}\\n`;\n }\n }\n\n return result;\n}\n\n/**\n * Run the add command\n */\nexport async function runAdd(\n type: string | undefined,\n name: string | undefined,\n options: AddOptions\n): Promise<void> {\n // Set output mode\n if (options.verbose) {\n process.env['AUTOTEL_VERBOSE'] = 'true';\n }\n if (options.quiet) {\n process.env['AUTOTEL_QUIET'] = 'true';\n }\n\n // List all presets\n if (options.list && !type) {\n output.heading('\\nAvailable presets:\\n');\n\n output.heading('Backends:');\n formatPresetList(getPresetsByType('backend'), options.json);\n\n output.heading('Subscribers:');\n formatPresetList(getPresetsByType('subscriber'), options.json);\n\n output.heading('Plugins:');\n formatPresetList(getPresetsByType('plugin'), options.json);\n\n output.heading('Platforms:');\n formatPresetList(getPresetsByType('platform'), options.json);\n\n return;\n }\n\n // Validate type\n if (!type) {\n output.error('Usage: autotel add <type> <name>');\n output.info('Types: backend, subscriber, plugin, platform');\n output.info('Run `autotel add --list` to see all presets');\n process.exit(1);\n }\n\n const presetType = parsePresetType(type);\n if (!presetType) {\n output.error(`Invalid type: ${type}`);\n output.info('Valid types: backend, subscriber, plugin, platform');\n process.exit(1);\n }\n\n // List presets for type\n if (options.list) {\n output.heading(`\\n${presetType} presets:\\n`);\n formatPresetList(getPresetsByType(presetType), options.json);\n return;\n }\n\n // Validate name\n if (!name) {\n output.error(`Usage: autotel add ${type} <name>`);\n output.info(`Available ${type}s: ${listPresetSlugs(presetType).join(', ')}`);\n process.exit(1);\n }\n\n // Get preset\n const preset = getPreset(presetType, name);\n if (!preset) {\n output.error(`Unknown ${type}: ${name}`);\n output.info(`Available ${type}s: ${listPresetSlugs(presetType).join(', ')}`);\n process.exit(1);\n }\n\n // Show help for preset\n if (process.argv.includes('--help') || process.argv.includes('-h')) {\n showPresetHelp(preset);\n return;\n }\n\n const spinner = createSpinner();\n\n // Discover project\n spinner.start('Discovering project...');\n const project = discoverProject(options.cwd);\n\n if (!project) {\n spinner.fail('No package.json found');\n output.error('Run this command in a directory with a package.json, or use --cwd');\n process.exit(1);\n }\n\n spinner.succeed(`Found ${project.packageJson.name ?? 'project'}`);\n\n // Check if already installed\n const deps = { ...project.packageJson.dependencies, ...project.packageJson.devDependencies };\n const allInstalled = preset.packages.required.every((pkg) => deps[pkg]);\n\n // Check if already configured\n const config = detectConfig(project.packageRoot);\n let alreadyConfigured = false;\n\n if (config.instrumentationFile) {\n alreadyConfigured = isFeatureConfigured(config.instrumentationFile, presetType);\n }\n\n // Idempotency check\n if (allInstalled && alreadyConfigured) {\n output.success(`[OK] ${preset.name} is already installed and configured`);\n return;\n }\n\n if (allInstalled) {\n output.info(`Packages already installed`);\n }\n\n if (alreadyConfigured) {\n output.info(`Already configured in instrumentation file`);\n }\n\n // Dry run\n if (options.dryRun) {\n output.heading('\\nDry run - no changes will be made\\n');\n\n if (!allInstalled) {\n const cmd = getInstallCommand(project.packageManager, preset.packages.required);\n output.info(`Would run: ${cmd}`);\n }\n\n if (!alreadyConfigured) {\n output.info(`Would update instrumentation file with ${preset.name} config`);\n }\n\n return;\n }\n\n // Install packages\n if (!allInstalled && !options.noInstall) {\n const missingPkgs = preset.packages.required.filter((pkg) => !deps[pkg]);\n const cmd = getInstallCommand(project.packageManager, missingPkgs);\n\n if (options.printInstallCmd) {\n output.info(`Install command: ${cmd}`);\n } else {\n spinner.start('Installing packages...');\n try {\n execSync(cmd, { cwd: project.packageRoot, stdio: 'pipe' });\n spinner.succeed('Packages installed');\n } catch {\n spinner.fail('Failed to install packages');\n output.error(`Run manually: ${cmd}`);\n }\n }\n }\n\n // Update instrumentation file\n if (!alreadyConfigured) {\n if (!config.found || config.type === 'none') {\n output.warn('No instrumentation file found');\n output.info('Run `autotel init` first to create one');\n process.exit(1);\n }\n\n if (config.type === 'user-created' && !options.force) {\n output.warn('Instrumentation file exists but is not CLI-owned');\n output.info('Use --force to modify, or add CLI header to the file');\n process.exit(1);\n }\n\n const instrPath = config.path!;\n const content = readFileSafe(instrPath);\n\n if (content) {\n spinner.start('Updating instrumentation file...');\n const updatedContent = addPresetToFile(content, preset);\n atomicWrite(instrPath, updatedContent, {\n root: project.packageRoot,\n backup: options.force,\n });\n spinner.succeed('Instrumentation file updated');\n }\n }\n\n // Print next steps\n console.log(output.formatFooter({\n detected: `${project.packageManager}`,\n next: preset.nextSteps[0],\n }));\n\n if (preset.nextSteps.length > 1) {\n console.log('\\nAdditional steps:');\n for (const step of preset.nextSteps.slice(1)) {\n console.log(` - ${step}`);\n }\n }\n}\n","import * as path from 'node:path';\nimport { glob } from 'glob';\nimport type { CodemodTraceOptions } from '../types/index';\nimport { readFileSafe, fileExists } from '../lib/fs';\nimport { transformFile } from '../lib/codemod-trace';\nimport * as output from '../ui/output';\n\nconst CODEMOD_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);\nconst GLOB_META = /[*?[\\]]/;\n\n/**\n * Resolve path argument to a list of absolute file paths.\n * - If path has no glob metacharacters and is an existing file, return that file.\n * - Otherwise treat as glob; restrict to .ts, .tsx, .js, .jsx; exclude node_modules and *.d.ts.\n */\nexport async function resolveCodemodFiles(\n pathArg: string,\n cwd: string\n): Promise<string[]> {\n const isGlob = GLOB_META.test(pathArg);\n if (!isGlob) {\n const absolute = path.isAbsolute(pathArg) ? pathArg : path.resolve(cwd, pathArg);\n if (fileExists(absolute)) {\n const ext = path.extname(absolute);\n if (CODEMOD_EXTENSIONS.has(ext) && !absolute.endsWith('.d.ts')) {\n return [absolute];\n }\n return [];\n }\n }\n\n const pattern = path.isAbsolute(pathArg) ? pathArg : path.join(cwd, pathArg);\n const matches = await glob(pattern, {\n cwd,\n absolute: true,\n ignore: ['**/node_modules/**', '**/*.d.ts'],\n });\n\n return matches.filter((f) => {\n const ext = path.extname(f);\n return CODEMOD_EXTENSIONS.has(ext) && !f.endsWith('.d.ts');\n });\n}\n\n/**\n * Run the codemod trace command: resolve files, transform each, write or dry-run.\n */\nexport async function runCodemodTrace(options: CodemodTraceOptions): Promise<void> {\n const { path: pathArg, cwd, dryRun, namePattern, skip, printFiles, verbose, quiet } = options;\n\n const files = await resolveCodemodFiles(pathArg, cwd);\n if (files.length === 0) {\n if (!quiet) {\n output.error(`No matching files found for: ${pathArg}`);\n }\n process.exitCode = 1;\n return;\n }\n\n const skipRegExps = skip?.map((s) => new RegExp(s)) ?? [];\n const transformOptions = { namePattern, skip: skipRegExps.length > 0 ? skipRegExps : undefined };\n\n let totalWrapped = 0;\n let totalChanged = 0;\n\n for (const filePath of files) {\n const content = readFileSafe(filePath);\n if (content === null) {\n if (verbose) output.dim(`Skip ${filePath} (unreadable)`);\n continue;\n }\n\n let result: Awaited<ReturnType<typeof transformFile>>;\n try {\n result = transformFile(content, filePath, transformOptions);\n } catch (error) {\n if (!quiet) {\n output.error(`Failed to transform ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (verbose && error instanceof Error && error.stack) output.dim(error.stack);\n process.exitCode = 1;\n continue;\n }\n\n\n const relativePath = path.relative(cwd, filePath);\n\n if (result.changed) {\n totalWrapped += result.wrappedCount;\n totalChanged += 1;\n if (!dryRun) {\n const fs = await import('node:fs');\n fs.writeFileSync(filePath, result.modified, 'utf8');\n }\n }\n\n const showSummary = printFiles || dryRun || result.changed;\n if (showSummary && !quiet) {\n if (result.changed) {\n console.log(`✔ ${relativePath} (${result.wrappedCount} wrapped)`);\n } else if (result.skipped.length > 0) {\n const reasons = [...new Set(result.skipped.map((s) => s.reason))].join('; ');\n console.log(`↷ ${relativePath} (skipped: ${reasons})`);\n }\n }\n }\n\n if (dryRun && totalChanged > 0 && !quiet) {\n console.log('');\n output.dim(`Dry run: ${totalChanged} file(s) would be updated, ${totalWrapped} function(s) wrapped.`);\n }\n}\n","import * as path from 'node:path';\nimport { Project, type SourceFile, type Node, SyntaxKind } from 'ts-morph';\n\nexport interface TransformResult {\n modified: string;\n changed: boolean;\n wrappedCount: number;\n skipped: { name: string; reason: string }[];\n}\n\nexport interface TransformOptions {\n namePattern?: string;\n skip?: RegExp[];\n}\n\nconst TRACE_IMPORT_MODULE = 'autotel';\n\nfunction hasTraceImport(sourceFile: SourceFile): boolean {\n for (const imp of sourceFile.getImportDeclarations()) {\n if (imp.getModuleSpecifierValue() !== TRACE_IMPORT_MODULE) continue;\n for (const spec of imp.getNamedImports()) {\n const name = spec.getName();\n if (name === 'trace') return true;\n const alias = spec.getAliasNode()?.getText();\n if (alias === 'trace' || name === 'trace') return true;\n }\n }\n return false;\n}\n\nfunction addTraceImport(sourceFile: SourceFile): void {\n if (hasTraceImport(sourceFile)) return;\n sourceFile.insertImportDeclaration(0, {\n moduleSpecifier: TRACE_IMPORT_MODULE,\n namedImports: ['trace'],\n });\n}\n\nfunction expandNamePattern(\n pattern: string,\n name: string,\n filePath: string,\n cwd: string\n): string {\n const file = path.basename(filePath, path.extname(filePath));\n const relPath = path.relative(cwd, filePath).replaceAll('\\\\', '/');\n return pattern\n .replaceAll('{name}', name)\n .replaceAll('{file}', file)\n .replaceAll('{path}', relPath);\n}\n\nfunction getSpanName(\n name: string,\n filePath: string,\n options: TransformOptions\n): string {\n if (options.namePattern) {\n return expandNamePattern(options.namePattern, name, filePath, process.cwd());\n }\n return name;\n}\n\nfunction shouldSkipName(name: string, options: TransformOptions): boolean {\n if (!options.skip?.length) return false;\n return options.skip.some((re) => re.test(name));\n}\n\nfunction isAlreadyWrapped(node: Node): boolean {\n const text = node.getText();\n const trimmed = text.trimStart();\n return trimmed.startsWith('trace(');\n}\n\nfunction bodyContainsSuper(body: Node): boolean {\n let found = false;\n body.forEachDescendant((desc) => {\n if (desc.getKind() === SyntaxKind.SuperKeyword) found = true;\n });\n return found;\n}\n\nfunction isGenerator(method: { isGenerator(): boolean }): boolean {\n return method.isGenerator?.() ?? false;\n}\n\nfunction isInsideTraceCall(node: Node): boolean {\n let current: Node | undefined = node.getParent();\n while (current) {\n if (current.getKind() === SyntaxKind.CallExpression) {\n const expr = (current as Node & { getExpression(): Node }).getExpression?.();\n if (expr?.getText() === 'trace') return true;\n }\n current = current.getParent();\n }\n return false;\n}\n\n/**\n * Transform a single file: wrap eligible functions in trace(), add import if needed.\n * No-op if no eligible functions or all skipped (no file change, no import added).\n */\nexport function transformFile(\n content: string,\n filePath: string,\n options: TransformOptions\n): TransformResult {\n const skipped: { name: string; reason: string }[] = [];\n let wrappedCount = 0;\n\n const project = new Project({ useInMemoryFileSystem: true });\n const sourceFile = project.createSourceFile(filePath, content);\n const edits: { node: Node; newText: string }[] = [];\n\n // Helper to record skip and return\n function skip(name: string, reason: string): boolean {\n skipped.push({ name, reason });\n return true;\n }\n\n // Default export function: ts-morph exposes it via getExportedDeclarations(\"default\"), not getExportAssignment\n const defaultDecls = sourceFile.getExportedDeclarations().get('default');\n const defaultFn =\n defaultDecls?.[0] &&\n (defaultDecls[0].getKind() === SyntaxKind.FunctionDeclaration ||\n defaultDecls[0].getKind() === SyntaxKind.FunctionExpression)\n ? defaultDecls[0]\n : undefined;\n const allFns = sourceFile.getFunctions().filter((f) => !f.isOverload());\n const onlyDefaultExportFn =\n defaultFn &&\n allFns.length === 1 &&\n (allFns[0] === defaultFn || allFns[0]!.getStart() === defaultFn.getStart());\n\n // 1. Function declarations (including export function); skip if file has only default export fn\n for (const fn of allFns) {\n if (onlyDefaultExportFn) continue; // handle in step 2 only\n if (defaultFn && fn === defaultFn) continue; // do not double-edit default export\n if (isInsideTraceCall(fn)) continue; // inside trace() e.g. from prior replacement\n const name = fn.getName();\n if (!name) continue; // anonymous, skip for v1\n const spanName = getSpanName(name, filePath, options);\n if (shouldSkipName(spanName, options)) {\n skip(spanName, 'name match');\n continue;\n }\n if (isAlreadyWrapped(fn)) {\n skip(spanName, 'already wrapped');\n continue;\n }\n const mod = fn.getModifiers().map((m) => m.getText()).join(' ');\n const modPrefix = mod ? mod + ' ' : '';\n const fnText = fn.getText();\n const rest = fnText.replace(/^function\\s*\\w*\\s*/, '');\n const newText = `${modPrefix}const ${name} = trace('${spanName}', function ${name}${rest};`;\n edits.push({ node: fn, newText });\n wrappedCount += 1;\n }\n\n // 2. Default export function (export default function name() {})\n if (defaultFn) {\n const name = (defaultFn as { getName?: () => string }).getName?.();\n if (!name) {\n skip('(default export)', 'anonymous default export');\n } else {\n const spanName = getSpanName(name, filePath, options);\n if (shouldSkipName(spanName, options)) {\n skip(spanName, 'name match');\n } else {\n const fn = defaultFn as Node & { getParameters(): Node[]; getBody(): Node | undefined };\n const params = fn.getParameters?.() ?? [];\n const paramsText = params.map((p) => p.getText()).join(', ');\n const body = fn.getBody?.();\n const bodyText = body?.getText() ?? '{}';\n const decl = `const ${name} = trace('${spanName}', function ${name}(${paramsText}) ${bodyText};`;\n const full = decl + '\\nexport default ' + name + ';';\n edits.push({ node: defaultFn, newText: full });\n wrappedCount += 1;\n }\n }\n }\n\n // 3. Variable declarations with arrow or function expression\n for (const stmt of sourceFile.getVariableStatements()) {\n for (const decl of stmt.getDeclarationList().getDeclarations()) {\n const init = decl.getInitializer();\n if (!init) continue;\n const kind = init.getKind();\n const isArrow = kind === SyntaxKind.ArrowFunction;\n const isFnExpr = kind === SyntaxKind.FunctionExpression;\n const isCall = kind === SyntaxKind.CallExpression;\n if (isCall) {\n const callExpr = init as Node & { getExpression(): Node };\n const exprText = callExpr.getExpression().getText();\n if (exprText === 'trace') {\n const name = decl.getName();\n if (typeof name === 'string') {\n const spanName = getSpanName(name, filePath, options);\n skipped.push({ name: spanName, reason: 'already wrapped' });\n }\n continue;\n }\n }\n if (!isArrow && !isFnExpr) continue;\n const name = decl.getName();\n if (typeof name !== 'string') continue; // array/object binding\n const spanName = getSpanName(name, filePath, options);\n if (shouldSkipName(spanName, options)) {\n skip(spanName, 'name match');\n continue;\n }\n if (isAlreadyWrapped(init)) {\n skipped.push({ name: spanName, reason: 'already wrapped' });\n continue;\n }\n const initText = init.getText();\n const newInit = `trace('${spanName}', ${initText})`;\n edits.push({ node: init, newText: newInit });\n wrappedCount += 1;\n }\n }\n\n // 4. Class methods\n for (const clazz of sourceFile.getClasses()) {\n const className = clazz.getName();\n if (!className) continue;\n for (const _ctor of clazz.getConstructors()) {\n skipped.push({ name: `${className}.constructor`, reason: 'constructor' });\n }\n for (const method of clazz.getMethods()) {\n const getter = method.getFirstChildByKind(SyntaxKind.GetKeyword);\n const setter = method.getFirstChildByKind(SyntaxKind.SetKeyword);\n if (getter || setter) {\n skip(method.getName() ?? '(getter/setter)', 'getter/setter');\n continue;\n }\n if (isGenerator(method)) {\n skip(`${className}.${method.getName()}`, 'generator');\n continue;\n }\n const methodName = method.getName();\n const spanName = getSpanName(`${className}.${methodName}`, filePath, options);\n if (shouldSkipName(spanName, options)) {\n skip(spanName, 'name match');\n continue;\n }\n const body = method.getBody();\n if (!body) continue;\n if (bodyContainsSuper(body)) {\n skip(spanName, 'super');\n continue;\n }\n const bodyText = body.getText();\n const innerBody = bodyText.slice(1, -1).trim();\n const isAsync = method.isAsync();\n const prefix = isAsync ? 'async ' : '';\n const newBody = `{\\n return trace('${spanName}', ${prefix}() => {\\n${innerBody}\\n})();\\n}`;\n edits.push({ node: body, newText: newBody });\n wrappedCount += 1;\n }\n }\n\n // 5. Object method shorthand (const o = { method() {} })\n for (const stmt of sourceFile.getVariableStatements()) {\n for (const decl of stmt.getDeclarationList().getDeclarations()) {\n const init = decl.getInitializer();\n if (!init || init.getKind() !== SyntaxKind.ObjectLiteralExpression) continue;\n const obj = init as { getProperties(): Node[] };\n for (const prop of obj.getProperties()) {\n if (prop.getKind() !== SyntaxKind.MethodDeclaration) continue;\n const method = prop as Node & { getName(): string; getBody(): Node; isGenerator?(): boolean };\n const methodName = method.getName();\n const spanName = getSpanName(methodName, filePath, options);\n if (shouldSkipName(spanName, options)) {\n skip(spanName, 'name match');\n continue;\n }\n if (method.isGenerator?.()) {\n skip(spanName, 'generator');\n continue;\n }\n const body = method.getBody();\n if (!body) continue;\n if (bodyContainsSuper(body)) {\n skip(spanName, 'super');\n continue;\n }\n const bodyText = body.getText();\n const innerBody = bodyText.slice(1, -1).trim();\n const newBody = `{\\n return trace('${spanName}', () => {\\n${innerBody}\\n})();\\n}`;\n edits.push({ node: body, newText: newBody });\n wrappedCount += 1;\n }\n }\n }\n\n // Apply edits in reverse document order so positions stay valid\n edits.sort((a, b) => b.node.getStart() - a.node.getStart());\n for (const { node, newText } of edits) {\n node.replaceWithText(newText);\n }\n\n if (wrappedCount > 0 && !hasTraceImport(sourceFile)) {\n addTraceImport(sourceFile);\n }\n\n const modified = sourceFile.getFullText();\n const changed = wrappedCount > 0;\n\n return {\n modified: changed ? modified : content,\n changed,\n wrappedCount,\n skipped,\n };\n}\n","import { run } from './cli';\n\n// Run the CLI\nrun().catch((error) => {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n});\n"],"mappings":"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","names":["path","path","error","path","path","relative","path","backends","plugins","subscribers","prodPkgs","devPkgs","path","path","fs","execSync","execSync","execSync","path","glob","path","name","spanName","glob","verbose","error","fs","error"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autotel-cli",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "CLI for autotel - setup wizard, diagnostics, and incremental features",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -19,18 +19,18 @@
|
|
|
19
19
|
"@inquirer/prompts": "^8.2.0",
|
|
20
20
|
"chalk": "^5.6.2",
|
|
21
21
|
"commander": "^14.0.3",
|
|
22
|
-
"glob": "^13.0.
|
|
23
|
-
"ora": "^9.
|
|
24
|
-
"semver": "^7.7.
|
|
22
|
+
"glob": "^13.0.1",
|
|
23
|
+
"ora": "^9.3.0",
|
|
24
|
+
"semver": "^7.7.4",
|
|
25
25
|
"ts-morph": "^27.0.2",
|
|
26
26
|
"yaml": "^2.8.2"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@eslint/js": "^
|
|
29
|
+
"@eslint/js": "^10.0.1",
|
|
30
30
|
"@types/eslint-config-prettier": "^6.11.3",
|
|
31
|
-
"@types/node": "^25.
|
|
31
|
+
"@types/node": "^25.2.2",
|
|
32
32
|
"@types/semver": "^7.7.1",
|
|
33
|
-
"eslint": "^
|
|
33
|
+
"eslint": "^10.0.0",
|
|
34
34
|
"eslint-config-prettier": "^10.1.8",
|
|
35
35
|
"eslint-plugin-unicorn": "^62.0.0",
|
|
36
36
|
"tsup": "^8.5.1",
|