autotel-cli 0.8.7 → 0.8.9

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.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/google-cloud.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 * Google Cloud (Telemetry API) preset - send traces to Cloud Trace via OTLP\n */\nexport const googleCloud: BackendPreset = {\n name: 'Google Cloud',\n slug: 'google-cloud',\n type: 'backend',\n description:\n 'Send traces to Google Cloud Observability (Cloud Trace) via the Telemetry API with Application Default Credentials',\n protocol: 'http',\n exporter: 'otlp-http',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-http',\n 'google-auth-library',\n ],\n optional: [\n '@opentelemetry/exporter-metrics-otlp-http',\n '@opentelemetry/sdk-metrics',\n ],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'GOOGLE_CLOUD_PROJECT',\n description: 'Google Cloud project ID',\n example: 'my-project-id',\n sensitive: false,\n },\n ],\n optional: [\n {\n name: 'GOOGLE_APPLICATION_CREDENTIALS',\n description: 'Path to service account key JSON (for ADC)',\n example: '/path/to/key.json',\n sensitive: false,\n },\n {\n name: 'NODE_ENV',\n description: 'Environment (e.g., production, staging)',\n example: 'production',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/google-cloud',\n specifiers: ['createGoogleCloudConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createGoogleCloudConfig({\n projectId: process.env.GOOGLE_CLOUD_PROJECT,\n service: process.env.OTEL_SERVICE_NAME ?? 'my-service',\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Set GOOGLE_CLOUD_PROJECT to your GCP project ID',\n 'Configure Application Default Credentials (gcloud auth application-default login or GOOGLE_APPLICATION_CREDENTIALS)',\n 'Enable the Telemetry API in your project',\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 { googleCloud } from './backends/google-cloud';\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 ['google-cloud', googleCloud],\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 'node-google-cloud',\n {\n name: 'Node.js + Google Cloud',\n slug: 'node-google-cloud',\n description: 'Node.js with Google Cloud Observability (Telemetry API)',\n backend: 'google-cloud',\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 googleCloud,\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"]}
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/dep-detector.ts","../src/lib/plan-builder.ts","../src/presets/backends/datadog.ts","../src/presets/backends/google-cloud.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/plugins/sentry.ts","../src/presets/plugins/hono.ts","../src/presets/plugins/mcp.ts","../src/presets/plugins/tanstack.ts","../src/presets/platforms/aws.ts","../src/presets/index.ts","../src/lib/errors.ts","../src/lib/plan.ts","../src/lib/instrumentation-parser.ts","../src/ui/preview.ts","../src/lib/json-output.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/commands/schema.ts","../src/lib/manifest.ts","../src/commands/investigate/health.ts","../src/commands/investigate/runtime.ts","../src/commands/investigate/cli-helpers.ts","../src/commands/investigate/discovery.ts","../src/commands/investigate/investigation.ts","../src/commands/investigate/signals.ts","../src/commands/investigate/topology.ts","../src/commands/investigate/diagnosis.ts","../src/commands/investigate/correlation.ts","../src/commands/investigate/llm.ts","../src/commands/investigate/semconv.ts","../src/commands/investigate/instrumentation.ts","../src/commands/investigate/collector.ts","../src/lib/commander-error.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';\nimport {\n runSchema,\n runSchemaErrors,\n runSchemaOutputs,\n runCommandsListing,\n runExamples,\n runVersion,\n} from './commands/schema';\nimport { registerHealthCommands } from './commands/investigate/health';\nimport { registerDiscoveryCommands } from './commands/investigate/discovery';\nimport {\n registerQueryCommands,\n registerTraceCommands,\n} from './commands/investigate/investigation';\nimport { registerTopologyCommands } from './commands/investigate/topology';\nimport { registerDiagnoseCommands } from './commands/investigate/diagnosis';\nimport { registerCorrelateCommands } from './commands/investigate/correlation';\nimport { registerLlmCommands } from './commands/investigate/llm';\nimport { registerSemconvCommands } from './commands/investigate/semconv';\nimport { registerScoreCommands } from './commands/investigate/instrumentation';\nimport { registerCollectorCommands } from './commands/investigate/collector';\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 // Detection-driven flow\n .option('--no-detect', 'Skip auto-detection of installed deps')\n .option('--detect-only', 'Run detection, print the plan, write nothing')\n .option('--plan <path>', 'Apply a pre-built InitPlan JSON file')\n .option('--input <path>', 'Read InitPlan JSON from stdin (-) or a file')\n .option('--scan-env', 'Consent to reading .env / .env.local for backend detection')\n // Agent-native I/O\n .option('--json', 'Emit machine-readable JSON')\n .option('--output-file <path>', 'Persist JSON output to this file')\n .option('--no-secrets-in-output', 'Redact secret-shaped values')\n .option('--no-interactive', 'Never prompt; fail if input would be required')\n .action(async (opts) => {\n // Commander maps --no-X flags to opts.X = false (NOT opts.noX), so\n // read the negative flags via the positive name.\n const options: InitOptions = {\n cwd: opts.cwd ?? process.cwd(),\n dryRun: opts.dryRun ?? false,\n noInstall: opts.install === 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 noDetect: opts.detect === false,\n detectOnly: opts.detectOnly ?? false,\n plan: opts.plan,\n input: opts.input,\n scanEnv: opts.scanEnv ?? false,\n json: opts.json ?? false,\n outputFile: opts.outputFile,\n noSecrets: opts.secretsInOutput === false,\n noInteractive: opts.interactive === 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 // Agent-native discovery surface (always JSON).\n const schemaCmd = new Command('schema')\n .description('Print the CLI manifest as JSON (agent discovery)')\n .option('--output-file <path>', 'Persist JSON to a file')\n .option('--no-secrets-in-output', 'Redact secret-shaped values')\n .action((opts) => {\n runSchema({ outputFile: opts.outputFile, noSecrets: opts.secretsInOutput === false });\n });\n\n const schemaErrorsCmd = new Command('errors')\n .description('Print error envelope shape + AUTOTEL_E_* codes')\n .option('--output-file <path>', 'Persist JSON to a file')\n .action((opts) => {\n runSchemaErrors({ outputFile: opts.outputFile });\n });\n\n const schemaOutputsCmd = new Command('outputs')\n .description('Print JSON output shapes per command')\n .option('--output-file <path>', 'Persist JSON to a file')\n .action((opts) => {\n runSchemaOutputs({ outputFile: opts.outputFile });\n });\n\n schemaCmd.addCommand(schemaErrorsCmd);\n schemaCmd.addCommand(schemaOutputsCmd);\n program.addCommand(schemaCmd);\n\n const commandsCmd = new Command('commands')\n .description('Print compact tool-style listing of commands')\n .option('--output-file <path>', 'Persist JSON to a file')\n .action((opts) => {\n runCommandsListing({ outputFile: opts.outputFile });\n });\n program.addCommand(commandsCmd);\n\n const examplesCmd = new Command('examples')\n .description('Print copy-pasteable examples for a command')\n .argument('[command]', 'Command name (omit for all)')\n .option('--output-file <path>', 'Persist JSON to a file')\n .action((name: string | undefined, opts) => {\n runExamples(name, { outputFile: opts.outputFile });\n });\n program.addCommand(examplesCmd);\n\n const versionCmd = new Command('version')\n .description('Print version info as JSON')\n .option('--output-file <path>', 'Persist JSON to a file')\n .action((opts) => {\n runVersion({ outputFile: opts.outputFile });\n });\n program.addCommand(versionCmd);\n\n // Investigate commands — read telemetry via the same backends autotel-mcp\n // uses, but exposed as one-shot CLI subcommands returning JSON on stdout.\n // Each command group's commander wiring lives in its own file under\n // commands/investigate/ so this surface scales without ballooning cli.ts.\n registerHealthCommands(program);\n registerDiscoveryCommands(program);\n registerQueryCommands(program);\n registerTraceCommands(program);\n registerTopologyCommands(program);\n registerDiagnoseCommands(program);\n registerCorrelateCommands(program);\n registerLlmCommands(program);\n registerSemconvCommands(program);\n registerScoreCommands(program);\n registerCollectorCommands(program);\n\n return program;\n}\n\n/**\n * Run the CLI.\n *\n * Commander's built-in error path (missing required option, unknown command,\n * etc.) writes a plain string to stderr and calls `process.exit(1)` before\n * any action runs — bypassing the JSON envelope contract investigate commands\n * promise to agents. `exitOverride()` flips that to throwing `CommanderError`\n * which the top-level handler in `index.ts` converts to an envelope.\n */\nexport async function run(): Promise<void> {\n const program = createProgram();\n program.exitOverride();\n // Investigate / JSON-only commands need their failure path to be\n // single-document JSON. Commander defaults to writing an `error: ...`\n // line to stderr before raising, which doubles the output an agent sees.\n // Suppress it for JSON-only invocations; humans on other commands still\n // get the helpful stderr hint.\n const argvJoined = process.argv.slice(2).join(' ');\n const isJsonOnly =\n process.argv.includes('--json') ||\n /^(schema|commands|examples|version|health|capabilities|discover|query|trace|diagnose|topology|correlate|llm|semconv|score|collector)\\b/.test(\n argvJoined,\n );\n if (isJsonOnly) {\n program.configureOutput({ writeErr: () => {} });\n }\n // Apply exitOverride (+ stderr suppression) to every subcommand too;\n // commander doesn't propagate either automatically through `addCommand()`.\n const stack: Command[] = [...program.commands];\n while (stack.length > 0) {\n const cmd = stack.pop()!;\n cmd.exitOverride();\n if (isJsonOnly) {\n cmd.configureOutput({ writeErr: () => {} });\n }\n stack.push(...cmd.commands);\n }\n await program.parseAsync(process.argv);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport type { InitOptions, Preset, EnvVar } from '../types/index';\nimport { discoverProject } 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 setPinoLogger,\n addAutoInstrumentationLogger,\n} from '../lib/code-builder';\nimport { generateEnvExample } from '../lib/env-generator';\nimport { atomicWrite, fileExists, readFileSafe } from '../lib/fs';\nimport {\n detectInProject,\n envFilesRequireConsent,\n} from '../lib/dep-detector';\nimport { buildPlanFromDetection } from '../lib/plan-builder';\nimport { parsePlan, type InitPlan } from '../lib/plan';\nimport {\n parseInstrumentation,\n diffImportSources,\n diffAutoInstrumentations,\n} from '../lib/instrumentation-parser';\nimport { confirmOrEditPlan } from '../ui/preview';\nimport {\n AutotelError,\n AutotelErrorCodes,\n toAutotelError,\n} from '../lib/errors';\nimport {\n configureJsonOutput,\n printJson,\n} from '../lib/json-output';\nimport {\n getQuickPreset,\n getPreset,\n} from '../presets/index';\nimport {\n promptConfirm,\n promptExistingConfigAction,\n} from '../ui/prompts';\nimport * as output from '../ui/output';\nimport { isCI } from '../ui/spinner';\n\n/**\n * Run the init command.\n *\n * Order of operations:\n * 1. Source the plan:\n * --plan <path> → read+parse a pre-built plan\n * --input - → read plan from stdin\n * --preset <q> → translate quick preset to plan\n * else → run detection (unless --no-detect)\n * If no source is available, fail fast with E_INVALID_FLAG.\n * 2. If detection-driven and interactive: preview + confirm (or edit/abort).\n * --yes / --no-interactive / --json skip the prompt.\n * 3. --json or --dry-run: emit/print the plan, do not write.\n * 4. Apply: render instrumentation file (merge if existing CLI-owned),\n * write .env.example, run installs (per-package PM-native).\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n // Configure agent-native I/O up front so errors bubble through correctly.\n if (options.json) {\n configureJsonOutput({\n outputFile: options.outputFile,\n noSecrets: options.noSecrets,\n });\n }\n\n if (options.verbose) process.env['AUTOTEL_VERBOSE'] = 'true';\n if (options.quiet) process.env['AUTOTEL_QUIET'] = 'true';\n\n const project = discoverProject(options.cwd);\n if (project === null) {\n throw new AutotelError({\n type: 'environment',\n code: AutotelErrorCodes.E_NO_PACKAGE_JSON,\n message: `No package.json found at or above ${options.cwd}`,\n fix: 'cd into a directory with a package.json, or pass --cwd <path>',\n expected: { file: 'package.json' },\n });\n }\n\n // Configure output root for any --output-file writes.\n if (options.json && options.outputFile !== undefined) {\n configureJsonOutput({\n outputFile: options.outputFile,\n outputRoot: project.packageRoot,\n noSecrets: options.noSecrets,\n });\n }\n\n // === Plan sourcing =====================================================\n\n let plan: InitPlan | null = null;\n\n if (options.plan !== undefined) {\n plan = readPlanFromFile(options.plan);\n } else if (options.input !== undefined) {\n plan = await readPlanFromInput(options.input);\n } else if (options.preset !== undefined) {\n plan = planFromQuickPreset(options.preset, project);\n } else if (!options.noDetect) {\n plan = await planFromDetection(project, options);\n }\n\n // If no plan source was available (e.g. --no-detect with no --plan/--input/\n // --preset), fail fast. init is detection/plan-driven.\n if (plan === null) {\n throw new AutotelError({\n type: 'validation',\n code: AutotelErrorCodes.E_INVALID_FLAG,\n message:\n 'No plan source available (--no-detect disables detection)',\n fix: 'Drop --no-detect or pass --plan / --input / --preset',\n });\n }\n\n // === Preview / confirmation ===========================================\n\n const interactive =\n !options.yes && !options.noInteractive && !options.json && !isCI();\n\n if (\n interactive &&\n options.plan === undefined &&\n options.input === undefined &&\n options.preset === undefined\n ) {\n // Only show preview for the auto-detected flow. Explicit-input flows\n // skip preview because the user already supplied the plan.\n const confirmed = await confirmOrEditPlan(plan);\n if (confirmed === null) {\n output.info('Aborted');\n return;\n }\n plan = confirmed;\n }\n\n // === Detect-only / JSON / dry-run early exits =========================\n\n if (options.detectOnly) {\n if (options.json) {\n printJson({ ok: true, command: 'autotel init', plan });\n } else {\n output.info('Detection-only mode — no files written');\n console.log(JSON.stringify(plan, null, 2));\n }\n return;\n }\n\n if (options.json && options.dryRun) {\n printJson({ ok: true, command: 'autotel init', plan, dryRun: true });\n return;\n }\n\n if (options.json && !options.dryRun) {\n // Apply, then emit a result envelope.\n const applied = applyPlan({ plan, project, options });\n printJson({ ok: true, command: 'autotel init', plan, applied });\n return;\n }\n\n // === Apply (human-output path) ========================================\n\n if (options.dryRun) {\n output.heading('\\nDry run — no files will be written\\n');\n console.log(JSON.stringify(plan, null, 2));\n return;\n }\n\n const applied = applyPlan({ plan, project, options });\n printApplySummary({ plan, applied, project, options });\n}\n\n// ----------------------------------------------------------------------------\n// Plan sourcing helpers\n// ----------------------------------------------------------------------------\n\nfunction readPlanFromFile(filePath: string): InitPlan {\n const content = readFileSafe(filePath);\n if (content === null) {\n throw new AutotelError({\n type: 'io',\n code: AutotelErrorCodes.E_READ_FAILED,\n message: `Could not read plan file: ${filePath}`,\n });\n }\n try {\n return parsePlan(JSON.parse(content));\n } catch (error) {\n if (error instanceof AutotelError) throw error;\n throw new AutotelError({\n type: 'validation',\n code: AutotelErrorCodes.E_INVALID_PLAN,\n message: `Plan file is not valid JSON: ${(error as Error).message}`,\n });\n }\n}\n\nasync function readPlanFromInput(input: string): Promise<InitPlan> {\n if (input === '-') {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const content = Buffer.concat(chunks).toString('utf8');\n try {\n return parsePlan(JSON.parse(content));\n } catch (error) {\n if (error instanceof AutotelError) throw error;\n throw new AutotelError({\n type: 'validation',\n code: AutotelErrorCodes.E_INVALID_INPUT,\n message: `stdin did not contain valid JSON: ${(error as Error).message}`,\n });\n }\n }\n return readPlanFromFile(input);\n}\n\nfunction planFromQuickPreset(\n slug: string,\n project: ReturnType<typeof discoverProject>\n): InitPlan {\n if (project === null) {\n throw new AutotelError({\n type: 'environment',\n code: AutotelErrorCodes.E_NO_PACKAGE_JSON,\n message: 'project required',\n });\n }\n const quick = getQuickPreset(slug);\n if (quick === undefined) {\n throw new AutotelError({\n type: 'validation',\n code: AutotelErrorCodes.E_UNKNOWN_PRESET,\n message: `Unknown preset: ${slug}`,\n fix: 'Run `autotel commands --json` to see available presets',\n });\n }\n // Synthesise a DetectionResult-equivalent and reuse the plan builder.\n const presets: string[] = [ quick.backend];\n if (quick.subscribers) presets.push(...quick.subscribers);\n if (quick.plugins) presets.push(...quick.plugins);\n\n const { plan } = buildPlanFromDetection({\n project,\n detection: {\n packages: [],\n presets: presets as ReturnType<\n typeof detectInProject\n >['presets'],\n primaryLogger: quick.logging === 'pino' ? 'pino' : null,\n autoInstrumentLoggers: [],\n autoInstrumentedDeps: [],\n backend: { slug: quick.backend as never, source: 'default' },\n platform: null,\n },\n });\n return plan;\n}\n\nasync function planFromDetection(\n project: ReturnType<typeof discoverProject>,\n options: InitOptions\n): Promise<InitPlan> {\n if (project === null) {\n throw new AutotelError({\n type: 'environment',\n code: AutotelErrorCodes.E_NO_PACKAGE_JSON,\n message: 'project required',\n });\n }\n\n let envConsent = options.scanEnv;\n if (\n !envConsent &&\n envFilesRequireConsent(project.packageRoot) &&\n !options.yes &&\n !options.noInteractive &&\n !options.json &&\n !isCI()\n ) {\n envConsent = await promptConfirm(\n `Found a .env file. Read its keys to help detect the backend? (values are never read)`,\n false\n );\n }\n\n const detection = detectInProject({ project, envConsent });\n const { plan } = buildPlanFromDetection({ project, detection });\n return plan;\n}\n\n// ----------------------------------------------------------------------------\n// Apply\n// ----------------------------------------------------------------------------\n\ninterface ApplyResult {\n wroteFiles: string[];\n ranInstalls: string[];\n printedInstalls: string[];\n installErrors: string[];\n}\n\nfunction applyPlan(args: {\n plan: InitPlan;\n project: NonNullable<ReturnType<typeof discoverProject>>;\n options: InitOptions;\n}): ApplyResult {\n const { plan, project, options } = args;\n const result: ApplyResult = {\n wroteFiles: [],\n ranInstalls: [],\n printedInstalls: [],\n installErrors: [],\n };\n\n // Resolve presets\n const presets: Preset[] = [];\n for (const slug of plan.presets) {\n const p = resolvePreset(slug);\n if (p !== null) presets.push(p);\n }\n\n // Build the instrumentation file\n const codeFile = createCodeFile();\n addImport(codeFile, { source: 'autotel/register', sideEffect: true });\n addImport(codeFile, { source: 'autotel', specifiers: ['init'] });\n\n // Logger\n if (plan.detected?.primaryLogger === 'pino') {\n setPinoLogger(codeFile);\n }\n for (const l of plan.detected?.autoInstrumentLoggers ?? []) {\n addAutoInstrumentationLogger(codeFile, l);\n }\n\n for (const preset of presets) {\n for (const imp of preset.imports) {\n const section =\n preset.type === 'backend' || preset.type === 'platform'\n ? 'backend'\n : preset.type === 'plugin'\n ? 'plugin'\n : preset.type === 'subscriber'\n ? 'subscriber'\n : undefined;\n addImport(codeFile, imp, section);\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 (codeFile.backendConfig === null) {\n setBackendConfig(codeFile, '// Local/console mode - no backend configured');\n }\n\n const newContent = renderCodeFile(codeFile);\n\n // Path resolution\n const instrumentationPath = resolveInstrumentationPath(project);\n const envExamplePath = path.join(project.packageRoot, '.env.example');\n\n // Merge with existing CLI-owned file if present\n const existing = readFileSafe(instrumentationPath);\n if (existing !== null) {\n const parsed = parseInstrumentation(existing);\n if (!parsed.cliOwned && !options.force) {\n throw new AutotelError({\n type: 'conflict',\n code: AutotelErrorCodes.E_EXISTING_CONFIG,\n message: `Hand-edited instrumentation file at ${instrumentationPath} (no CLI markers found)`,\n fix: 'Pass --force to overwrite (creates a .bak backup) or remove the file',\n expected: { path: instrumentationPath },\n });\n }\n // For CLI-owned files we still atomic-overwrite. Surgical merging is\n // best-effort: we use the diff helpers to compute what was actually new\n // for logging purposes, but we re-render the whole file. This keeps\n // the output canonical and matches the existing --force backup contract.\n const addedImports = diffImportSources(\n parsed,\n [\n ...codeFile.imports,\n ...codeFile.backendImports,\n ...codeFile.pluginImports,\n ...codeFile.subscriberImports,\n ...codeFile.loggerImports,\n ].map((i) => i.source)\n );\n const addedAuto = diffAutoInstrumentations(\n parsed,\n codeFile.autoInstrumentations\n );\n const contentChanged = existing !== newContent;\n if (\n addedImports.length === 0 &&\n addedAuto.length === 0 &&\n parsed.cliOwned &&\n !contentChanged\n ) {\n // Nothing new — skip the write entirely.\n result.wroteFiles.push(\n `${path.relative(project.cwd, instrumentationPath)} (no changes)`\n );\n } else {\n atomicWrite(instrumentationPath, newContent, {\n root: project.packageRoot,\n backup: true,\n });\n result.wroteFiles.push(path.relative(project.cwd, instrumentationPath));\n }\n } else {\n atomicWrite(instrumentationPath, newContent, {\n root: project.packageRoot,\n });\n result.wroteFiles.push(path.relative(project.cwd, instrumentationPath));\n }\n\n // .env.example\n const envVars: EnvVar[] = [];\n for (const p of presets) {\n envVars.push(...p.env.required, ...p.env.optional);\n }\n const envExampleContent = generateEnvExample(envVars);\n if (envExampleContent.length > 0 && !fileExists(envExamplePath)) {\n atomicWrite(envExamplePath, envExampleContent, {\n root: project.packageRoot,\n });\n result.wroteFiles.push(path.relative(project.cwd, envExamplePath));\n }\n\n // Installs\n const prod = plan.packagesToInstall.prod;\n const dev = plan.packagesToInstall.dev;\n\n if (prod.length > 0 || dev.length > 0) {\n if (options.noInstall || options.printInstallCmd) {\n if (prod.length > 0) {\n result.printedInstalls.push(\n getInstallCommand(project.packageManager, prod)\n );\n }\n if (dev.length > 0) {\n result.printedInstalls.push(\n getInstallCommand(project.packageManager, dev, { dev: true })\n );\n }\n } else {\n if (prod.length > 0) {\n const cmd = getInstallCommand(project.packageManager, prod);\n try {\n execSync(cmd, { cwd: project.packageRoot, stdio: 'pipe' });\n result.ranInstalls.push(cmd);\n } catch {\n result.installErrors.push(cmd);\n }\n }\n if (dev.length > 0) {\n const cmd = getInstallCommand(project.packageManager, dev, {\n dev: true,\n });\n try {\n execSync(cmd, { cwd: project.packageRoot, stdio: 'pipe' });\n result.ranInstalls.push(cmd);\n } catch {\n result.installErrors.push(cmd);\n }\n }\n }\n }\n\n return result;\n}\n\nfunction resolveInstrumentationPath(\n project: NonNullable<ReturnType<typeof discoverProject>>\n): string {\n // Re-use existing logic from project.ts. Local import-free version:\n const srcDir = path.join(project.packageRoot, 'src');\n const hasSrcDir =\n fs.existsSync(srcDir) ||\n fileExists(path.join(project.packageRoot, 'src', 'index.ts')) ||\n fileExists(path.join(project.packageRoot, 'src', 'index.js'));\n const dir = hasSrcDir ? srcDir : project.packageRoot;\n const ext = project.hasTypeScript ? 'mts' : 'mjs';\n return path.join(dir, `instrumentation.${ext}`);\n}\n\nfunction resolvePreset(slug: string): Preset | null {\n for (const type of ['backend', 'subscriber', 'plugin', 'platform'] as const) {\n const p = getPreset(type, slug);\n if (p !== undefined) return p;\n }\n return null;\n}\n\nfunction printApplySummary(args: {\n plan: InitPlan;\n applied: ApplyResult;\n project: NonNullable<ReturnType<typeof discoverProject>>;\n options: InitOptions;\n}): void {\n const { applied, plan, project } = args;\n if (applied.wroteFiles.length > 0) {\n output.success(`Wrote: ${applied.wroteFiles.join(', ')}`);\n }\n for (const cmd of applied.ranInstalls) {\n output.info(`Installed: ${cmd}`);\n }\n for (const cmd of applied.printedInstalls) {\n output.dim(`Run: ${cmd}`);\n }\n for (const cmd of applied.installErrors) {\n output.error(`Install failed — run manually: ${cmd}`);\n }\n if (plan.nextSteps.length > 0) {\n console.log('\\nNext steps:');\n for (const step of plan.nextSteps) {\n console.log(` - ${step}`);\n }\n }\n const pmInfo = project.workspace.isMonorepo\n ? `${project.packageManager} workspace, package root ${project.packageRoot}`\n : project.packageManager;\n console.log(`\\n${output.formatPackageManagerInfo\n ? output.formatPackageManagerInfo(project.packageManager, project.lockfilePath)\n : pmInfo}`);\n}\n\n// Re-export for tests / external callers (existing public surface).\nexport { detectConfig, toAutotelError, promptExistingConfigAction };\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 loggerImports: Import[];\n /** Code to construct logger before init() (e.g. `const logger = pino({...});`). */\n loggerSetup: string | null;\n /** Identifier passed as `logger:` to init() (e.g. `logger`). null = omit. */\n loggerExpr: string | null;\n /** Strings to put into the autoInstrumentations array (e.g. 'winston'). */\n autoInstrumentations: string[];\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 loggerImports: [],\n loggerSetup: null,\n loggerExpr: null,\n autoInstrumentations: [],\n backendConfig: null,\n subscribersConfig: [],\n pluginInit: [],\n };\n}\n\n/**\n * Wire Pino as the first-class autotel logger. Adds the import, the\n * `const logger = pino({...})` construction snippet, and sets the\n * `logger:` field on init().\n */\nexport function setPinoLogger(file: CodeFile): void {\n file.loggerImports.push({ source: 'pino', default: 'pino' });\n file.loggerSetup = `const logger = pino({ name: 'app', level: process.env.LOG_LEVEL ?? 'info' });`;\n file.loggerExpr = 'logger';\n}\n\n/**\n * Add a logger to the autoInstrumentations array. For Winston/Bunyan this\n * enables OpenTelemetry contrib's trace-context injection.\n */\nexport function addAutoInstrumentationLogger(\n file: CodeFile,\n name: string\n): void {\n if (!file.autoInstrumentations.includes(name)) {\n file.autoInstrumentations.push(name);\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 // Logger imports + setup\n if (file.loggerImports.length > 0) {\n lines.push(SECTION_MARKER('LOGGER'));\n lines.push(renderImports(file.loggerImports));\n lines.push('');\n }\n if (file.loggerSetup !== null) {\n lines.push(file.loggerSetup);\n lines.push('');\n }\n\n // Init call\n lines.push('init({');\n\n // Logger reference (first-class)\n if (file.loggerExpr !== null) {\n lines.push(` logger: ${file.loggerExpr},`);\n }\n\n // Auto-instrumentations (Winston/Bunyan trace-context injection)\n if (file.autoInstrumentations.length > 0) {\n const list = file.autoInstrumentations.map((n) => `'${n}'`).join(', ');\n lines.push(` autoInstrumentations: [${list}],`);\n }\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 * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PackageJson, ProjectContext } from '../types/index';\nimport { readJsonSafe, fileExists, readFileSafe } from './fs';\n\n/**\n * Detection layer for `autotel init`.\n *\n * Inputs (in order of consultation):\n * 1. Target package.json (deps + devDeps)\n * 2. Workspace root package.json (hoisted deps in npm/yarn workspaces)\n * 3. .env.example (always safe — committed file)\n * 4. .env / .env.local — ONLY when `envConsent: true` (gated by --scan-env\n * or interactive prompt). Caller is responsible for obtaining consent.\n * 5. wrangler.toml / wrangler.jsonc — platform marker\n *\n * Output is a `DetectionResult` describing detected packages, preferred\n * logger, backend-with-source, and platform. The init command then builds\n * an `InitPlan` from this + the preset registry.\n */\n\nexport type LoggerKind = 'pino' | 'winston' | 'bunyan';\n\nexport type PresetSlug =\n // backends\n | 'datadog'\n | 'datadog-agent'\n | 'google-cloud'\n | 'honeycomb'\n | 'otlp-http'\n | 'otlp-grpc'\n | 'local'\n // subscribers\n | 'posthog'\n | 'mixpanel'\n | 'amplitude'\n | 'segment'\n | 'slack'\n | 'webhook'\n // plugins\n | 'mongoose'\n | 'drizzle'\n | 'sentry'\n | 'hono'\n | 'mcp'\n | 'tanstack'\n // platforms\n | 'aws-lambda'\n | 'cloudflare'\n | 'edge';\n\nexport interface DetectedPackage {\n /** npm package name */\n name: string;\n /** Version range from package.json (e.g. \"^4.0.0\") */\n version: string;\n /** Where it was found */\n resolution: 'target' | 'workspace-root';\n}\n\nexport interface DetectedBackend {\n slug: PresetSlug;\n /** What told us. `default` = nothing detected, fell back. */\n source: 'env' | 'wrangler' | 'deps' | 'default';\n /** Optional human-readable detail (e.g. which env var). */\n detail?: string;\n}\n\nexport interface DetectionResult {\n packages: DetectedPackage[];\n /** First-party autotel presets to wire. */\n presets: PresetSlug[];\n /** First-class logger (gets `init({ logger })`). Null if none. */\n primaryLogger: LoggerKind | null;\n /** Loggers that should appear in `autoInstrumentations`. */\n autoInstrumentLoggers: LoggerKind[];\n /** Auto-instrumentation deps covered by @opentelemetry/auto-instrumentations-node. */\n autoInstrumentedDeps: string[];\n backend: DetectedBackend;\n /** Platform preset to apply (cloudflare, aws-lambda, edge). */\n platform: PresetSlug | null;\n}\n\n/**\n * Mapping table: dep name -> preset slug (first-party autotel wrapper) or\n * null (covered by @opentelemetry/auto-instrumentations-node only).\n *\n * Loggers handled separately (see `detectLoggers`).\n */\nconst DEP_TO_PRESET: Record<string, PresetSlug | 'auto-instr'> = {\n // First-party autotel wrappers\n '@sentry/node': 'sentry',\n '@sentry/bun': 'sentry',\n hono: 'hono',\n '@modelcontextprotocol/sdk': 'mcp',\n '@tanstack/start': 'tanstack',\n '@tanstack/start-server': 'tanstack',\n '@tanstack/start-client': 'tanstack',\n\n // Subscribers\n 'posthog-node': 'posthog',\n '@posthog/node': 'posthog',\n mixpanel: 'mixpanel',\n '@amplitude/analytics-node': 'amplitude',\n '@segment/analytics-node': 'segment',\n '@slack/web-api': 'slack',\n '@slack/webhook': 'slack',\n\n // Plugins (existing presets)\n mongoose: 'mongoose',\n 'drizzle-orm': 'drizzle',\n\n // Auto-instrumented (no first-party preset needed)\n express: 'auto-instr',\n fastify: 'auto-instr',\n '@nestjs/core': 'auto-instr',\n next: 'auto-instr',\n pg: 'auto-instr',\n mysql: 'auto-instr',\n mysql2: 'auto-instr',\n redis: 'auto-instr',\n ioredis: 'auto-instr',\n '@aws-sdk/client-s3': 'auto-instr',\n graphql: 'auto-instr',\n};\n\nconst LOGGER_DEPS: Record<string, LoggerKind> = {\n pino: 'pino',\n winston: 'winston',\n bunyan: 'bunyan',\n};\n\n/** Backends inferable from env-var keys (values not used — only key presence). */\nconst ENV_KEY_TO_BACKEND: { key: string; slug: PresetSlug }[] = [\n { key: 'DD_API_KEY', slug: 'datadog' },\n { key: 'DATADOG_API_KEY', slug: 'datadog' },\n { key: 'HONEYCOMB_API_KEY', slug: 'honeycomb' },\n { key: 'HONEYCOMB_WRITE_KEY', slug: 'honeycomb' },\n { key: 'GOOGLE_CLOUD_PROJECT', slug: 'google-cloud' },\n // OTEL endpoint is generic enough that we pick otlp-http\n { key: 'OTEL_EXPORTER_OTLP_ENDPOINT', slug: 'otlp-http' },\n];\n\n/** Merge two dep maps; target package wins on overlapping names. */\nfunction mergeDeps(\n target: PackageJson,\n root: PackageJson | null\n): Map<string, { version: string; resolution: 'target' | 'workspace-root' }> {\n const out = new Map<\n string,\n { version: string; resolution: 'target' | 'workspace-root' }\n >();\n\n if (root) {\n for (const [name, version] of Object.entries({\n ...root.dependencies,\n ...root.devDependencies,\n })) {\n out.set(name, { version, resolution: 'workspace-root' });\n }\n }\n\n for (const [name, version] of Object.entries({\n ...target.dependencies,\n ...target.devDependencies,\n })) {\n out.set(name, { version, resolution: 'target' });\n }\n\n return out;\n}\n\n/**\n * Detect loggers, resolving conflict per the design: Pino wins as first-class\n * (`init({ logger })`); Winston/Bunyan become auto-instrumentations.\n */\nexport function detectLoggers(deps: Map<string, unknown>): {\n primary: LoggerKind | null;\n autoInstrument: LoggerKind[];\n} {\n const present: LoggerKind[] = [];\n for (const [name, kind] of Object.entries(LOGGER_DEPS)) {\n if (deps.has(name)) present.push(kind);\n }\n if (present.length === 0) return { primary: null, autoInstrument: [] };\n\n if (present.includes('pino')) {\n return {\n primary: 'pino',\n autoInstrument: present.filter((l) => l !== 'pino'),\n };\n }\n // No pino — pick the first non-pino logger as primary for code-gen; the\n // others still go through auto-instr.\n return {\n primary: present[0] ?? null,\n autoInstrument: present.slice(1),\n };\n}\n\n/**\n * Read env-var keys from .env-style files (KEY=value lines). Values are\n * not returned — only the set of keys present. Comment lines (#) skipped.\n */\nfunction parseEnvKeys(content: string): Set<string> {\n const out = new Set<string>();\n for (const rawLine of content.split('\\n')) {\n const line = rawLine.trim();\n if (line.length === 0 || line.startsWith('#')) continue;\n const eq = line.indexOf('=');\n if (eq === -1) continue;\n const key = line.slice(0, eq).trim();\n if (key.length > 0) out.add(key);\n }\n return out;\n}\n\n/**\n * Collect env keys from .env.example (always) and .env/.env.local (only if\n * `envConsent` is true). Used for backend detection.\n */\nexport function collectEnvKeys(opts: {\n packageRoot: string;\n envConsent: boolean;\n}): { keys: Set<string>; sources: string[] } {\n const keys = new Set<string>();\n const sources: string[] = [];\n\n const tryRead = (name: string, requiresConsent: boolean): void => {\n if (requiresConsent && !opts.envConsent) return;\n const p = path.join(opts.packageRoot, name);\n const content = readFileSafe(p);\n if (content === null) return;\n sources.push(name);\n for (const k of parseEnvKeys(content)) keys.add(k);\n };\n\n tryRead('.env.example', false);\n tryRead('.env.sample', false);\n tryRead('.env', true);\n tryRead('.env.local', true);\n\n return { keys, sources };\n}\n\n/**\n * Detect backend in priority order: env > wrangler > deps > default(local).\n */\nexport function detectBackend(opts: {\n envKeys: Set<string>;\n packageRoot: string;\n deps: Map<string, unknown>;\n}): DetectedBackend {\n for (const { key, slug } of ENV_KEY_TO_BACKEND) {\n if (opts.envKeys.has(key)) {\n return { slug, source: 'env', detail: key };\n }\n }\n\n // wrangler.toml or wrangler.jsonc → cloudflare platform implies OTLP-style\n // export; we still want a *backend* though, so cloudflare detection only\n // sets the platform (see detectPlatform). Backend stays at default unless\n // env says otherwise.\n\n // Deps: dd-trace as a backend hint (rare, but explicit)\n if (opts.deps.has('dd-trace')) {\n return { slug: 'datadog', source: 'deps', detail: 'dd-trace' };\n }\n\n return { slug: 'local', source: 'default' };\n}\n\nexport function detectPlatform(packageRoot: string): PresetSlug | null {\n if (\n fileExists(path.join(packageRoot, 'wrangler.toml')) ||\n fileExists(path.join(packageRoot, 'wrangler.jsonc')) ||\n fileExists(path.join(packageRoot, 'wrangler.json'))\n ) {\n return 'cloudflare';\n }\n // AWS Lambda + Edge are harder to detect from filesystem alone; skip for\n // v1 and rely on user override.\n return null;\n}\n\n/**\n * Top-level: build a DetectionResult for the given project context.\n */\nexport function detectInProject(opts: {\n project: ProjectContext;\n envConsent: boolean;\n}): DetectionResult {\n const { project } = opts;\n\n // Read workspace-root package.json if different from target package\n let rootPkg: PackageJson | null = null;\n if (\n project.workspace.workspaceRoot !== null &&\n project.workspace.workspaceRoot !== project.packageRoot\n ) {\n rootPkg = readJsonSafe<PackageJson>(\n path.join(project.workspace.workspaceRoot, 'package.json')\n );\n }\n\n const deps = mergeDeps(project.packageJson, rootPkg);\n\n const detectedPackages: DetectedPackage[] = [];\n const presetSet = new Set<PresetSlug>();\n const autoInstrDeps: string[] = [];\n\n for (const [name, info] of deps.entries()) {\n const mapping = DEP_TO_PRESET[name];\n if (mapping === undefined && LOGGER_DEPS[name] === undefined) continue;\n\n detectedPackages.push({\n name,\n version: info.version,\n resolution: info.resolution,\n });\n\n if (mapping === 'auto-instr') {\n autoInstrDeps.push(name);\n } else if (mapping !== undefined) {\n presetSet.add(mapping);\n }\n }\n\n const loggers = detectLoggers(deps);\n\n // Detection of platform from filesystem markers\n const platform = detectPlatform(project.packageRoot);\n if (platform !== null) presetSet.add(platform);\n\n // Backend\n const { keys: envKeys } = collectEnvKeys({\n packageRoot: project.packageRoot,\n envConsent: opts.envConsent,\n });\n const backend = detectBackend({\n envKeys,\n packageRoot: project.packageRoot,\n deps,\n });\n\n return {\n packages: detectedPackages,\n presets: [...presetSet],\n primaryLogger: loggers.primary,\n autoInstrumentLoggers: loggers.autoInstrument,\n autoInstrumentedDeps: autoInstrDeps,\n backend,\n platform,\n };\n}\n\n/**\n * True if a .env or .env.local file exists at packageRoot (consent is needed\n * to read it). .env.example is committed and doesn't trigger this.\n */\nexport function envFilesRequireConsent(packageRoot: string): boolean {\n return (\n fileExists(path.join(packageRoot, '.env')) ||\n fileExists(path.join(packageRoot, '.env.local'))\n );\n}\n\n/**\n * Enumerate workspaces under a pnpm/yarn/npm workspace root. Returns the\n * absolute path of each package containing a package.json.\n */\nexport function enumerateWorkspacePackages(workspaceRoot: string): string[] {\n const results: string[] = [];\n\n // pnpm-workspace.yaml\n const pnpmFile = path.join(workspaceRoot, 'pnpm-workspace.yaml');\n if (fileExists(pnpmFile)) {\n const content = readFileSafe(pnpmFile) ?? '';\n const patterns = parsePnpmWorkspacePatterns(content);\n for (const pattern of patterns) {\n expandPattern(workspaceRoot, pattern, results);\n }\n }\n\n // package.json workspaces (npm/yarn)\n const rootPkg = readJsonSafe<PackageJson>(\n path.join(workspaceRoot, 'package.json')\n );\n if (rootPkg?.workspaces) {\n const patterns = Array.isArray(rootPkg.workspaces)\n ? rootPkg.workspaces\n : rootPkg.workspaces.packages;\n for (const pattern of patterns) {\n expandPattern(workspaceRoot, pattern, results);\n }\n }\n\n // Dedupe (in case both pnpm-workspace.yaml and package.json declare the same)\n return [...new Set(results)];\n}\n\nfunction parsePnpmWorkspacePatterns(yaml: string): string[] {\n const out: string[] = [];\n let inPackages = false;\n for (const rawLine of yaml.split('\\n')) {\n const line = rawLine.replace(/#.*$/, '').trimEnd();\n if (line.trim().length === 0) continue;\n if (/^packages\\s*:/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const m = /^\\s*-\\s*['\"]?([^'\"]+?)['\"]?\\s*$/.exec(line);\n if (m && m[1] !== undefined) out.push(m[1]);\n else if (!/^\\s/.test(line)) break;\n }\n }\n return out;\n}\n\nfunction expandPattern(\n root: string,\n pattern: string,\n results: string[]\n): void {\n // Support simple \"apps/*\" and exact-path patterns. Skip negations.\n if (pattern.startsWith('!')) return;\n\n if (pattern.endsWith('/*')) {\n const parent = path.join(root, pattern.slice(0, -2));\n if (!fs.existsSync(parent)) return;\n for (const entry of fs.readdirSync(parent)) {\n const full = path.join(parent, entry);\n const pkgJson = path.join(full, 'package.json');\n if (fileExists(pkgJson)) results.push(full);\n }\n return;\n }\n\n if (pattern.endsWith('/**')) {\n const parent = path.join(root, pattern.slice(0, -3));\n walkForPackageJson(parent, results, 3);\n return;\n }\n\n // Exact path\n const full = path.join(root, pattern);\n if (fileExists(path.join(full, 'package.json'))) results.push(full);\n}\n\nfunction walkForPackageJson(\n dir: string,\n out: string[],\n maxDepth: number\n): void {\n if (maxDepth < 0 || !fs.existsSync(dir)) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n if (!e.isDirectory() || e.name === 'node_modules') continue;\n const full = path.join(dir, e.name);\n if (fileExists(path.join(full, 'package.json'))) {\n out.push(full);\n } else {\n walkForPackageJson(full, out, maxDepth - 1);\n }\n }\n}\n","/**\n * Build an `InitPlan` from a `DetectionResult`.\n *\n * Pure function: takes detection + project context + preset registry, emits\n * the list of presets to wire, packages to install, env vars to surface,\n * and a draft instrumentation file path. Side-effect-free so it can be\n * called from both the interactive flow and the --json/--dry-run flow.\n */\n\nimport * as path from 'node:path';\nimport type {\n DetectionResult,\n PresetSlug,\n} from './dep-detector';\nimport type { InitPlan, InitPlanEnvVar } from './plan';\nimport type { Preset, ProjectContext } from '../types/index';\nimport { getPreset } from '../presets/index';\nimport { fileExists } from './fs';\nimport { getInstrumentationPath } from './project';\n\nexport interface PlanFromDetectionResult {\n plan: InitPlan;\n /** Resolved preset objects in the same order as plan.presets. */\n presets: Preset[];\n /** Path the instrumentation file would be written to. */\n instrumentationPath: string;\n}\n\nexport function buildPlanFromDetection(opts: {\n project: ProjectContext;\n detection: DetectionResult;\n}): PlanFromDetectionResult {\n const { project, detection } = opts;\n\n // Resolve preset slugs to preset objects. Backends + plugins + subscribers\n // + platforms all share the same Preset shape. We try each type until we\n // find it.\n const presets: Preset[] = [];\n const presetSlugs: PresetSlug[] = [];\n\n // Always wire the detected backend (even if 'local').\n const backendPreset = findPreset(detection.backend.slug);\n if (backendPreset !== null) {\n presets.push(backendPreset);\n presetSlugs.push(detection.backend.slug);\n }\n\n // Other presets (subscribers, plugins, platform)\n for (const slug of detection.presets) {\n if (slug === detection.backend.slug) continue; // already added\n const p = findPreset(slug);\n if (p !== null) {\n presets.push(p);\n presetSlugs.push(slug);\n }\n }\n\n // Build package install set\n const prod = new Set<string>(['autotel']);\n const dev = new Set<string>();\n for (const p of presets) {\n for (const pkg of p.packages.required) prod.add(pkg);\n for (const pkg of p.packages.optional) prod.add(pkg);\n for (const pkg of p.packages.devOnly) dev.add(pkg);\n }\n\n // Pino is wired as init({ logger }), so we also need `pino` itself\n // available. Detection already saw it in deps, but be explicit so a\n // hand-crafted plan still works.\n if (detection.primaryLogger === 'pino') prod.add('pino');\n\n // Auto-instrumentations-node covers the auto-instrumented deps + the\n // Winston/Bunyan trace-context injection.\n if (\n detection.autoInstrumentedDeps.length > 0 ||\n detection.autoInstrumentLoggers.length > 0 ||\n detection.primaryLogger === 'winston' ||\n detection.primaryLogger === 'bunyan'\n ) {\n prod.add('@opentelemetry/auto-instrumentations-node');\n }\n\n // Env vars\n const envVars: InitPlanEnvVar[] = [];\n const seenEnv = new Set<string>();\n for (const p of presets) {\n for (const ev of [...p.env.required, ...p.env.optional]) {\n if (seenEnv.has(ev.name)) continue;\n seenEnv.add(ev.name);\n envVars.push({\n name: ev.name,\n sensitive: ev.sensitive,\n action: 'add-to-.env.example',\n });\n }\n }\n\n // Files we'll write\n const instrumentationPath = getInstrumentationPath(\n project.packageRoot,\n project.hasTypeScript\n );\n const filesToWrite: InitPlan['filesToWrite'] = [\n {\n path: path.relative(project.cwd, instrumentationPath),\n action: fileExists(instrumentationPath) ? 'merge' : 'create',\n },\n ];\n const envExamplePath = path.join(project.packageRoot, '.env.example');\n if (envVars.length > 0 && !fileExists(envExamplePath)) {\n filesToWrite.push({\n path: path.relative(project.cwd, envExamplePath),\n action: 'create',\n });\n }\n\n // Aggregated next-steps\n const nextSteps = presets.flatMap((p) => p.nextSteps);\n\n const plan: InitPlan = {\n v: 1,\n presets: presetSlugs,\n packagesToInstall: { prod: [...prod], dev: [...dev] },\n filesToWrite,\n envVars,\n nextSteps,\n detected: {\n packages: detection.packages,\n primaryLogger: detection.primaryLogger,\n autoInstrumentLoggers: detection.autoInstrumentLoggers,\n autoInstrumentedDeps: detection.autoInstrumentedDeps,\n backend: detection.backend,\n platform: detection.platform,\n },\n };\n\n return { plan, presets, instrumentationPath };\n}\n\nfunction findPreset(slug: PresetSlug | string): Preset | null {\n for (const type of ['backend', 'subscriber', 'plugin', 'platform'] as const) {\n const p = getPreset(type, slug);\n if (p !== undefined) return p;\n }\n return null;\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 * Google Cloud (Telemetry API) preset - send traces to Cloud Trace via OTLP\n */\nexport const googleCloud: BackendPreset = {\n name: 'Google Cloud',\n slug: 'google-cloud',\n type: 'backend',\n description:\n 'Send traces to Google Cloud Observability (Cloud Trace) via the Telemetry API with Application Default Credentials',\n protocol: 'http',\n exporter: 'otlp-http',\n packages: {\n required: [\n 'autotel-backends',\n '@opentelemetry/exporter-trace-otlp-http',\n 'google-auth-library',\n ],\n optional: [\n '@opentelemetry/exporter-metrics-otlp-http',\n '@opentelemetry/sdk-metrics',\n ],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'GOOGLE_CLOUD_PROJECT',\n description: 'Google Cloud project ID',\n example: 'my-project-id',\n sensitive: false,\n },\n ],\n optional: [\n {\n name: 'GOOGLE_APPLICATION_CREDENTIALS',\n description: 'Path to service account key JSON (for ADC)',\n example: '/path/to/key.json',\n sensitive: false,\n },\n {\n name: 'NODE_ENV',\n description: 'Environment (e.g., production, staging)',\n example: 'production',\n sensitive: false,\n },\n ],\n },\n imports: [\n {\n source: 'autotel-backends/google-cloud',\n specifiers: ['createGoogleCloudConfig'],\n },\n ],\n configBlock: {\n type: 'backend',\n code: `...createGoogleCloudConfig({\n projectId: process.env.GOOGLE_CLOUD_PROJECT,\n service: process.env.OTEL_SERVICE_NAME ?? 'my-service',\n }),`,\n section: 'BACKEND_CONFIG',\n },\n nextSteps: [\n 'Set GOOGLE_CLOUD_PROJECT to your GCP project ID',\n 'Configure Application Default Credentials (gcloud auth application-default login or GOOGLE_APPLICATION_CREDENTIALS)',\n 'Enable the Telemetry API in your project',\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 { PluginPreset } from '../../types/index';\n\n/**\n * Sentry preset — wires Sentry as the OTLP destination + error linker.\n *\n * Uses `sentryOtlpConfig(DSN)` to build endpoint/headers from the user's DSN\n * and `linkSentryErrors(Sentry)` to thread captured errors onto the active\n * trace context. Sentry's own OpenTelemetry setup is skipped\n * (`skipOpenTelemetrySetup: true`) — autotel owns the OTel side.\n */\nexport const sentry: PluginPreset = {\n name: 'Sentry',\n slug: 'sentry',\n type: 'plugin',\n description:\n 'Send traces to Sentry via OTLP and link captured errors to active traces',\n packages: {\n required: ['autotel-sentry', '@sentry/node'],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [\n {\n name: 'SENTRY_DSN',\n description: 'Sentry Data Source Name (project ingest URL)',\n example: 'https://<key>@o<org>.ingest.sentry.io/<project>',\n sensitive: true,\n },\n ],\n optional: [],\n },\n imports: [\n {\n source: '@sentry/node',\n specifiers: ['*'],\n default: '* as Sentry',\n },\n {\n source: 'autotel-sentry',\n specifiers: ['sentryOtlpConfig', 'linkSentryErrors'],\n },\n ],\n configBlock: {\n type: 'plugin',\n code: `// Sentry OTLP setup\nconst sentryConfig = sentryOtlpConfig(process.env.SENTRY_DSN!);\nSentry.init({ dsn: sentryConfig.dsn, skipOpenTelemetrySetup: true });\nlinkSentryErrors(Sentry);`,\n section: 'PLUGIN_INIT',\n },\n nextSteps: [\n 'Set SENTRY_DSN in .env (from Sentry → Settings → Projects → Client Keys)',\n 'Captured Sentry errors will now be linked to active OTel traces',\n 'Pass sentryConfig.endpoint and sentryConfig.headers to init() if you want Sentry as the trace backend',\n ],\n};\n","import type { PluginPreset } from '../../types/index';\n\n/**\n * Hono preset — wires `otel()` middleware for HTTP tracing + metrics.\n *\n * The preset emits an import and a comment showing how to register the\n * middleware. We can't insert middleware into the user's Hono app from the\n * instrumentation file (the user owns app construction), so this is a\n * \"next-step\" preset: imports + setup snippet + clear nextSteps.\n */\nexport const hono: PluginPreset = {\n name: 'Hono',\n slug: 'hono',\n type: 'plugin',\n description: 'HTTP tracing + metrics middleware for Hono apps',\n packages: {\n required: ['autotel-hono'],\n optional: ['autotel-adapters'],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-hono',\n specifiers: ['otel'],\n },\n ],\n configBlock: {\n type: 'plugin',\n code: `// Register the otel() middleware on your Hono app:\n// app.use('*', otel({\n// serviceName: 'my-service',\n// captureRequestHeaders: ['user-agent'],\n// captureResponseHeaders: ['content-type'],\n// }));`,\n section: 'PLUGIN_INIT',\n },\n nextSteps: [\n \"Add otel() middleware to your Hono app: app.use('*', otel({ serviceName: '<name>' }))\",\n 'Optionally install autotel-adapters and use useLogger() to thread the request logger',\n 'See packages/autotel-hono README for header/metric configuration',\n ],\n};\n","import type { PluginPreset } from '../../types/index';\n\n/**\n * MCP preset — instruments Model Context Protocol servers (and optionally\n * clients) using `instrumentMcpServer` / `instrumentMcpClient`.\n *\n * Like Hono, this is a \"next-step\" preset — we can't wrap the user's MCP\n * server instance from the instrumentation file because the user constructs\n * it. We emit the import and a clear snippet.\n */\nexport const mcp: PluginPreset = {\n name: 'MCP (Model Context Protocol)',\n slug: 'mcp',\n type: 'plugin',\n description:\n 'Distributed tracing for MCP servers and clients (W3C trace context via _meta)',\n packages: {\n required: ['autotel-mcp-instrumentation'],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-mcp-instrumentation',\n specifiers: ['instrumentMcpServer'],\n },\n ],\n configBlock: {\n type: 'plugin',\n code: `// Wrap your MCP server after constructing it:\n// const instrumented = instrumentMcpServer(server, {\n// networkTransport: 'pipe',\n// captureToolArgs: true,\n// captureToolResults: false,\n// captureErrors: true,\n// });\n//\n// For clients, import { instrumentMcpClient } and wrap the client.`,\n section: 'PLUGIN_INIT',\n },\n nextSteps: [\n 'Wrap your MCP server with instrumentMcpServer(server, { ... })',\n 'For clients, use instrumentMcpClient from autotel-mcp-instrumentation',\n 'Traces follow OTel MCP semantic conventions and propagate via the _meta field',\n ],\n};\n","import type { PluginPreset } from '../../types/index';\n\n/**\n * TanStack Start preset — registers tracing middleware for server requests\n * and server functions.\n *\n * TanStack Start has its own `createStart()` entry point; the user's\n * `start.ts` is where middleware gets composed. We emit the import and\n * snippet; the user wires it into their createStart() call.\n */\nexport const tanstack: PluginPreset = {\n name: 'TanStack Start',\n slug: 'tanstack',\n type: 'plugin',\n description:\n 'Tracing middleware for TanStack Start (SSR requests + server functions)',\n packages: {\n required: ['autotel-tanstack'],\n optional: [],\n devOnly: [],\n },\n env: {\n required: [],\n optional: [],\n },\n imports: [\n {\n source: 'autotel-tanstack/middleware',\n specifiers: ['createTracingServerHandler'],\n },\n ],\n configBlock: {\n type: 'plugin',\n code: `// In your start.ts, register tracing middleware on createStart():\n// import { createMiddleware, createStart } from '@tanstack/react-start';\n//\n// const requestTracing = createMiddleware().server(\n// createTracingServerHandler({\n// captureHeaders: ['x-request-id', 'user-agent'],\n// excludePaths: ['/health', '/metrics'],\n// }),\n// );\n//\n// const functionTracing = createMiddleware({ type: 'function' }).server(\n// createTracingServerHandler({ type: 'function', captureArgs: true }),\n// );\n//\n// export const startInstance = createStart(() => ({\n// requestMiddleware: [requestTracing],\n// functionMiddleware: [functionTracing],\n// }));`,\n section: 'PLUGIN_INIT',\n },\n nextSteps: [\n 'Add tracing middleware to your createStart() call in src/start.ts',\n 'Alternative: import \"autotel-tanstack/auto\" for zero-config init via OTEL_* env vars',\n 'See packages/autotel-tanstack README for loader/server-function tracing helpers',\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 { googleCloud } from './backends/google-cloud';\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 { sentry } from './plugins/sentry';\nimport { hono } from './plugins/hono';\nimport { mcp } from './plugins/mcp';\nimport { tanstack } from './plugins/tanstack';\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 ['google-cloud', googleCloud],\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 ['sentry', sentry],\n ['hono', hono],\n ['mcp', mcp],\n ['tanstack', tanstack],\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 'node-google-cloud',\n {\n name: 'Node.js + Google Cloud',\n slug: 'node-google-cloud',\n description: 'Node.js with Google Cloud Observability (Telemetry API)',\n backend: 'google-cloud',\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 googleCloud,\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 sentry,\n hono,\n mcp,\n tanstack,\n awsLambda,\n cloudflare,\n edge,\n};\n","/**\n * Structured error envelope for agent-native CLI usage.\n *\n * Inspired by the wrangler-deploy / agent-native CLI design: errors carry a\n * stable code (AUTOTEL_E_*), a type bucket, a human message, an optional\n * `fix` hint, and a structured `expected` payload so agents can recover\n * without scraping prose.\n */\n\n/**\n * Error type buckets. Stable enum.\n */\nexport type AutotelErrorType =\n | 'validation' // Bad input / missing required args\n | 'environment' // Missing files, no package.json, wrong CWD\n | 'auth' // Missing/invalid credentials\n | 'conflict' // Existing config, ambiguous workspace\n | 'install' // Package install failed\n | 'io' // File read/write failed\n | 'runtime'; // Catch-all unexpected failure\n\n/**\n * Stable error codes. Append-only — never rename or repurpose an existing code.\n */\nexport const AutotelErrorCodes = {\n // validation\n E_NO_PACKAGE_JSON: 'AUTOTEL_E_NO_PACKAGE_JSON',\n E_UNKNOWN_PRESET: 'AUTOTEL_E_UNKNOWN_PRESET',\n E_INVALID_PLAN: 'AUTOTEL_E_INVALID_PLAN',\n E_INVALID_INPUT: 'AUTOTEL_E_INVALID_INPUT',\n E_INVALID_FLAG: 'AUTOTEL_E_INVALID_FLAG',\n // environment\n E_NO_WORKSPACE_PACKAGES: 'AUTOTEL_E_NO_WORKSPACE_PACKAGES',\n E_ENV_CONSENT_REQUIRED: 'AUTOTEL_E_ENV_CONSENT_REQUIRED',\n // conflict\n E_EXISTING_CONFIG: 'AUTOTEL_E_EXISTING_CONFIG',\n E_AMBIGUOUS_LOGGER: 'AUTOTEL_E_AMBIGUOUS_LOGGER',\n // install\n E_INSTALL_FAILED: 'AUTOTEL_E_INSTALL_FAILED',\n // io\n E_WRITE_FAILED: 'AUTOTEL_E_WRITE_FAILED',\n E_READ_FAILED: 'AUTOTEL_E_READ_FAILED',\n // runtime\n E_UNKNOWN: 'AUTOTEL_E_UNKNOWN',\n} as const;\n\nexport type AutotelErrorCode =\n (typeof AutotelErrorCodes)[keyof typeof AutotelErrorCodes];\n\n/**\n * Error envelope payload. This is what gets serialised in --json output.\n */\nexport interface AutotelErrorEnvelope {\n ok: false;\n command?: string;\n error: {\n type: AutotelErrorType;\n code: AutotelErrorCode;\n message: string;\n retryable: boolean;\n fix?: string;\n expected?: Record<string, unknown>;\n suggestions?: string[];\n };\n}\n\n/**\n * Throwable error class carrying envelope-shaped fields.\n *\n * Callers throw `new AutotelError({ ... })` instead of `process.exit(1)`.\n * The top-level CLI entry catches it, picks pretty vs JSON output, and exits\n * with the correct code (1 runtime, 2 validation/refusal).\n */\nexport class AutotelError extends Error {\n readonly type: AutotelErrorType;\n readonly code: AutotelErrorCode;\n readonly retryable: boolean;\n readonly fix?: string;\n readonly expected?: Record<string, unknown>;\n readonly suggestions?: string[];\n\n constructor(opts: {\n type: AutotelErrorType;\n code: AutotelErrorCode;\n message: string;\n retryable?: boolean;\n fix?: string;\n expected?: Record<string, unknown>;\n suggestions?: string[];\n }) {\n super(opts.message);\n this.name = 'AutotelError';\n this.type = opts.type;\n this.code = opts.code;\n this.retryable = opts.retryable ?? false;\n this.fix = opts.fix;\n this.expected = opts.expected;\n this.suggestions = opts.suggestions;\n }\n\n toEnvelope(command?: string): AutotelErrorEnvelope {\n return {\n ok: false,\n ...(command !== undefined ? { command } : {}),\n error: {\n type: this.type,\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n ...(this.fix !== undefined ? { fix: this.fix } : {}),\n ...(this.expected !== undefined ? { expected: this.expected } : {}),\n ...(this.suggestions !== undefined\n ? { suggestions: this.suggestions }\n : {}),\n },\n };\n }\n}\n\n/**\n * Exit codes. Split following agent-native conventions:\n * 0 = success\n * 1 = runtime / unexpected failure\n * 2 = validation / refusal (caller-fixable)\n */\nexport function exitCodeForError(err: AutotelError): 1 | 2 {\n if (err.type === 'validation' || err.type === 'conflict') {\n return 2;\n }\n return 1;\n}\n\n/**\n * Wrap an unknown thrown value in an AutotelError envelope.\n */\nexport function toAutotelError(value: unknown): AutotelError {\n if (value instanceof AutotelError) return value;\n const message = value instanceof Error ? value.message : String(value);\n return new AutotelError({\n type: 'runtime',\n code: AutotelErrorCodes.E_UNKNOWN,\n message,\n });\n}\n","/**\n * `InitPlan` — the unit of work `autotel init` produces from detection and\n * consumes via `--plan <path>` / `--input -`. Agents generate plans, humans\n * review them, agents apply them.\n *\n * Roundtrip: a plan emitted via `autotel init --json --dry-run` is valid\n * input for `autotel init --plan <file>`. Keep the shape stable; treat new\n * fields as optional.\n */\n\nimport type {\n DetectedBackend,\n DetectedPackage,\n LoggerKind,\n PresetSlug,\n} from './dep-detector';\nimport { AutotelError, AutotelErrorCodes } from './errors';\n\nexport interface InitPlanDetection {\n packages: DetectedPackage[];\n primaryLogger: LoggerKind | null;\n autoInstrumentLoggers: LoggerKind[];\n autoInstrumentedDeps: string[];\n backend: DetectedBackend;\n platform: PresetSlug | null;\n}\n\nexport interface InitPlanFile {\n path: string;\n action: 'create' | 'merge' | 'skip';\n}\n\nexport interface InitPlanEnvVar {\n name: string;\n sensitive: boolean;\n action: 'add-to-.env.example' | 'present';\n}\n\nexport interface InitPlan {\n /** Plan format version. Increment when making breaking changes. */\n v: 1;\n /** Preset slugs to wire (backend, subscribers, plugins, platform). */\n presets: PresetSlug[];\n /** Packages to install. */\n packagesToInstall: { prod: string[]; dev: string[] };\n /** Files we will write or merge. */\n filesToWrite: InitPlanFile[];\n /** Env vars referenced by the chosen presets. */\n envVars: InitPlanEnvVar[];\n /** Human-readable next-step strings. */\n nextSteps: string[];\n /** Echo of detection for transparency. Omitted when plan was hand-crafted. */\n detected?: InitPlanDetection;\n}\n\n/**\n * Validate a candidate plan, returning a typed `InitPlan` or throwing\n * AutotelError(E_INVALID_PLAN). Minimal structural check — we trust the\n * caller for now.\n */\nexport function parsePlan(input: unknown): InitPlan {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n throw new AutotelError({\n type: 'validation',\n code: AutotelErrorCodes.E_INVALID_PLAN,\n message: 'Plan must be a JSON object',\n expected: { v: 1, presets: 'string[]' },\n });\n }\n const obj = input as Record<string, unknown>;\n if (obj['v'] !== 1) {\n throw new AutotelError({\n type: 'validation',\n code: AutotelErrorCodes.E_INVALID_PLAN,\n message: `Unsupported plan version: ${String(obj['v'])}`,\n fix: 'Regenerate the plan with `autotel init --json --dry-run`',\n expected: { v: 1 },\n });\n }\n if (!Array.isArray(obj['presets'])) {\n throw new AutotelError({\n type: 'validation',\n code: AutotelErrorCodes.E_INVALID_PLAN,\n message: 'plan.presets must be an array of preset slugs',\n });\n }\n const pkgs = obj['packagesToInstall'];\n if (\n typeof pkgs !== 'object' ||\n pkgs === null ||\n !Array.isArray((pkgs as Record<string, unknown>)['prod']) ||\n !Array.isArray((pkgs as Record<string, unknown>)['dev'])\n ) {\n throw new AutotelError({\n type: 'validation',\n code: AutotelErrorCodes.E_INVALID_PLAN,\n message: 'plan.packagesToInstall must be { prod: string[], dev: string[] }',\n });\n }\n return obj as unknown as InitPlan;\n}\n","/**\n * Parser for existing CLI-owned instrumentation files.\n *\n * The init command writes section markers like `// --- AUTOTEL:BACKEND ---`\n * around regions it owns. On re-run we read the existing file, identify\n * which imports and preset slugs are already wired, and let the caller diff\n * against the new detection result so we only add what's missing.\n *\n * If the file lacks the CLI ownership header (user wrote it by hand), the\n * caller falls back to the existing abort/update/new prompt rather than\n * editing in place. This keeps surgical merging opt-in via the markers.\n */\n\nimport { hasCliOwnershipHeader } from './code-builder';\n\nexport interface ParsedInstrumentation {\n /** Has the `managed by autotel-cli` header — safe to merge. */\n cliOwned: boolean;\n /** Module specifiers already imported (e.g. 'autotel-sentry'). */\n importedSources: Set<string>;\n /** Logger module if recognised ('pino' | 'winston' | 'bunyan' | null). */\n detectedLogger: 'pino' | 'winston' | 'bunyan' | null;\n /** Strings inside `autoInstrumentations: [...]`, if present. */\n autoInstrumentations: string[];\n}\n\n/**\n * Parse an existing instrumentation file. Lightweight regex-based — we only\n * need import specifiers and the autoInstrumentations array. Full AST parse\n * is out of scope and would couple us to ts-morph here.\n */\nexport function parseInstrumentation(content: string): ParsedInstrumentation {\n const cliOwned = hasCliOwnershipHeader(content);\n const importedSources = collectImportSources(content);\n const detectedLogger = pickLogger(importedSources);\n const autoInstrumentations = parseAutoInstrumentations(content);\n\n return { cliOwned, importedSources, detectedLogger, autoInstrumentations };\n}\n\nfunction collectImportSources(content: string): Set<string> {\n const out = new Set<string>();\n // Matches both `import 'x';` and `import ... from 'x';` (single or double quotes).\n const re = /import\\s+(?:[^'\"]*\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(content)) !== null) {\n if (match[1] !== undefined) out.add(match[1]);\n }\n return out;\n}\n\nfunction pickLogger(\n imports: Set<string>\n): ParsedInstrumentation['detectedLogger'] {\n if (imports.has('pino')) return 'pino';\n if (imports.has('winston')) return 'winston';\n if (imports.has('bunyan')) return 'bunyan';\n return null;\n}\n\nfunction parseAutoInstrumentations(content: string): string[] {\n // Matches `autoInstrumentations: ['x', 'y']` (single quotes only, which\n // is what code-builder emits).\n const re = /autoInstrumentations\\s*:\\s*\\[([^\\]]*)\\]/;\n const match = re.exec(content);\n if (!match || match[1] === undefined) return [];\n return [...match[1].matchAll(/['\"]([^'\"]+)['\"]/g)]\n .map((m) => m[1])\n .filter((s): s is string => s !== undefined);\n}\n\n/**\n * Given the parsed existing file + the new plan's import sources, return\n * the subset of plan imports that are NEW (i.e. need to be added).\n */\nexport function diffImportSources(\n existing: ParsedInstrumentation,\n planImportSources: string[]\n): string[] {\n return planImportSources.filter((s) => !existing.importedSources.has(s));\n}\n\n/**\n * Given the parsed existing file + the new plan's autoInstrumentation list,\n * return the entries that are NEW.\n */\nexport function diffAutoInstrumentations(\n existing: ParsedInstrumentation,\n planEntries: string[]\n): string[] {\n return planEntries.filter((e) => !existing.autoInstrumentations.includes(e));\n}\n","import chalk from 'chalk';\nimport { checkbox, select } from '@inquirer/prompts';\nimport type { InitPlan } from '../lib/plan';\n\n/**\n * Render an InitPlan as a single human-readable preview screen.\n *\n * The agent-native equivalent of this preview is `autotel init --json\n * --dry-run`, which emits the same `InitPlan` as machine-parseable JSON.\n */\nexport function renderPlanPreview(plan: InitPlan): string {\n const lines: string[] = [\n chalk.bold('autotel init — proposed plan'),\n '',\n ];\n\n if (plan.detected) {\n const det = plan.detected;\n const pkgList = det.packages\n .map((p) => `${p.name}@${p.version}`)\n .join(', ');\n lines.push(\n `${chalk.dim('Detected packages:')} ${pkgList || chalk.dim('(none)')}`\n );\n if (det.primaryLogger !== null) {\n lines.push(\n `${chalk.dim('Logger:')} ${chalk.bold(det.primaryLogger)} ${chalk.dim('(first-class)')}` +\n (det.autoInstrumentLoggers.length > 0\n ? `, ${chalk.dim('+ auto-instrumented:')} ${det.autoInstrumentLoggers.join(', ')}`\n : '')\n );\n }\n if (det.autoInstrumentedDeps.length > 0) {\n lines.push(\n `${chalk.dim('Covered by auto-instrumentations-node:')} ${det.autoInstrumentedDeps.join(', ')}`\n );\n }\n lines.push(\n `${chalk.dim('Backend:')} ${chalk.bold(det.backend.slug)} ${chalk.dim(`(${det.backend.source}${det.backend.detail ? `: ${det.backend.detail}` : ''})`)}`\n );\n if (det.platform !== null) {\n lines.push(`${chalk.dim('Platform:')} ${chalk.bold(det.platform)}`);\n }\n }\n\n lines.push('');\n lines.push(chalk.bold('Will wire:'));\n for (const slug of plan.presets) {\n lines.push(` ${chalk.green('+')} ${slug}`);\n }\n\n lines.push('');\n if (plan.packagesToInstall.prod.length > 0) {\n lines.push(\n `${chalk.bold('Install:')} ${plan.packagesToInstall.prod.join(', ')}`\n );\n }\n if (plan.packagesToInstall.dev.length > 0) {\n lines.push(\n `${chalk.bold('Install (dev):')} ${plan.packagesToInstall.dev.join(', ')}`\n );\n }\n\n if (plan.envVars.length > 0) {\n lines.push('');\n lines.push(chalk.bold('Env vars:'));\n for (const ev of plan.envVars) {\n const marker = ev.sensitive ? chalk.yellow('[sensitive]') : '';\n lines.push(` ${ev.name} ${marker}`);\n }\n }\n\n if (plan.filesToWrite.length > 0) {\n lines.push('');\n lines.push(chalk.bold('Files:'));\n for (const f of plan.filesToWrite) {\n lines.push(` ${chalk.dim(f.action)} ${f.path}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Single confirmation screen with three choices: apply / edit / abort.\n * Returns the (possibly edited) plan, or null if aborted.\n */\nexport async function confirmOrEditPlan(\n plan: InitPlan\n): Promise<InitPlan | null> {\n console.log(renderPlanPreview(plan));\n console.log('');\n\n const choice = await select({\n message: 'Proceed?',\n choices: [\n { value: 'apply' as const, name: 'Apply the plan above' },\n { value: 'edit' as const, name: 'Edit — deselect items I do not want' },\n { value: 'abort' as const, name: 'Abort, write nothing' },\n ],\n default: 'apply',\n });\n\n if (choice === 'abort') return null;\n if (choice === 'apply') return plan;\n\n // edit: let user deselect presets\n const kept = await checkbox({\n message: 'Keep which presets?',\n choices: plan.presets.map((slug) => ({\n value: slug,\n name: slug,\n checked: true,\n })),\n });\n\n // Conservative: only filter the preset list. Install set and env vars\n // stay — re-deriving them would require re-running planning with the\n // filtered slugs, which the caller can do if needed.\n return { ...plan, presets: kept };\n}\n\n/**\n * Workspace multi-select. Returns absolute package paths the user chose.\n */\nexport async function promptWorkspaceSelection(\n packages: { path: string; relativePath: string; name: string | null }[]\n): Promise<string[]> {\n const chosen = await checkbox({\n message: 'Which workspace packages do you want to instrument?',\n choices: packages.map((p) => ({\n value: p.path,\n name: `${p.relativePath} ${p.name ? chalk.dim(`(${p.name})`) : ''}`,\n })),\n });\n return chosen;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { atomicWrite } from './fs';\n\n/**\n * Module-level state for output configuration.\n *\n * Set once at command entry by `configureJsonOutput()`. Subsequent calls to\n * `printJson()` and `printJsonError()` use these settings. Module state is\n * deliberate: every output channel (success, error, watch tick) needs the\n * same redaction and artifact-persistence rules, and threading config\n * through every callsite would be noisy.\n */\nlet outputFilePath: string | null = null;\nlet outputFileWritten = false;\nlet outputRoot: string | null = null;\nlet redactSecrets = false;\n\n/**\n * Configure JSON output for the current command invocation.\n */\nexport function configureJsonOutput(opts: {\n outputFile?: string;\n outputRoot?: string;\n noSecrets?: boolean;\n}): void {\n outputFilePath = opts.outputFile ?? null;\n outputFileWritten = false;\n outputRoot = opts.outputRoot ?? null;\n redactSecrets =\n opts.noSecrets === true ||\n process.env['AUTOTEL_NO_SECRETS'] === '1' ||\n process.env['AGENT_SANDBOX'] === '1';\n}\n\n/**\n * Reset module state. Test helper.\n */\nexport function resetJsonOutput(): void {\n outputFilePath = null;\n outputFileWritten = false;\n outputRoot = null;\n redactSecrets = false;\n}\n\nconst SECRET_KEY_PATTERN = /SECRET|TOKEN|PASSWORD|API[_-]?KEY|DSN/i;\nconst SECRET_VALUE_PATTERN = /^[A-Za-z0-9_\\-+/=]{40,}$/;\nconst REDACTED = '[REDACTED]';\n\n/**\n * Recursively redact secret-shaped values in a JSON-safe object.\n * Triggered by --no-secrets-in-output / AUTOTEL_NO_SECRETS=1 / AGENT_SANDBOX=1.\n */\nexport function redact(value: unknown): unknown {\n if (value === null || value === undefined) return value;\n\n if (Array.isArray(value)) {\n return value.map((v) => redact(v));\n }\n\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'string' && SECRET_KEY_PATTERN.test(k)) {\n out[k] = REDACTED;\n } else {\n out[k] = redact(v);\n }\n }\n return out;\n }\n\n if (typeof value === 'string' && SECRET_VALUE_PATTERN.test(value)) {\n return REDACTED;\n }\n\n return value;\n}\n\n/**\n * Print a JSON payload to stdout. If `--output-file` was configured, also\n * persist the first payload to disk (subsequent ticks only go to stdout to\n * avoid artifact churn on watch-style commands).\n */\nexport function printJson(data: unknown): void {\n const payload = redactSecrets ? redact(data) : data;\n const serialised = JSON.stringify(payload, null, 2);\n\n process.stdout.write(serialised + '\\n');\n\n if (outputFilePath !== null && !outputFileWritten) {\n writeArtifactFile(outputFilePath, serialised);\n outputFileWritten = true;\n }\n}\n\nfunction writeArtifactFile(filePath: string, content: string): void {\n const resolved = path.resolve(filePath);\n if (outputRoot !== null) {\n atomicWrite(resolved, content, { root: outputRoot });\n } else {\n fs.mkdirSync(path.dirname(resolved), { recursive: true });\n fs.writeFileSync(resolved, content, 'utf8');\n }\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 * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { configureJsonOutput, printJson } from '../lib/json-output';\nimport {\n COMMANDS,\n ERROR_CATALOGUE,\n getCommand,\n type CommandSpec,\n} from '../lib/manifest';\nimport { AutotelError, AutotelErrorCodes } from '../lib/errors';\n\ninterface SchemaCommonOptions {\n outputFile?: string;\n noSecrets?: boolean;\n}\n\nfunction configure(opts: SchemaCommonOptions): void {\n configureJsonOutput({\n outputFile: opts.outputFile,\n noSecrets: opts.noSecrets,\n });\n}\n\nfunction readSelfVersion(): string {\n try {\n // dist/index.js → walks up to package root\n const here = path.dirname(fileURLToPath(import.meta.url));\n let dir = here;\n for (let i = 0; i < 5; i++) {\n const candidate = path.join(dir, 'package.json');\n if (fs.existsSync(candidate)) {\n const pkg = JSON.parse(fs.readFileSync(candidate, 'utf8'));\n if (pkg.name === 'autotel-cli') return String(pkg.version ?? '0.0.0');\n }\n dir = path.dirname(dir);\n }\n } catch {\n // fall through\n }\n return '0.0.0';\n}\n\n/** `autotel schema [--json]` — full manifest. */\nexport function runSchema(opts: SchemaCommonOptions): void {\n configure(opts);\n printJson({\n ok: true,\n command: 'autotel schema',\n version: readSelfVersion(),\n commands: COMMANDS,\n });\n}\n\n/** `autotel schema errors [--json]` */\nexport function runSchemaErrors(opts: SchemaCommonOptions): void {\n configure(opts);\n printJson({\n ok: true,\n command: 'autotel schema errors',\n envelope: {\n ok: false,\n command: '<command>',\n error: {\n type: '<one of: validation, environment, auth, conflict, install, io, runtime>',\n code: '<AUTOTEL_E_*>',\n message: 'human-readable message',\n retryable: false,\n fix: 'optional remediation hint',\n expected: { '<key>': '<value>' },\n suggestions: ['optional follow-up commands'],\n },\n },\n codes: ERROR_CATALOGUE,\n exitCodes: {\n '0': 'success',\n '1': 'runtime / unexpected failure',\n '2': 'validation / conflict / refusal',\n },\n });\n}\n\n/** `autotel schema outputs [--json]` — JSON output shapes per command. */\nexport function runSchemaOutputs(opts: SchemaCommonOptions): void {\n configure(opts);\n // For v1 we publish the shape of init's JSON plan output. Other commands\n // can be filled in incrementally.\n printJson({\n ok: true,\n command: 'autotel schema outputs',\n outputs: {\n 'autotel init --json': {\n ok: 'boolean',\n command: 'string',\n detected: {\n packages: 'array of { name, version, resolution: \"target\" | \"workspace-root\" }',\n logger: '\"pino\" | \"winston\" | \"bunyan\" | null',\n backend: '{ source: \"env\" | \"wrangler\" | \"deps\" | \"prompt\" | \"default\", value: string }',\n platform: '\"cloudflare\" | \"aws-lambda\" | \"edge\" | null',\n },\n plan: {\n presets: 'string[] (slugs)',\n packagesToInstall: { prod: 'string[]', dev: 'string[]' },\n filesToWrite: 'array of { path, action: \"create\" | \"merge\" | \"skip\" }',\n envVars: 'array of { name, sensitive, action }',\n },\n nextSteps: 'string[]',\n },\n },\n });\n}\n\n/** `autotel commands [--json]` — compact listing. */\nexport function runCommandsListing(opts: SchemaCommonOptions): void {\n configure(opts);\n const compact = COMMANDS.map((c: CommandSpec) => ({\n name: c.name,\n description: c.description,\n mutating: c.mutating,\n network: c.network,\n writesFiles: c.writesFiles,\n supportsDryRun: c.supportsDryRun,\n supportsJson: c.supportsJson,\n }));\n printJson({ ok: true, command: 'autotel commands', commands: compact });\n}\n\n/** `autotel examples [name] [--json]` */\nexport function runExamples(\n name: string | undefined,\n opts: SchemaCommonOptions\n): void {\n configure(opts);\n\n if (name === undefined) {\n const all = COMMANDS.filter((c) => c.examples && c.examples.length > 0).map(\n (c) => ({ command: c.name, examples: c.examples })\n );\n printJson({ ok: true, command: 'autotel examples', examples: all });\n return;\n }\n\n const cmd = getCommand(name);\n if (!cmd) {\n throw new AutotelError({\n type: 'validation',\n code: AutotelErrorCodes.E_INVALID_INPUT,\n message: `Unknown command: ${name}`,\n expected: { command: COMMANDS.map((c) => c.name) },\n fix: 'Run `autotel commands --json` to see available commands',\n });\n }\n printJson({\n ok: true,\n command: 'autotel examples',\n target: cmd.name,\n examples: cmd.examples ?? [],\n });\n}\n\n/** `autotel version [--json]` */\nexport function runVersion(opts: SchemaCommonOptions): void {\n configure(opts);\n printJson({\n ok: true,\n command: 'autotel version',\n version: readSelfVersion(),\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n });\n}\n","import { AutotelErrorCodes, type AutotelErrorCode } from './errors';\n\n/**\n * Per-command metadata. Agents read this via `autotel schema --json` to\n * discover the surface, side-effects, and which flags exist.\n *\n * Source of truth: this file. A drift test (manifest.test.ts) verifies the\n * commander dispatcher matches.\n */\nexport interface FlagSpec {\n name: string;\n alias?: string;\n takesValue?: boolean;\n description: string;\n default?: string | boolean;\n}\n\nexport interface CommandSpec {\n name: string;\n description: string;\n args?: { name: string; required: boolean; description: string }[];\n flags: FlagSpec[];\n /** True when the command mutates files or installs packages. */\n mutating: boolean;\n /** True when the command makes network requests (e.g. installs). */\n network: boolean;\n /** True when the command writes files to disk. */\n writesFiles: boolean;\n /** True when --dry-run is honoured. */\n supportsDryRun: boolean;\n /** True when the command needs a package.json in scope. */\n requiresPackageJson: boolean;\n /** True when the command may read .env files (consent-gated). */\n mayReadEnv: boolean;\n /** True when the command emits machine-readable JSON via --json. */\n supportsJson: boolean;\n examples?: { description: string; command: string }[];\n}\n\nconst GLOBAL_FLAGS: FlagSpec[] = [\n {\n name: '--cwd',\n takesValue: true,\n description: 'Target directory (default: current working directory)',\n },\n { name: '--verbose', description: 'Show detailed output' },\n { name: '--quiet', description: 'Only show warnings and errors' },\n];\n\nconst AGENT_FLAGS: FlagSpec[] = [\n {\n name: '--json',\n description: 'Emit machine-readable JSON instead of human output',\n },\n {\n name: '--output-file',\n takesValue: true,\n description: 'Persist the first JSON payload to this path',\n },\n {\n name: '--no-secrets-in-output',\n description:\n 'Redact secret-shaped values (also via AUTOTEL_NO_SECRETS=1 / AGENT_SANDBOX=1)',\n },\n {\n name: '--no-interactive',\n description: 'Never prompt; fail fast if input is required',\n },\n];\n\nexport const COMMANDS: CommandSpec[] = [\n {\n name: 'init',\n description: 'Initialise autotel in your project',\n flags: [\n ...GLOBAL_FLAGS,\n ...AGENT_FLAGS,\n { name: '--dry-run', description: 'Print what would be done; write nothing' },\n { name: '--no-install', description: 'Generate files only, skip package installation' },\n { name: '--print-install-cmd', description: 'Output install command without running it' },\n { name: '--yes', alias: '-y', description: 'Auto-apply detected items; no prompts' },\n { name: '--preset', takesValue: true, description: 'Use a named quick preset' },\n { name: '--force', description: 'Overwrite existing config (creates backup)' },\n { name: '--workspace-root', description: 'Install at workspace root, not package root' },\n { name: '--no-detect', description: 'Skip auto-detection of installed deps' },\n { name: '--detect-only', description: 'Run detection and print the proposal; write nothing' },\n { name: '--plan', takesValue: true, description: 'Read a pre-built InitPlan JSON from this path and apply it' },\n { name: '--input', takesValue: true, description: 'Read InitPlan JSON from stdin (-) or a file' },\n { name: '--scan-env', description: 'Consent to reading uncommitted .env files for backend detection' },\n ],\n mutating: true,\n network: true,\n writesFiles: true,\n supportsDryRun: true,\n requiresPackageJson: true,\n mayReadEnv: true,\n supportsJson: true,\n examples: [\n { description: 'Interactive setup with detection', command: 'autotel init' },\n { description: 'Non-interactive, apply all detected items', command: 'autotel init --yes' },\n { description: 'Preview as JSON without writing', command: 'autotel init --json --dry-run' },\n { description: 'Detection only', command: 'autotel init --detect-only --json' },\n ],\n },\n {\n name: 'doctor',\n description: 'Run diagnostics on your autotel setup',\n flags: [\n ...GLOBAL_FLAGS,\n ...AGENT_FLAGS,\n { name: '--fix', description: 'Auto-fix resolvable issues' },\n { name: '--list-checks', description: 'List all available checks' },\n { name: '--env-file', takesValue: true, description: 'Path to env file to check' },\n ],\n mutating: false,\n network: false,\n writesFiles: false,\n supportsDryRun: false,\n requiresPackageJson: true,\n mayReadEnv: true,\n supportsJson: true,\n },\n {\n name: 'add',\n description: 'Add a backend, subscriber, plugin, or platform incrementally',\n args: [\n { name: 'type', required: false, description: 'Preset type' },\n { name: 'name', required: false, description: 'Preset name' },\n ],\n flags: [\n ...GLOBAL_FLAGS,\n ...AGENT_FLAGS,\n { name: '--list', description: 'List available presets for the given type' },\n { name: '--dry-run', description: 'Print what would be done' },\n { name: '--no-install', description: 'Generate files only' },\n { name: '--print-install-cmd', description: 'Output install command without running' },\n { name: '--yes', alias: '-y', description: 'Accept defaults' },\n { name: '--force', description: 'Overwrite non-CLI-owned config' },\n { name: '--workspace-root', description: 'Install at workspace root' },\n ],\n mutating: true,\n network: true,\n writesFiles: true,\n supportsDryRun: true,\n requiresPackageJson: true,\n mayReadEnv: false,\n supportsJson: true,\n },\n {\n name: 'codemod trace',\n description: 'Wrap functions in trace() with span name from function/variable/method name',\n args: [{ name: 'path', required: true, description: 'File path or glob' }],\n flags: [\n ...GLOBAL_FLAGS,\n { name: '--dry-run', description: 'Print changes without writing files' },\n { name: '--name-pattern', takesValue: true, description: 'Span name template' },\n { name: '--skip', takesValue: true, description: 'Skip functions whose name matches (repeatable)' },\n { name: '--print-files', description: 'Print per-file summary' },\n ],\n mutating: true,\n network: false,\n writesFiles: true,\n supportsDryRun: true,\n requiresPackageJson: false,\n mayReadEnv: false,\n supportsJson: false,\n },\n {\n name: 'schema',\n description: 'Print the CLI manifest as JSON (agent discovery)',\n flags: [\n { name: '--json', description: 'Always JSON (this command is JSON-only)' },\n ],\n mutating: false,\n network: false,\n writesFiles: false,\n supportsDryRun: false,\n requiresPackageJson: false,\n mayReadEnv: false,\n supportsJson: true,\n },\n {\n name: 'schema errors',\n description: 'Print error envelope shape + AUTOTEL_E_* enum',\n flags: [{ name: '--json', description: 'Always JSON' }],\n mutating: false,\n network: false,\n writesFiles: false,\n supportsDryRun: false,\n requiresPackageJson: false,\n mayReadEnv: false,\n supportsJson: true,\n },\n {\n name: 'schema outputs',\n description: 'Print JSON output shapes per command',\n flags: [{ name: '--json', description: 'Always JSON' }],\n mutating: false,\n network: false,\n writesFiles: false,\n supportsDryRun: false,\n requiresPackageJson: false,\n mayReadEnv: false,\n supportsJson: true,\n },\n {\n name: 'commands',\n description: 'Print compact tool-style command listing',\n flags: [{ name: '--json', description: 'Always JSON' }],\n mutating: false,\n network: false,\n writesFiles: false,\n supportsDryRun: false,\n requiresPackageJson: false,\n mayReadEnv: false,\n supportsJson: true,\n },\n {\n name: 'examples',\n description: 'Print copy-pasteable examples for a command',\n args: [\n { name: 'command', required: false, description: 'Command name (omit for all)' },\n ],\n flags: [{ name: '--json', description: 'Emit JSON' }],\n mutating: false,\n network: false,\n writesFiles: false,\n supportsDryRun: false,\n requiresPackageJson: false,\n mayReadEnv: false,\n supportsJson: true,\n },\n {\n name: 'version',\n description: 'Print version info',\n flags: [{ name: '--json', description: 'Emit JSON' }],\n mutating: false,\n network: false,\n writesFiles: false,\n supportsDryRun: false,\n requiresPackageJson: false,\n mayReadEnv: false,\n supportsJson: true,\n },\n];\n\n// Investigate commands — mirror autotel-mcp tools. All emit JSON, none\n// mutate files. Backend-touching commands set network: true. Schemas are\n// terse (full flag docs live in the runtime); the manifest exists for agent\n// discoverability + drift-test parity with the dispatcher.\nconst INVESTIGATE_FLAGS: FlagSpec[] = [\n { name: '--backend', takesValue: true, description: 'Backend kind (env: AUTOTEL_BACKEND)' },\n { name: '--jaeger-base-url', takesValue: true, description: 'Jaeger base URL' },\n { name: '--tempo-base-url', takesValue: true, description: 'Tempo base URL' },\n { name: '--prometheus-base-url', takesValue: true, description: 'Prometheus base URL' },\n { name: '--loki-base-url', takesValue: true, description: 'Loki base URL' },\n { name: '--collector-port', takesValue: true, description: 'OTLP receiver port' },\n { name: '--fixture-path', takesValue: true, description: 'Fixture JSON path' },\n { name: '--output-file', takesValue: true, description: 'Persist JSON output to this path' },\n { name: '--no-secrets-in-output', description: 'Redact secret-shaped values' },\n];\n\nconst STATIC_FLAGS: FlagSpec[] = [\n { name: '--output-file', takesValue: true, description: 'Persist JSON output to this path' },\n { name: '--no-secrets-in-output', description: 'Redact secret-shaped values' },\n];\n\nfunction investigateCmd(\n name: string,\n description: string,\n extras: {\n args?: CommandSpec['args'];\n flags?: FlagSpec[];\n network?: boolean;\n static?: boolean;\n } = {},\n): CommandSpec {\n return {\n name,\n description,\n ...(extras.args ? { args: extras.args } : {}),\n flags: [...(extras.static ? STATIC_FLAGS : INVESTIGATE_FLAGS), ...(extras.flags ?? [])],\n mutating: false,\n network: extras.network ?? !extras.static,\n writesFiles: false,\n supportsDryRun: false,\n requiresPackageJson: false,\n mayReadEnv: false,\n supportsJson: true,\n };\n}\n\nconst traceIdArg: NonNullable<CommandSpec['args']> = [\n { name: 'traceId', required: true, description: 'Trace ID' },\n];\nconst serviceNameArg: NonNullable<CommandSpec['args']> = [\n { name: 'serviceName', required: true, description: 'Service name' },\n];\n\nconst INVESTIGATE_COMMANDS: CommandSpec[] = [\n investigateCmd('health', 'Backend health + signal coverage'),\n investigateCmd('capabilities', 'Which signals the active backend serves'),\n\n investigateCmd('discover', 'Discover services and field shapes (parent)'),\n investigateCmd('discover services', 'Services with cross-signal metadata'),\n investigateCmd('discover trace-fields', 'Trace/span field names from sampled traces', {\n flags: [{ name: '--search', takesValue: true, description: 'Substring filter' }],\n }),\n investigateCmd('discover log-fields', 'Log field names from sampled logs', {\n flags: [{ name: '--search', takesValue: true, description: 'Substring filter' }],\n }),\n\n investigateCmd('query', 'Query traces/spans/metrics/logs (parent)'),\n investigateCmd('query traces', 'Search traces by service/op/status/tags/time/error'),\n investigateCmd('query spans', 'Search individual spans (extra duration filters)'),\n investigateCmd('query metrics', 'List metric series'),\n investigateCmd('query logs', 'Search logs'),\n\n investigateCmd('trace', 'Trace lookup commands (parent)'),\n investigateCmd('trace get', 'Get a trace by ID', { args: traceIdArg }),\n investigateCmd('trace summary', 'Compact incident-friendly trace summary', { args: traceIdArg }),\n\n investigateCmd('topology', 'Service topology commands (parent)'),\n investigateCmd('topology services', 'List known services'),\n investigateCmd('topology operations', 'List operations for a service', { args: serviceNameArg }),\n investigateCmd('topology map', 'Service dependency map with node/edge health'),\n\n investigateCmd('diagnose', 'Anomaly / root-cause / errors / SLO diagnosis (parent)'),\n investigateCmd('diagnose anomalies', 'Latency / error-rate outliers'),\n investigateCmd('diagnose root-cause', 'Bottleneck span in a trace', { args: traceIdArg }),\n investigateCmd('diagnose errors', 'Error spans grouped by service/operation'),\n investigateCmd('diagnose slos', 'SLO violations for a service'),\n\n investigateCmd('correlate', 'Cross-signal correlation (parent)'),\n investigateCmd('correlate trace', 'Trace + metrics + logs for a trace ID', { args: traceIdArg }),\n investigateCmd('correlate explain-slowdown', 'Anomalies + root cause + correlated signals'),\n\n investigateCmd('llm', 'LLM analytics (parent)'),\n investigateCmd('llm usage', 'Token usage + USD by model and service'),\n investigateCmd('llm models', 'Discover LLM models in use'),\n investigateCmd('llm model-stats', 'Per-model latency/token/error stats'),\n investigateCmd('llm expensive', 'Top token-spend traces'),\n investigateCmd('llm slow', 'Slowest LLM traces'),\n investigateCmd('llm tools', 'Tool/function spans grouped by tool name'),\n\n investigateCmd('semconv', 'Semantic conventions lookup (parent)', { static: true }),\n investigateCmd('semconv list', 'List semconv namespaces', { static: true, network: true }),\n investigateCmd('semconv get', 'Groups for one namespace', {\n static: true,\n network: true,\n args: [{ name: 'namespace', required: true, description: 'Namespace (e.g. http)' }],\n }),\n investigateCmd('semconv refresh', 'Clear semconv cache', { static: true }),\n\n investigateCmd('score', 'Score a span for instrumentation quality (JSON on stdin)', {\n static: true,\n flags: [{ name: '--span-file', takesValue: true, description: 'Read span JSON from file' }],\n }),\n investigateCmd('score explain', 'Explain the instrumentation scoring rubric', { static: true }),\n\n investigateCmd('collector', 'OpenTelemetry Collector config + schema commands (parent)', {\n static: true,\n }),\n investigateCmd('collector validate', 'Validate OTLP receiver config', {\n static: true,\n flags: [{ name: '--config-file', takesValue: true, description: 'Read JSON config from file' }],\n }),\n investigateCmd('collector suggest', 'Minimal OTLP receiver config', { static: true }),\n investigateCmd('collector explain', 'Receiver config shape + defaults', { static: true }),\n investigateCmd('collector versions', 'Supported collector schema versions', { static: true, network: true }),\n investigateCmd('collector components', 'Components for a version', {\n static: true,\n network: true,\n flags: [\n { name: '--version', takesValue: true, description: 'Collector version' },\n { name: '--kind', takesValue: true, description: 'Component kind filter' },\n ],\n }),\n investigateCmd('collector schema', 'JSON schema for a component', {\n static: true,\n network: true,\n flags: [\n { name: '--kind', takesValue: true, description: 'Component kind' },\n { name: '--name', takesValue: true, description: 'Component name' },\n { name: '--version', takesValue: true, description: 'Collector version' },\n ],\n }),\n investigateCmd('collector readme', 'README for a component', {\n static: true,\n network: true,\n flags: [\n { name: '--kind', takesValue: true, description: 'Component kind' },\n { name: '--name', takesValue: true, description: 'Component name' },\n { name: '--version', takesValue: true, description: 'Collector version' },\n ],\n }),\n investigateCmd('collector validate-component', 'Validate component config against upstream schema', {\n static: true,\n network: true,\n flags: [\n { name: '--kind', takesValue: true, description: 'Component kind' },\n { name: '--name', takesValue: true, description: 'Component name' },\n { name: '--version', takesValue: true, description: 'Collector version' },\n { name: '--config-file', takesValue: true, description: 'Read JSON config from file' },\n ],\n }),\n investigateCmd('collector refresh', 'Refresh in-memory collector metadata cache', { static: true, network: true }),\n];\n\nCOMMANDS.push(...INVESTIGATE_COMMANDS);\n\nexport function getCommand(name: string): CommandSpec | undefined {\n return COMMANDS.find((c) => c.name === name);\n}\n\nexport interface ErrorCodeEntry {\n code: AutotelErrorCode;\n type: string;\n description: string;\n}\n\n/** Public catalogue of AUTOTEL_E_* codes for `autotel schema errors`. */\nexport const ERROR_CATALOGUE: ErrorCodeEntry[] = [\n { code: AutotelErrorCodes.E_NO_PACKAGE_JSON, type: 'environment', description: 'No package.json found in cwd or ancestors' },\n { code: AutotelErrorCodes.E_UNKNOWN_PRESET, type: 'validation', description: 'Preset slug not in registry' },\n { code: AutotelErrorCodes.E_INVALID_PLAN, type: 'validation', description: 'Plan file failed schema validation' },\n { code: AutotelErrorCodes.E_INVALID_INPUT, type: 'validation', description: 'Stdin or --input payload invalid' },\n { code: AutotelErrorCodes.E_INVALID_FLAG, type: 'validation', description: 'Conflicting or invalid flag combination' },\n { code: AutotelErrorCodes.E_NO_WORKSPACE_PACKAGES, type: 'environment', description: 'Workspace root has no detectable packages' },\n { code: AutotelErrorCodes.E_ENV_CONSENT_REQUIRED, type: 'environment', description: '.env file present; consent required (pass --scan-env or run interactively)' },\n { code: AutotelErrorCodes.E_EXISTING_CONFIG, type: 'conflict', description: 'Existing instrumentation config; use --force or run with merge' },\n { code: AutotelErrorCodes.E_AMBIGUOUS_LOGGER, type: 'conflict', description: 'Multiple loggers detected and selection could not be inferred' },\n { code: AutotelErrorCodes.E_INSTALL_FAILED, type: 'install', description: 'Package manager install command failed' },\n { code: AutotelErrorCodes.E_WRITE_FAILED, type: 'io', description: 'Failed to write a file' },\n { code: AutotelErrorCodes.E_READ_FAILED, type: 'io', description: 'Failed to read a file' },\n { code: AutotelErrorCodes.E_UNKNOWN, type: 'runtime', description: 'Unexpected error' },\n];\n","import { Command } from 'commander';\nimport type { InvestigateFlags } from './runtime';\nimport { runInvestigate } from './runtime';\nimport { addBackendFlags, backendFlagsFromOpts } from './cli-helpers';\n\nexport async function runHealth(flags: InvestigateFlags): Promise<void> {\n await runInvestigate('health', flags, async (backend) => {\n const [health, capabilities] = await Promise.all([\n backend.healthCheck(),\n Promise.resolve(backend.capabilities()),\n ]);\n return { ...health, signals: capabilities };\n });\n}\n\nexport async function runCapabilities(flags: InvestigateFlags): Promise<void> {\n await runInvestigate('capabilities', flags, async (backend) =>\n backend.capabilities(),\n );\n}\n\nexport function registerHealthCommands(program: Command): void {\n const healthCmd = new Command('health')\n .description('Backend health check + signal coverage (JSON)')\n .action(async function (this: Command) {\n await runHealth(backendFlagsFromOpts(this.opts()));\n });\n addBackendFlags(healthCmd);\n program.addCommand(healthCmd);\n\n const capabilitiesCmd = new Command('capabilities')\n .description('Which telemetry signals the active backend can serve (JSON)')\n .action(async function (this: Command) {\n await runCapabilities(backendFlagsFromOpts(this.opts()));\n });\n addBackendFlags(capabilitiesCmd);\n program.addCommand(capabilitiesCmd);\n}\n","import type { AppConfig, BackendHandle, TelemetryBackend } from 'autotel-mcp';\nimport { AutotelError } from '../../lib/errors';\nimport { configureJsonOutput, printJson } from '../../lib/json-output';\n\n/**\n * Common flags accepted by every `autotel investigate*` subcommand. Mirrors\n * the env vars autotel-mcp's `loadConfig()` consumes, so a user can pick a\n * backend with either CLI flags or the same env vars they'd use for the MCP\n * server. Flags win when both are set.\n */\nexport interface InvestigateFlags {\n backend?: AppConfig['backend'];\n jaegerBaseUrl?: string;\n tempoBaseUrl?: string;\n prometheusBaseUrl?: string;\n lokiBaseUrl?: string;\n collectorPort?: number;\n fixturePath?: string;\n outputFile?: string;\n noSecrets?: boolean;\n}\n\n/**\n * Apply CLI flags onto process.env before loadConfig() runs. autotel-mcp's\n * config is env-driven; this is the smallest seam that lets us override\n * without duplicating the schema in CLI-land.\n */\nfunction applyFlagsToEnv(flags: InvestigateFlags): void {\n if (flags.backend !== undefined) process.env.AUTOTEL_BACKEND = flags.backend;\n if (flags.jaegerBaseUrl !== undefined)\n process.env.JAEGER_BASE_URL = flags.jaegerBaseUrl;\n if (flags.tempoBaseUrl !== undefined)\n process.env.TEMPO_BASE_URL = flags.tempoBaseUrl;\n if (flags.prometheusBaseUrl !== undefined)\n process.env.PROMETHEUS_BASE_URL = flags.prometheusBaseUrl;\n if (flags.lokiBaseUrl !== undefined)\n process.env.LOKI_BASE_URL = flags.lokiBaseUrl;\n if (flags.collectorPort !== undefined)\n process.env.AUTOTEL_COLLECTOR_PORT = String(flags.collectorPort);\n if (flags.fixturePath !== undefined)\n process.env.AUTOTEL_FIXTURE_PATH = flags.fixturePath;\n}\n\n/**\n * Build a backend from CLI flags/env. Caller is responsible for calling\n * `handle.start()` / `handle.stop()` if the chosen backend needs lifecycle\n * (e.g. the collector OTLP receiver). Most read-only investigation calls\n * don't need start, so prefer `withBackend()` which handles it for you.\n */\nexport async function openBackend(\n flags: InvestigateFlags,\n): Promise<BackendHandle> {\n applyFlagsToEnv(flags);\n // Lazy import keeps autotel-mcp's heavy deps out of the cold-start path of\n // `autotel init` / `autotel doctor`. Only investigate commands pay the cost.\n const { loadConfig, createBackend } = await import('autotel-mcp');\n const config = loadConfig();\n return createBackend(config);\n}\n\n/**\n * Standard envelope for commands that don't need a backend (semconv,\n * instrumentation scoring, collector schema lookups — these talk to upstream\n * GitHub catalogs or operate on input only).\n */\nexport async function runStatic<T>(\n command: string,\n flags: Pick<InvestigateFlags, 'outputFile' | 'noSecrets'>,\n fn: () => Promise<T>,\n): Promise<void> {\n configureJsonOutput({\n outputFile: flags.outputFile,\n noSecrets: flags.noSecrets,\n });\n try {\n const data = await fn();\n printJson({ ok: true, command, data });\n } catch (error) {\n throw toInvestigateError(command, error);\n }\n}\n\n/**\n * Standard envelope around an investigate command: open backend, run the\n * caller's logic, print JSON, exit cleanly. Errors are converted to the\n * existing AutotelError envelope so the top-level handler in index.ts can\n * pick exit codes consistently.\n */\nexport async function runInvestigate<T>(\n command: string,\n flags: InvestigateFlags,\n fn: (backend: TelemetryBackend) => Promise<T>,\n): Promise<void> {\n configureJsonOutput({\n outputFile: flags.outputFile,\n noSecrets: flags.noSecrets,\n });\n\n let handle: BackendHandle | null = null;\n try {\n handle = await openBackend(flags);\n // Only start if the backend exposes lifecycle (collector listener).\n // Read-only backends (jaeger/tempo/prom/loki/fixture) have a no-op start.\n await handle.start();\n const data = await fn(handle.backend);\n printJson({ ok: true, command, data });\n } catch (error) {\n throw toInvestigateError(command, error);\n } finally {\n if (handle) {\n try {\n await handle.stop();\n } catch {\n // Stop failures shouldn't mask the original result.\n }\n }\n }\n}\n\nexport function toInvestigateError(command: string, error: unknown): AutotelError {\n if (error instanceof AutotelError) return error;\n // ZodError surfaces from `loadConfig()` (bad --backend value) and from any\n // shared query schema. Detect by shape (`error.issues` array) so we don't\n // need a runtime zod dependency in CLI-land.\n if (\n error !== null &&\n typeof error === 'object' &&\n 'issues' in error &&\n Array.isArray((error as { issues: unknown[] }).issues)\n ) {\n const issues = (error as { issues: Array<{ path?: unknown[]; message: string; code?: string; values?: unknown[] }> }).issues;\n const first = issues[0];\n const path = first?.path?.join('.') ?? '';\n return new AutotelError({\n type: 'validation',\n code: 'AUTOTEL_E_INVALID_INPUT',\n message: `autotel ${command}: invalid input${path ? ` for \"${path}\"` : ''} — ${first?.message ?? 'validation failed'}`,\n retryable: false,\n expected: { issues },\n });\n }\n const message = error instanceof Error ? error.message : String(error);\n return new AutotelError({\n type: 'runtime',\n code: 'AUTOTEL_E_UNKNOWN',\n message: `autotel ${command} failed: ${message}`,\n retryable: false,\n });\n}\n","import { Command } from 'commander';\nimport type { InvestigateFlags } from './runtime';\n\n/**\n * Shared commander wiring for investigate commands. Each command group's\n * file imports these and exports a `register*(program)` function that\n * does its own commander setup. cli.ts then just calls the registrars.\n */\n\nexport const intArg = (v: string): number => Number.parseInt(v, 10);\nexport const floatArg = (v: string): number => Number.parseFloat(v);\n\n/**\n * Backend-selection + JSON-output flags shared by every backend-touching\n * investigate command. Applied to a Command in place (mutates + returns).\n */\nexport function addBackendFlags(cmd: Command): Command {\n return cmd\n .option(\n '--backend <kind>',\n 'Backend: collector|jaeger|tempo|prometheus|loki|stack|auto|fixture (env: AUTOTEL_BACKEND)',\n )\n .option('--jaeger-base-url <url>', 'Jaeger base URL (env: JAEGER_BASE_URL)')\n .option('--tempo-base-url <url>', 'Tempo base URL (env: TEMPO_BASE_URL)')\n .option(\n '--prometheus-base-url <url>',\n 'Prometheus base URL (env: PROMETHEUS_BASE_URL)',\n )\n .option('--loki-base-url <url>', 'Loki base URL (env: LOKI_BASE_URL)')\n .option(\n '--collector-port <n>',\n 'OTLP receiver port for the collector backend',\n intArg,\n )\n .option('--fixture-path <path>', 'Fixture JSON for the fixture backend')\n .option('--output-file <path>', 'Persist JSON output to this file')\n .option('--no-secrets-in-output', 'Redact secret-shaped values');\n}\n\n/**\n * Smaller flag set for commands that don't need a backend (semconv,\n * instrumentation scoring, collector schema lookups).\n */\nexport function addStaticFlags(cmd: Command): Command {\n return cmd\n .option('--output-file <path>', 'Persist JSON output to this file')\n .option('--no-secrets-in-output', 'Redact secret-shaped values');\n}\n\nexport function backendFlagsFromOpts(opts: Record<string, unknown>): InvestigateFlags {\n return {\n backend: opts.backend as InvestigateFlags['backend'],\n jaegerBaseUrl: opts.jaegerBaseUrl as string | undefined,\n tempoBaseUrl: opts.tempoBaseUrl as string | undefined,\n prometheusBaseUrl: opts.prometheusBaseUrl as string | undefined,\n lokiBaseUrl: opts.lokiBaseUrl as string | undefined,\n collectorPort: opts.collectorPort as number | undefined,\n fixturePath: opts.fixturePath as string | undefined,\n outputFile: opts.outputFile as string | undefined,\n noSecrets: opts.secretsInOutput === false,\n };\n}\n\nexport function staticFlagsFromOpts(opts: Record<string, unknown>): InvestigateFlags {\n return {\n outputFile: opts.outputFile as string | undefined,\n noSecrets: opts.secretsInOutput === false,\n };\n}\n\n/**\n * Common time-window flags for trace/span/metric/log queries.\n */\nexport function addTimeWindowFlags(cmd: Command): Command {\n return cmd\n .option('--service-name <name>', 'Filter by service name')\n .option('--operation-name <name>', 'Filter by operation name')\n .option('--lookback-minutes <n>', 'Lookback window in minutes', intArg)\n .option('--from <iso>', 'Start time (ISO 8601)')\n .option('--to <iso>', 'End time (ISO 8601)')\n .option('--limit <n>', 'Max results', intArg);\n}\n","import { Command } from 'commander';\nimport {\n discoverServices,\n discoverTraceFields,\n discoverLogFields,\n type TelemetryBackend,\n} from 'autotel-mcp';\nimport { runInvestigate, type InvestigateFlags } from './runtime';\nimport {\n addBackendFlags,\n backendFlagsFromOpts,\n intArg,\n} from './cli-helpers';\n\nexport interface DiscoverServicesFlags extends InvestigateFlags {\n limitServices?: number;\n traceSample?: number;\n logSample?: number;\n metricSample?: number;\n}\n\nexport async function runDiscoverServices(\n flags: DiscoverServicesFlags,\n): Promise<void> {\n await runInvestigate('discover services', flags, async (backend) => {\n const limitServices = flags.limitServices ?? 100;\n const traceSample = flags.traceSample ?? 200;\n const logSample = flags.logSample ?? 200;\n const metricSample = flags.metricSample ?? 200;\n\n const caps = backend.capabilities();\n const servicesResult = await backend.listServices({ limit: limitServices });\n const services = servicesResult.services.slice(0, limitServices);\n\n const [traces, logs, metrics] = await Promise.all([\n caps.traces === 'available'\n ? backend.searchTraces({ limit: traceSample }).then((r) => r.items)\n : Promise.resolve([]),\n caps.logs === 'available'\n ? backend.searchLogs({ limit: logSample }).then((r) => r.items)\n : Promise.resolve([]),\n caps.metrics === 'available'\n ? backend.listMetrics({ limit: metricSample }).then((r) => r.items)\n : Promise.resolve([]),\n ]);\n\n const discovered = discoverServices({ services, traces, logs, metrics });\n return { count: discovered.length, services: discovered };\n });\n}\n\nexport interface DiscoverFieldsFlags extends InvestigateFlags {\n search?: string;\n sampleSize?: number;\n}\n\nexport async function runDiscoverTraceFields(\n flags: DiscoverFieldsFlags,\n): Promise<void> {\n await runInvestigate('discover trace-fields', flags, async (backend) => {\n return discoverFields(backend, flags, 'traces');\n });\n}\n\nexport async function runDiscoverLogFields(\n flags: DiscoverFieldsFlags,\n): Promise<void> {\n await runInvestigate('discover log-fields', flags, async (backend) => {\n return discoverFields(backend, flags, 'logs');\n });\n}\n\nasync function discoverFields(\n backend: TelemetryBackend,\n flags: DiscoverFieldsFlags,\n signal: 'traces' | 'logs',\n): Promise<unknown> {\n const sampleSize = flags.sampleSize ?? 200;\n if (signal === 'traces') {\n const traces = await backend\n .searchTraces({ limit: sampleSize })\n .then((r) => r.items);\n return {\n search: flags.search ?? null,\n sampleSize: traces.length,\n ...discoverTraceFields(traces, flags.search),\n };\n }\n const logs = await backend\n .searchLogs({ limit: sampleSize })\n .then((r) => r.items);\n return {\n search: flags.search ?? null,\n sampleSize: logs.length,\n ...discoverLogFields(logs, flags.search),\n };\n}\n\nexport function registerDiscoveryCommands(program: Command): void {\n const discoverCmd = new Command('discover').description(\n 'Discover services and field shapes from the active backend (JSON)',\n );\n const servicesCmd = new Command('services')\n .description('Discover services with cross-signal metadata')\n .option('--limit-services <n>', 'Max services', intArg)\n .option('--trace-sample <n>', 'Trace sample size', intArg)\n .option('--log-sample <n>', 'Log sample size', intArg)\n .option('--metric-sample <n>', 'Metric sample size', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runDiscoverServices({\n ...backendFlagsFromOpts(o),\n limitServices: o.limitServices as number | undefined,\n traceSample: o.traceSample as number | undefined,\n logSample: o.logSample as number | undefined,\n metricSample: o.metricSample as number | undefined,\n });\n });\n const traceFieldsCmd = new Command('trace-fields')\n .description('Discover trace/span field names from sampled traces')\n .option('--search <text>', 'Filter field names by substring')\n .option('--sample-size <n>', 'Trace sample size', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runDiscoverTraceFields({\n ...backendFlagsFromOpts(o),\n search: o.search as string | undefined,\n sampleSize: o.sampleSize as number | undefined,\n });\n });\n const logFieldsCmd = new Command('log-fields')\n .description('Discover log field names from sampled logs')\n .option('--search <text>', 'Filter field names by substring')\n .option('--sample-size <n>', 'Log sample size', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runDiscoverLogFields({\n ...backendFlagsFromOpts(o),\n search: o.search as string | undefined,\n sampleSize: o.sampleSize as number | undefined,\n });\n });\n addBackendFlags(discoverCmd);\n discoverCmd.addCommand(servicesCmd);\n discoverCmd.addCommand(traceFieldsCmd);\n discoverCmd.addCommand(logFieldsCmd);\n program.addCommand(discoverCmd);\n}\n","import { Command } from 'commander';\nimport {\n toTraceSearchQuery,\n toSpanSearchQuery,\n type TraceQueryInput,\n type SpanQueryInput,\n} from 'autotel-mcp';\nimport { runInvestigate, type InvestigateFlags } from './runtime';\nimport {\n addBackendFlags,\n addTimeWindowFlags,\n backendFlagsFromOpts,\n intArg,\n} from './cli-helpers';\nimport { runQueryMetrics, runQueryLogs } from './signals';\n\nexport type QueryTracesFlags = InvestigateFlags & TraceQueryInput;\nexport type QuerySpansFlags = InvestigateFlags & SpanQueryInput;\n\nexport async function runQueryTraces(flags: QueryTracesFlags): Promise<void> {\n await runInvestigate('query traces', flags, async (backend) =>\n backend.searchTraces(toTraceSearchQuery(flags)),\n );\n}\n\nexport async function runQuerySpans(flags: QuerySpansFlags): Promise<void> {\n await runInvestigate('query spans', flags, async (backend) =>\n backend.searchSpans(toSpanSearchQuery(flags)),\n );\n}\n\nexport async function runTraceGet(\n flags: InvestigateFlags & { traceId: string },\n): Promise<void> {\n await runInvestigate('trace get', flags, async (backend) =>\n backend.getTrace(flags.traceId),\n );\n}\n\nexport async function runTraceSummary(\n flags: InvestigateFlags & { traceId: string },\n): Promise<void> {\n await runInvestigate('trace summary', flags, async (backend) =>\n backend.summarizeTrace(flags.traceId),\n );\n}\n\nexport function registerQueryCommands(program: Command): void {\n const queryCmd = new Command('query').description(\n 'Query traces, spans, metrics, or logs (JSON)',\n );\n\n const tracesCmd = addTimeWindowFlags(new Command('traces'))\n .description('Search traces by service, op, status, tags, time, error')\n .option('--error-only', 'Only traces with errors')\n .option('--status-code <code>', 'OK | ERROR | UNSET')\n .option('--min-duration-ms <n>', 'Minimum duration', intArg)\n .option('--max-duration-ms <n>', 'Maximum duration', intArg)\n .option('--gen-ai-system <name>', 'gen_ai.system')\n .option('--gen-ai-request-model <name>', 'gen_ai.request.model')\n .option('--gen-ai-response-model <name>', 'gen_ai.response.model')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runQueryTraces({\n ...backendFlagsFromOpts(o),\n serviceName: o.serviceName as string | undefined,\n operationName: o.operationName as string | undefined,\n lookbackMinutes: o.lookbackMinutes as number | undefined,\n from: o.from as string | undefined,\n to: o.to as string | undefined,\n limit: o.limit as number | undefined,\n errorOnly: o.errorOnly as boolean | undefined,\n statusCode: o.statusCode as 'OK' | 'ERROR' | 'UNSET' | undefined,\n minDurationMs: o.minDurationMs as number | undefined,\n maxDurationMs: o.maxDurationMs as number | undefined,\n genAiSystem: o.genAiSystem as string | undefined,\n genAiRequestModel: o.genAiRequestModel as string | undefined,\n genAiResponseModel: o.genAiResponseModel as string | undefined,\n });\n });\n\n const spansCmd = addTimeWindowFlags(new Command('spans'))\n .description('Search individual spans by service/op/status/tags/duration')\n .option('--error-only', 'Only spans with errors')\n .option('--status-code <code>', 'OK | ERROR | UNSET')\n .option('--min-duration-ms <n>', 'Minimum span duration', intArg)\n .option('--max-duration-ms <n>', 'Maximum span duration', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runQuerySpans({\n ...backendFlagsFromOpts(o),\n serviceName: o.serviceName as string | undefined,\n operationName: o.operationName as string | undefined,\n lookbackMinutes: o.lookbackMinutes as number | undefined,\n from: o.from as string | undefined,\n to: o.to as string | undefined,\n limit: o.limit as number | undefined,\n errorOnly: o.errorOnly as boolean | undefined,\n statusCode: o.statusCode as 'OK' | 'ERROR' | 'UNSET' | undefined,\n minDurationMs: o.minDurationMs as number | undefined,\n maxDurationMs: o.maxDurationMs as number | undefined,\n });\n });\n\n const metricsCmd = addTimeWindowFlags(new Command('metrics'))\n .description('List metric series')\n .option('--metric-name <name>', 'Filter by metric name')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runQueryMetrics({\n ...backendFlagsFromOpts(o),\n metricName: o.metricName as string | undefined,\n serviceName: o.serviceName as string | undefined,\n lookbackMinutes: o.lookbackMinutes as number | undefined,\n from: o.from as string | undefined,\n to: o.to as string | undefined,\n limit: o.limit as number | undefined,\n });\n });\n\n const logsCmd = addTimeWindowFlags(new Command('logs'))\n .description('Search logs')\n .option('--trace-id <id>', 'Filter by trace id')\n .option('--span-id <id>', 'Filter by span id')\n .option('--severity-text <text>', 'Severity text')\n .option('--text <text>', 'Free-text search')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runQueryLogs({\n ...backendFlagsFromOpts(o),\n serviceName: o.serviceName as string | undefined,\n traceId: o.traceId as string | undefined,\n spanId: o.spanId as string | undefined,\n severityText: o.severityText as string | undefined,\n text: o.text as string | undefined,\n lookbackMinutes: o.lookbackMinutes as number | undefined,\n from: o.from as string | undefined,\n to: o.to as string | undefined,\n limit: o.limit as number | undefined,\n });\n });\n\n addBackendFlags(queryCmd);\n queryCmd.addCommand(tracesCmd);\n queryCmd.addCommand(spansCmd);\n queryCmd.addCommand(metricsCmd);\n queryCmd.addCommand(logsCmd);\n program.addCommand(queryCmd);\n}\n\nexport function registerTraceCommands(program: Command): void {\n const traceLookupCmd = new Command('trace').description(\n 'Trace lookup commands (JSON)',\n );\n const getCmd = new Command('get')\n .description('Get a trace by ID')\n .argument('<traceId>', 'Trace ID')\n .action(async function (this: Command, traceId: string) {\n await runTraceGet({\n ...backendFlagsFromOpts(this.optsWithGlobals()),\n traceId,\n });\n });\n const summaryCmd = new Command('summary')\n .description('Compact incident-friendly trace summary')\n .argument('<traceId>', 'Trace ID')\n .action(async function (this: Command, traceId: string) {\n await runTraceSummary({\n ...backendFlagsFromOpts(this.optsWithGlobals()),\n traceId,\n });\n });\n addBackendFlags(traceLookupCmd);\n traceLookupCmd.addCommand(getCmd);\n traceLookupCmd.addCommand(summaryCmd);\n program.addCommand(traceLookupCmd);\n}\n","import {\n toMetricSearchQuery,\n toLogSearchQuery,\n type MetricsQueryInput,\n type LogsQueryInput,\n} from 'autotel-mcp';\nimport { runInvestigate, type InvestigateFlags } from './runtime';\n\nexport type QueryMetricsFlags = InvestigateFlags & MetricsQueryInput;\nexport type QueryLogsFlags = InvestigateFlags & LogsQueryInput;\n\nexport async function runQueryMetrics(flags: QueryMetricsFlags): Promise<void> {\n await runInvestigate('query metrics', flags, async (backend) =>\n backend.listMetrics(toMetricSearchQuery(flags)),\n );\n}\n\nexport async function runQueryLogs(flags: QueryLogsFlags): Promise<void> {\n await runInvestigate('query logs', flags, async (backend) =>\n backend.searchLogs(toLogSearchQuery(flags)),\n );\n}\n","import { Command } from 'commander';\nimport { runInvestigate, type InvestigateFlags } from './runtime';\nimport {\n addBackendFlags,\n backendFlagsFromOpts,\n intArg,\n} from './cli-helpers';\n\nexport async function runListServices(flags: InvestigateFlags): Promise<void> {\n await runInvestigate('topology services', flags, async (backend) =>\n backend.listServices(),\n );\n}\n\nexport async function runListOperations(\n flags: InvestigateFlags & { serviceName: string },\n): Promise<void> {\n await runInvestigate('topology operations', flags, async (backend) =>\n backend.listOperations(flags.serviceName),\n );\n}\n\nexport async function runServiceMap(\n flags: InvestigateFlags & { lookbackMinutes?: number; limit?: number },\n): Promise<void> {\n await runInvestigate('topology map', flags, async (backend) =>\n backend.serviceMap(flags.lookbackMinutes ?? 60, flags.limit ?? 20),\n );\n}\n\nexport function registerTopologyCommands(program: Command): void {\n const topologyCmd = new Command('topology').description(\n 'Service topology commands (JSON)',\n );\n const servicesCmd = new Command('services')\n .description('List known services')\n .action(async function (this: Command) {\n await runListServices(backendFlagsFromOpts(this.optsWithGlobals()));\n });\n const operationsCmd = new Command('operations')\n .description('List operations for a service')\n .argument('<serviceName>', 'Service name')\n .action(async function (this: Command, serviceName: string) {\n await runListOperations({\n ...backendFlagsFromOpts(this.optsWithGlobals()),\n serviceName,\n });\n });\n const mapCmd = new Command('map')\n .description('Build a service dependency map')\n .option('--lookback-minutes <n>', 'Lookback in minutes', intArg)\n .option('--limit <n>', 'Max services', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runServiceMap({\n ...backendFlagsFromOpts(o),\n lookbackMinutes: o.lookbackMinutes as number | undefined,\n limit: o.limit as number | undefined,\n });\n });\n addBackendFlags(topologyCmd);\n topologyCmd.addCommand(servicesCmd);\n topologyCmd.addCommand(operationsCmd);\n topologyCmd.addCommand(mapCmd);\n program.addCommand(topologyCmd);\n}\n","import { Command } from 'commander';\nimport {\n detectAnomalies,\n findRootCause,\n pickErrorMessage,\n} from 'autotel-mcp';\nimport { runInvestigate, type InvestigateFlags } from './runtime';\nimport {\n addBackendFlags,\n backendFlagsFromOpts,\n floatArg,\n intArg,\n} from './cli-helpers';\n\nexport interface AnomaliesFlags extends InvestigateFlags {\n service?: string;\n operation?: string;\n lookbackMinutes?: number;\n}\n\nexport async function runDiagnoseAnomalies(\n flags: AnomaliesFlags,\n): Promise<void> {\n await runInvestigate('diagnose anomalies', flags, async (backend) => {\n const lookback = flags.lookbackMinutes ?? 60;\n const nowMs = Date.now();\n const result = await backend.searchTraces({\n service: flags.service,\n startTimeUnixMs: nowMs - lookback * 60 * 1000,\n endTimeUnixMs: nowMs,\n limit: 100,\n });\n return detectAnomalies(result.items, {\n service: flags.service,\n operation: flags.operation,\n });\n });\n}\n\nexport async function runDiagnoseRootCause(\n flags: InvestigateFlags & { traceId: string },\n): Promise<void> {\n await runInvestigate('diagnose root-cause', flags, async (backend) => {\n const trace = await backend.getTrace(flags.traceId);\n if (!trace) return { error: `Trace not found: ${flags.traceId}` };\n return findRootCause(trace);\n });\n}\n\nexport interface DiagnoseErrorsFlags extends InvestigateFlags {\n service?: string;\n lookbackMinutes?: number;\n limit?: number;\n}\n\nexport async function runDiagnoseErrors(\n flags: DiagnoseErrorsFlags,\n): Promise<void> {\n await runInvestigate('diagnose errors', flags, async (backend) => {\n const lookback = flags.lookbackMinutes ?? 60;\n const limit = flags.limit ?? 20;\n const nowMs = Date.now();\n const result = await backend.searchTraces({\n service: flags.service,\n hasError: true,\n startTimeUnixMs: nowMs - lookback * 60 * 1000,\n endTimeUnixMs: nowMs,\n limit,\n });\n\n const groups = new Map<\n string,\n {\n service: string;\n operation: string;\n count: number;\n errorMessages: string[];\n traceIds: string[];\n }\n >();\n\n for (const trace of result.items) {\n for (const span of trace.spans) {\n if (!span.hasError) continue;\n if (flags.service && span.serviceName !== flags.service) continue;\n\n const key = `${span.serviceName}::${span.operationName}`;\n if (!groups.has(key)) {\n groups.set(key, {\n service: span.serviceName,\n operation: span.operationName,\n count: 0,\n errorMessages: [],\n traceIds: [],\n });\n }\n const group = groups.get(key)!;\n group.count++;\n\n const msg = pickErrorMessage(span.tags);\n if (msg && !group.errorMessages.includes(msg)) {\n group.errorMessages.push(msg);\n }\n if (!group.traceIds.includes(trace.traceId)) {\n group.traceIds.push(trace.traceId);\n }\n }\n }\n\n return {\n totalTraces: result.totalCount,\n groups: [...groups.values()].toSorted((a, b) => b.count - a.count),\n };\n });\n}\n\nexport interface DiagnoseSlosFlags extends InvestigateFlags {\n service: string;\n p99LatencyMs?: number;\n maxErrorRate?: number;\n lookbackMinutes?: number;\n}\n\nexport async function runDiagnoseSlos(flags: DiagnoseSlosFlags): Promise<void> {\n await runInvestigate('diagnose slos', flags, async (backend) => {\n const lookback = flags.lookbackMinutes ?? 60;\n const nowMs = Date.now();\n const result = await backend.searchTraces({\n service: flags.service,\n startTimeUnixMs: nowMs - lookback * 60 * 1000,\n endTimeUnixMs: nowMs,\n limit: 100,\n });\n\n const spans = result.items.flatMap((t) =>\n t.spans.filter((s) => s.serviceName === flags.service),\n );\n\n const violations: Array<{\n type: string;\n target: number;\n actual: number;\n description: string;\n }> = [];\n\n if (spans.length === 0) {\n return {\n service: flags.service,\n totalSpans: 0,\n violations,\n message: 'No spans found for the given service and time window.',\n };\n }\n\n const durations = spans\n .map((s) => s.durationMs)\n .toSorted((a, b) => a - b);\n const p99Index = Math.floor(durations.length * 0.99);\n const actualP99 = durations[Math.min(p99Index, durations.length - 1)];\n\n if (flags.p99LatencyMs !== undefined && actualP99 > flags.p99LatencyMs) {\n violations.push({\n type: 'p99_latency',\n target: flags.p99LatencyMs,\n actual: actualP99,\n description: `p99 latency ${actualP99.toFixed(1)}ms exceeds target ${flags.p99LatencyMs}ms`,\n });\n }\n\n const errorCount = spans.filter((s) => s.hasError).length;\n const actualErrorRate = errorCount / spans.length;\n\n if (flags.maxErrorRate !== undefined && actualErrorRate > flags.maxErrorRate) {\n violations.push({\n type: 'error_rate',\n target: flags.maxErrorRate,\n actual: actualErrorRate,\n description: `Error rate ${(actualErrorRate * 100).toFixed(2)}% exceeds target ${(flags.maxErrorRate * 100).toFixed(2)}%`,\n });\n }\n\n return {\n service: flags.service,\n totalSpans: spans.length,\n p99LatencyMs: actualP99,\n errorRate: actualErrorRate,\n violations,\n };\n });\n}\n\nexport function registerDiagnoseCommands(program: Command): void {\n const diagnoseCmd = new Command('diagnose').description(\n 'Anomaly / root-cause / errors / SLO diagnosis (JSON)',\n );\n const anomaliesCmd = new Command('anomalies')\n .description('Detect latency/error-rate outliers')\n .option('--service <name>', 'Service filter')\n .option('--operation <name>', 'Operation filter')\n .option('--lookback-minutes <n>', 'Lookback in minutes', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runDiagnoseAnomalies({\n ...backendFlagsFromOpts(o),\n service: o.service as string | undefined,\n operation: o.operation as string | undefined,\n lookbackMinutes: o.lookbackMinutes as number | undefined,\n });\n });\n const rootCauseCmd = new Command('root-cause')\n .description('Walk a trace tree to identify the bottleneck span')\n .argument('<traceId>', 'Trace ID')\n .action(async function (this: Command, traceId: string) {\n await runDiagnoseRootCause({\n ...backendFlagsFromOpts(this.optsWithGlobals()),\n traceId,\n });\n });\n const errorsCmd = new Command('errors')\n .description('Aggregate error spans by service/operation')\n .option('--service <name>', 'Service filter')\n .option('--lookback-minutes <n>', 'Lookback in minutes', intArg)\n .option('--limit <n>', 'Max traces to scan', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runDiagnoseErrors({\n ...backendFlagsFromOpts(o),\n service: o.service as string | undefined,\n lookbackMinutes: o.lookbackMinutes as number | undefined,\n limit: o.limit as number | undefined,\n });\n });\n const slosCmd = new Command('slos')\n .description('Report SLO violations for a service')\n .requiredOption('--service <name>', 'Service to check')\n .option('--p99-latency-ms <n>', 'p99 latency target', floatArg)\n .option('--max-error-rate <n>', 'Error-rate target (0..1)', floatArg)\n .option('--lookback-minutes <n>', 'Lookback in minutes', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runDiagnoseSlos({\n ...backendFlagsFromOpts(o),\n service: o.service as string,\n p99LatencyMs: o.p99LatencyMs as number | undefined,\n maxErrorRate: o.maxErrorRate as number | undefined,\n lookbackMinutes: o.lookbackMinutes as number | undefined,\n });\n });\n addBackendFlags(diagnoseCmd);\n diagnoseCmd.addCommand(anomaliesCmd);\n diagnoseCmd.addCommand(rootCauseCmd);\n diagnoseCmd.addCommand(errorsCmd);\n diagnoseCmd.addCommand(slosCmd);\n program.addCommand(diagnoseCmd);\n}\n","import { Command } from 'commander';\nimport { detectAnomalies, findRootCause } from 'autotel-mcp';\nimport { runInvestigate, type InvestigateFlags } from './runtime';\nimport {\n addBackendFlags,\n backendFlagsFromOpts,\n intArg,\n} from './cli-helpers';\n\nexport async function runCorrelate(\n flags: InvestigateFlags & { traceId: string },\n): Promise<void> {\n await runInvestigate('correlate trace', flags, async (backend) =>\n backend.getCorrelatedSignals(flags.traceId),\n );\n}\n\nexport async function runExplainSlowdown(\n flags: InvestigateFlags & { service: string; lookbackMinutes?: number },\n): Promise<void> {\n await runInvestigate('correlate explain-slowdown', flags, async (backend) => {\n const lookback = flags.lookbackMinutes ?? 60;\n const nowMs = Date.now();\n const result = await backend.searchTraces({\n service: flags.service,\n startTimeUnixMs: nowMs - lookback * 60 * 1000,\n endTimeUnixMs: nowMs,\n limit: 100,\n });\n\n const anomalies = detectAnomalies(result.items, { service: flags.service });\n\n const findings = await Promise.all(\n anomalies.map(async (anomaly) => {\n const sampleTraceId = anomaly.affectedTraceIds[0];\n if (!sampleTraceId) {\n return { anomaly, rootCause: null, correlatedSignals: null };\n }\n const trace = await backend.getTrace(sampleTraceId);\n const rootCause = trace ? findRootCause(trace) : null;\n const correlatedSignals =\n await backend.getCorrelatedSignals(sampleTraceId);\n return { anomaly, rootCause, correlatedSignals };\n }),\n );\n\n return {\n service: flags.service,\n lookbackMinutes: lookback,\n anomalyCount: anomalies.length,\n findings,\n };\n });\n}\n\nexport function registerCorrelateCommands(program: Command): void {\n const correlateCmd = new Command('correlate').description(\n 'Cross-signal correlation (JSON)',\n );\n const traceCmd = new Command('trace')\n .description('Trace + metrics + correlated logs for a trace ID')\n .argument('<traceId>', 'Trace ID')\n .action(async function (this: Command, traceId: string) {\n await runCorrelate({\n ...backendFlagsFromOpts(this.optsWithGlobals()),\n traceId,\n });\n });\n const slowdownCmd = new Command('explain-slowdown')\n .description('Identify when/why a service degraded')\n .requiredOption('--service <name>', 'Service name')\n .option('--lookback-minutes <n>', 'Lookback in minutes', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runExplainSlowdown({\n ...backendFlagsFromOpts(o),\n service: o.service as string,\n lookbackMinutes: o.lookbackMinutes as number | undefined,\n });\n });\n addBackendFlags(correlateCmd);\n correlateCmd.addCommand(traceCmd);\n correlateCmd.addCommand(slowdownCmd);\n program.addCommand(correlateCmd);\n}\n","import {\n collectUsage,\n listModels,\n getModelStats,\n rankExpensiveTraces,\n rankSlowTraces,\n listToolUsage,\n toTraceSearchQuery,\n type TelemetryBackend,\n type TraceRecord,\n} from 'autotel-mcp';\nimport { Command } from 'commander';\nimport { runInvestigate, type InvestigateFlags } from './runtime';\nimport {\n addBackendFlags,\n backendFlagsFromOpts,\n intArg,\n} from './cli-helpers';\n\nexport interface LlmAnalyticsFlags extends InvestigateFlags {\n startTime?: string;\n endTime?: string;\n serviceName?: string;\n genAiSystem?: string;\n genAiRequestModel?: string;\n genAiResponseModel?: string;\n limit?: number;\n}\n\nfunction parseDateToUnixMs(value?: string): number | undefined {\n if (!value) return undefined;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nasync function collectTracesForAnalytics(\n backend: TelemetryBackend,\n input: LlmAnalyticsFlags,\n): Promise<TraceRecord[]> {\n const result = await backend.searchTraces(\n toTraceSearchQuery({\n serviceName: input.serviceName,\n genAiSystem: input.genAiSystem,\n genAiRequestModel: input.genAiRequestModel,\n genAiResponseModel: input.genAiResponseModel,\n limit: input.limit ?? 1000,\n }),\n );\n\n let filtered = result.items;\n const startUnixMs = parseDateToUnixMs(input.startTime);\n const endUnixMs = parseDateToUnixMs(input.endTime);\n if (startUnixMs !== undefined) {\n filtered = filtered.filter((trace) =>\n trace.spans.some((span) => span.startTimeUnixMs >= startUnixMs),\n );\n }\n if (endUnixMs !== undefined) {\n filtered = filtered.filter((trace) =>\n trace.spans.some((span) => span.startTimeUnixMs <= endUnixMs),\n );\n }\n return filtered;\n}\n\nexport async function runLlmUsage(flags: LlmAnalyticsFlags): Promise<void> {\n await runInvestigate('llm usage', flags, async (backend) => {\n const traces = await collectTracesForAnalytics(backend, flags);\n const report = collectUsage(traces);\n return {\n period: {\n startTime: flags.startTime ?? null,\n endTime: flags.endTime ?? null,\n },\n filters: {\n serviceName: flags.serviceName ?? null,\n genAiSystem: flags.genAiSystem ?? null,\n genAiRequestModel: flags.genAiRequestModel ?? null,\n genAiResponseModel: flags.genAiResponseModel ?? null,\n },\n summary: {\n totalRequests: report.totalRequests,\n totalPromptTokens: report.totalPromptTokens,\n totalCompletionTokens: report.totalCompletionTokens,\n totalTokens: report.totalTokens,\n totalCostUsd: report.totalCostUsd,\n unpricedRequests: report.unpricedRequests,\n },\n byModel: report.byModel,\n byService: report.byService,\n };\n });\n}\n\nexport async function runLlmModels(flags: LlmAnalyticsFlags): Promise<void> {\n await runInvestigate('llm models', flags, async (backend) => {\n const traces = await collectTracesForAnalytics(backend, flags);\n const models = listModels(traces).slice(0, flags.limit ?? 1000);\n return { count: models.length, models };\n });\n}\n\nexport async function runLlmModelStats(\n flags: LlmAnalyticsFlags & { modelName: string },\n): Promise<void> {\n await runInvestigate('llm model-stats', flags, async (backend) => {\n const traces = await collectTracesForAnalytics(backend, flags);\n const stats = getModelStats(traces, flags.modelName);\n if (!stats) {\n return {\n error: `No traces found for model '${flags.modelName}' in the specified time range`,\n };\n }\n return stats;\n });\n}\n\nexport async function runLlmExpensive(\n flags: LlmAnalyticsFlags & { minTokens?: number },\n): Promise<void> {\n await runInvestigate('llm expensive', flags, async (backend) => {\n const traces = await collectTracesForAnalytics(backend, flags);\n let ranked = rankExpensiveTraces(traces);\n if (flags.minTokens !== undefined) {\n ranked = ranked.filter((t) => t.tokens.total >= flags.minTokens!);\n }\n ranked = ranked.slice(0, flags.limit ?? 10);\n return { count: ranked.length, traces: ranked };\n });\n}\n\nexport async function runLlmSlow(\n flags: LlmAnalyticsFlags & { minDurationMs?: number },\n): Promise<void> {\n await runInvestigate('llm slow', flags, async (backend) => {\n const traces = await collectTracesForAnalytics(backend, flags);\n let ranked = rankSlowTraces(traces);\n if (flags.minDurationMs !== undefined) {\n ranked = ranked.filter((t) => t.durationMs >= flags.minDurationMs!);\n }\n ranked = ranked.slice(0, flags.limit ?? 10);\n return { count: ranked.length, traces: ranked };\n });\n}\n\nexport async function runLlmTools(flags: LlmAnalyticsFlags): Promise<void> {\n await runInvestigate('llm tools', flags, async (backend) => {\n const traces = await collectTracesForAnalytics(backend, flags);\n const tools = listToolUsage(traces).slice(0, flags.limit ?? 1000);\n return {\n count: tools.length,\n totalCalls: tools.reduce((sum, t) => sum + t.usageCount, 0),\n tools,\n };\n });\n}\n\nexport function registerLlmCommands(program: Command): void {\n const llmCmd = new Command('llm').description(\n 'LLM analytics (cost, models, expensive/slow traces, tools)',\n );\n const commonOpts = (cmd: Command): Command =>\n cmd\n .option('--start-time <iso>', 'Start of window (ISO 8601)')\n .option('--end-time <iso>', 'End of window (ISO 8601)')\n .option('--service-name <name>', 'Service filter')\n .option('--gen-ai-system <name>', 'gen_ai.system filter')\n .option('--gen-ai-request-model <name>', 'gen_ai.request.model filter')\n .option('--gen-ai-response-model <name>', 'gen_ai.response.model filter')\n .option('--limit <n>', 'Max results', intArg);\n\n const usageCmd = commonOpts(new Command('usage'))\n .description('Aggregate token usage by model and service')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runLlmUsage({\n ...backendFlagsFromOpts(o),\n startTime: o.startTime as string | undefined,\n endTime: o.endTime as string | undefined,\n serviceName: o.serviceName as string | undefined,\n genAiSystem: o.genAiSystem as string | undefined,\n genAiRequestModel: o.genAiRequestModel as string | undefined,\n genAiResponseModel: o.genAiResponseModel as string | undefined,\n limit: o.limit as number | undefined,\n });\n });\n\n const modelsCmd = commonOpts(new Command('models'))\n .description('Discover LLM models in use')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runLlmModels({\n ...backendFlagsFromOpts(o),\n startTime: o.startTime as string | undefined,\n endTime: o.endTime as string | undefined,\n serviceName: o.serviceName as string | undefined,\n genAiSystem: o.genAiSystem as string | undefined,\n limit: o.limit as number | undefined,\n });\n });\n\n const modelStatsCmd = commonOpts(new Command('model-stats'))\n .description('Latency/token/error stats for one LLM model')\n .requiredOption('--model-name <name>', 'Model to inspect')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runLlmModelStats({\n ...backendFlagsFromOpts(o),\n modelName: o.modelName as string,\n startTime: o.startTime as string | undefined,\n endTime: o.endTime as string | undefined,\n serviceName: o.serviceName as string | undefined,\n });\n });\n\n const expensiveCmd = commonOpts(new Command('expensive'))\n .description('Traces with highest total LLM token usage')\n .option('--min-tokens <n>', 'Minimum token threshold', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runLlmExpensive({\n ...backendFlagsFromOpts(o),\n startTime: o.startTime as string | undefined,\n endTime: o.endTime as string | undefined,\n serviceName: o.serviceName as string | undefined,\n genAiRequestModel: o.genAiRequestModel as string | undefined,\n genAiResponseModel: o.genAiResponseModel as string | undefined,\n minTokens: o.minTokens as number | undefined,\n limit: o.limit as number | undefined,\n });\n });\n\n const slowCmd = commonOpts(new Command('slow'))\n .description('Slowest traces that include LLM spans')\n .option('--min-duration-ms <n>', 'Minimum duration', intArg)\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runLlmSlow({\n ...backendFlagsFromOpts(o),\n startTime: o.startTime as string | undefined,\n endTime: o.endTime as string | undefined,\n serviceName: o.serviceName as string | undefined,\n genAiRequestModel: o.genAiRequestModel as string | undefined,\n genAiResponseModel: o.genAiResponseModel as string | undefined,\n minDurationMs: o.minDurationMs as number | undefined,\n limit: o.limit as number | undefined,\n });\n });\n\n const toolsCmd = commonOpts(new Command('tools'))\n .description('Discover tool/function spans grouped by tool name')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runLlmTools({\n ...backendFlagsFromOpts(o),\n startTime: o.startTime as string | undefined,\n endTime: o.endTime as string | undefined,\n serviceName: o.serviceName as string | undefined,\n genAiSystem: o.genAiSystem as string | undefined,\n limit: o.limit as number | undefined,\n });\n });\n\n addBackendFlags(llmCmd);\n llmCmd.addCommand(usageCmd);\n llmCmd.addCommand(modelsCmd);\n llmCmd.addCommand(modelStatsCmd);\n llmCmd.addCommand(expensiveCmd);\n llmCmd.addCommand(slowCmd);\n llmCmd.addCommand(toolsCmd);\n program.addCommand(llmCmd);\n}\n","import {\n clearSemanticConventionCache,\n getSemanticConventionNamespace,\n listSemanticConventionNamespaces,\n} from 'autotel-mcp';\nimport { Command } from 'commander';\nimport { runStatic, type InvestigateFlags } from './runtime';\nimport { addStaticFlags, staticFlagsFromOpts } from './cli-helpers';\n\nexport async function runSemconvList(flags: InvestigateFlags): Promise<void> {\n await runStatic('semconv list', flags, async () => ({\n namespaces: await listSemanticConventionNamespaces(),\n }));\n}\n\nexport async function runSemconvGet(\n flags: InvestigateFlags & { namespace: string },\n): Promise<void> {\n await runStatic('semconv get', flags, async () =>\n getSemanticConventionNamespace(flags.namespace),\n );\n}\n\nexport async function runSemconvRefresh(\n flags: InvestigateFlags,\n): Promise<void> {\n await runStatic('semconv refresh', flags, async () => {\n clearSemanticConventionCache();\n return { cleared: true };\n });\n}\n\nexport function registerSemconvCommands(program: Command): void {\n const semconvCmd = new Command('semconv').description(\n 'OpenTelemetry semantic conventions lookup (JSON)',\n );\n const listCmd = addStaticFlags(new Command('list'))\n .description('List semconv namespaces')\n .action(async function (this: Command) {\n await runSemconvList(staticFlagsFromOpts(this.optsWithGlobals()));\n });\n const getCmd = addStaticFlags(new Command('get'))\n .description('Get groups for one namespace')\n .argument('<namespace>', 'Namespace (e.g. http, rpc, database)')\n .action(async function (this: Command, namespace: string) {\n await runSemconvGet({\n ...staticFlagsFromOpts(this.optsWithGlobals()),\n namespace,\n });\n });\n const refreshCmd = addStaticFlags(new Command('refresh'))\n .description('Clear semconv cache')\n .action(async function (this: Command) {\n await runSemconvRefresh(staticFlagsFromOpts(this.optsWithGlobals()));\n });\n semconvCmd.addCommand(listCmd);\n semconvCmd.addCommand(getCmd);\n semconvCmd.addCommand(refreshCmd);\n program.addCommand(semconvCmd);\n}\n","import {\n scoreSpan,\n suggestInstrumentationFixes,\n buildInstrumentationGuide,\n} from 'autotel-mcp';\nimport { Command } from 'commander';\nimport { runStatic, type InvestigateFlags } from './runtime';\nimport { addStaticFlags, staticFlagsFromOpts } from './cli-helpers';\nimport { AutotelError } from '../../lib/errors';\nimport * as fs from 'node:fs';\n\ninterface SpanInput {\n operationName: string;\n serviceName: string;\n tags: Record<string, string | number | boolean>;\n hasError: boolean;\n}\n\nfunction readSpanFromStdinOrFile(spanFile?: string): SpanInput {\n let raw: string;\n if (spanFile) {\n raw = fs.readFileSync(spanFile, 'utf8');\n } else {\n raw = fs.readFileSync(0, 'utf8');\n }\n const parsed = JSON.parse(raw) as Partial<SpanInput>;\n if (\n typeof parsed.operationName !== 'string' ||\n typeof parsed.serviceName !== 'string' ||\n typeof parsed.tags !== 'object' ||\n typeof parsed.hasError !== 'boolean'\n ) {\n throw new AutotelError({\n type: 'validation',\n code: 'AUTOTEL_E_INVALID_INPUT',\n message:\n 'score expects JSON with operationName, serviceName, tags, hasError',\n retryable: false,\n expected: {\n shape: {\n operationName: 'string',\n serviceName: 'string',\n tags: 'Record<string, string | number | boolean>',\n hasError: 'boolean',\n },\n },\n });\n }\n return parsed as SpanInput;\n}\n\nexport async function runScoreSpan(\n flags: InvestigateFlags & { spanFile?: string },\n): Promise<void> {\n await runStatic('score', flags, async () => {\n const span = readSpanFromStdinOrFile(flags.spanFile);\n const result = scoreSpan(span);\n const suggestions = suggestInstrumentationFixes(span);\n return { ...result, suggestions };\n });\n}\n\nexport async function runScoreExplain(flags: InvestigateFlags): Promise<void> {\n await runStatic('score explain', flags, async () => ({\n guide: buildInstrumentationGuide(),\n }));\n}\n\nexport function registerScoreCommands(program: Command): void {\n const scoreCmd = addStaticFlags(new Command('score'))\n .description('Score a span for instrumentation quality (JSON)')\n .option('--span-file <path>', 'Read span JSON from file (default: stdin)')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runScoreSpan({\n ...staticFlagsFromOpts(o),\n spanFile: o.spanFile as string | undefined,\n });\n });\n const explainCmd = addStaticFlags(new Command('explain'))\n .description('Explain the instrumentation scoring rubric')\n .action(async function (this: Command) {\n await runScoreExplain(staticFlagsFromOpts(this.optsWithGlobals()));\n });\n scoreCmd.addCommand(explainCmd);\n program.addCommand(scoreCmd);\n}\n","import {\n validateOtlpReceiverConfig,\n suggestCollectorConfig,\n buildCollectorGuide,\n listCollectorVersions,\n listCollectorComponents,\n getCollectorComponentSchema,\n getCollectorComponentReadme,\n validateCollectorComponentConfig,\n refreshCollectorCatalog,\n resolveCollectorVersion,\n} from 'autotel-mcp';\nimport { Command } from 'commander';\nimport { runStatic, type InvestigateFlags } from './runtime';\nimport { addStaticFlags, staticFlagsFromOpts } from './cli-helpers';\nimport { AutotelError } from '../../lib/errors';\nimport * as fs from 'node:fs';\n\ntype ComponentKind =\n | 'receiver'\n | 'processor'\n | 'exporter'\n | 'connector'\n | 'extension';\n\nfunction readJsonFromStdinOrFile(file?: string): unknown {\n const raw = file ? fs.readFileSync(file, 'utf8') : fs.readFileSync(0, 'utf8');\n return JSON.parse(raw);\n}\n\nfunction assertVersion(version: string | undefined): void {\n if (version === undefined) return;\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(version)) {\n throw new AutotelError({\n type: 'validation',\n code: 'AUTOTEL_E_INVALID_INPUT',\n message: `--version must be semver (got \"${version}\")`,\n retryable: false,\n });\n }\n}\n\nexport async function runCollectorValidate(\n flags: InvestigateFlags & { configFile?: string },\n): Promise<void> {\n await runStatic('collector validate', flags, async () => {\n const config = readJsonFromStdinOrFile(flags.configFile);\n return validateOtlpReceiverConfig(config);\n });\n}\n\nexport async function runCollectorSuggest(\n flags: InvestigateFlags,\n): Promise<void> {\n await runStatic('collector suggest', flags, async () => ({\n suggestion: suggestCollectorConfig(),\n }));\n}\n\nexport async function runCollectorExplain(\n flags: InvestigateFlags,\n): Promise<void> {\n await runStatic('collector explain', flags, async () => ({\n guide: buildCollectorGuide(),\n }));\n}\n\nexport async function runCollectorVersions(\n flags: InvestigateFlags,\n): Promise<void> {\n await runStatic('collector versions', flags, async () => ({\n versions: await listCollectorVersions(),\n }));\n}\n\nexport async function runCollectorComponents(\n flags: InvestigateFlags & { version?: string; kind?: ComponentKind },\n): Promise<void> {\n await runStatic('collector components', flags, async () => {\n assertVersion(flags.version);\n const resolvedVersion = await resolveCollectorVersion(flags.version);\n const components = await listCollectorComponents(resolvedVersion);\n if (flags.kind) {\n return {\n version: resolvedVersion,\n kind: flags.kind,\n components: components[flags.kind],\n };\n }\n return { version: resolvedVersion, components };\n });\n}\n\nexport async function runCollectorSchema(\n flags: InvestigateFlags & {\n version?: string;\n kind: ComponentKind;\n name: string;\n },\n): Promise<void> {\n await runStatic('collector schema', flags, async () => {\n assertVersion(flags.version);\n const resolvedVersion = await resolveCollectorVersion(flags.version);\n const schema = await getCollectorComponentSchema(\n flags.kind,\n flags.name,\n resolvedVersion,\n );\n return { version: resolvedVersion, kind: flags.kind, name: flags.name, schema };\n });\n}\n\nexport async function runCollectorReadme(\n flags: InvestigateFlags & {\n version?: string;\n kind: ComponentKind;\n name: string;\n },\n): Promise<void> {\n await runStatic('collector readme', flags, async () => {\n assertVersion(flags.version);\n const resolvedVersion = await resolveCollectorVersion(flags.version);\n const readme = await getCollectorComponentReadme(\n flags.kind,\n flags.name,\n resolvedVersion,\n );\n return { version: resolvedVersion, kind: flags.kind, name: flags.name, readme };\n });\n}\n\nexport async function runCollectorValidateComponent(\n flags: InvestigateFlags & {\n version?: string;\n kind: ComponentKind;\n name: string;\n configFile?: string;\n },\n): Promise<void> {\n await runStatic('collector validate-component', flags, async () => {\n assertVersion(flags.version);\n const resolvedVersion = await resolveCollectorVersion(flags.version);\n const config = readJsonFromStdinOrFile(flags.configFile);\n const result = await validateCollectorComponentConfig({\n kind: flags.kind,\n name: flags.name,\n version: resolvedVersion,\n config,\n });\n return { version: resolvedVersion, kind: flags.kind, name: flags.name, ...result };\n });\n}\n\nexport async function runCollectorRefresh(\n flags: InvestigateFlags,\n): Promise<void> {\n await runStatic('collector refresh', flags, async () =>\n refreshCollectorCatalog(),\n );\n}\n\nexport function registerCollectorCommands(program: Command): void {\n const collectorCmd = new Command('collector').description(\n 'OpenTelemetry Collector config + schema commands (JSON)',\n );\n const validateCmd = addStaticFlags(new Command('validate'))\n .description('Validate an OTLP receiver config fragment')\n .option('--config-file <path>', 'Read JSON config (default: stdin)')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runCollectorValidate({\n ...staticFlagsFromOpts(o),\n configFile: o.configFile as string | undefined,\n });\n });\n const suggestCmd = addStaticFlags(new Command('suggest'))\n .description('Print a minimal OTLP receiver config')\n .action(async function (this: Command) {\n await runCollectorSuggest(staticFlagsFromOpts(this.optsWithGlobals()));\n });\n const explainCmd = addStaticFlags(new Command('explain'))\n .description('Explain OTLP receiver config shape + defaults')\n .action(async function (this: Command) {\n await runCollectorExplain(staticFlagsFromOpts(this.optsWithGlobals()));\n });\n const versionsCmd = addStaticFlags(new Command('versions'))\n .description('List supported collector schema versions')\n .action(async function (this: Command) {\n await runCollectorVersions(staticFlagsFromOpts(this.optsWithGlobals()));\n });\n const componentsCmd = addStaticFlags(new Command('components'))\n .description('List components for a version (optionally filter by kind)')\n .option('--version <semver>', 'Collector version (e.g. 0.110.0)')\n .option(\n '--kind <kind>',\n 'receiver | processor | exporter | connector | extension',\n )\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runCollectorComponents({\n ...staticFlagsFromOpts(o),\n version: o.version as string | undefined,\n kind: o.kind as\n | 'receiver'\n | 'processor'\n | 'exporter'\n | 'connector'\n | 'extension'\n | undefined,\n });\n });\n const schemaCmd = addStaticFlags(new Command('schema'))\n .description('Get JSON Schema for a collector component')\n .requiredOption('--kind <kind>', 'Component kind')\n .requiredOption('--name <name>', 'Component name')\n .option('--version <semver>', 'Collector version')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runCollectorSchema({\n ...staticFlagsFromOpts(o),\n kind: o.kind as\n | 'receiver'\n | 'processor'\n | 'exporter'\n | 'connector'\n | 'extension',\n name: o.name as string,\n version: o.version as string | undefined,\n });\n });\n const readmeCmd = addStaticFlags(new Command('readme'))\n .description('Get README for a collector component')\n .requiredOption('--kind <kind>', 'Component kind')\n .requiredOption('--name <name>', 'Component name')\n .option('--version <semver>', 'Collector version')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runCollectorReadme({\n ...staticFlagsFromOpts(o),\n kind: o.kind as\n | 'receiver'\n | 'processor'\n | 'exporter'\n | 'connector'\n | 'extension',\n name: o.name as string,\n version: o.version as string | undefined,\n });\n });\n const validateComponentCmd = addStaticFlags(\n new Command('validate-component'),\n )\n .description('Validate component config against upstream schema')\n .requiredOption('--kind <kind>', 'Component kind')\n .requiredOption('--name <name>', 'Component name')\n .option('--version <semver>', 'Collector version')\n .option('--config-file <path>', 'Read JSON config (default: stdin)')\n .action(async function (this: Command) {\n const o = this.optsWithGlobals();\n await runCollectorValidateComponent({\n ...staticFlagsFromOpts(o),\n kind: o.kind as\n | 'receiver'\n | 'processor'\n | 'exporter'\n | 'connector'\n | 'extension',\n name: o.name as string,\n version: o.version as string | undefined,\n configFile: o.configFile as string | undefined,\n });\n });\n const refreshCmd = addStaticFlags(new Command('refresh'))\n .description('Refresh in-memory collector metadata cache')\n .action(async function (this: Command) {\n await runCollectorRefresh(staticFlagsFromOpts(this.optsWithGlobals()));\n });\n collectorCmd.addCommand(validateCmd);\n collectorCmd.addCommand(suggestCmd);\n collectorCmd.addCommand(explainCmd);\n collectorCmd.addCommand(versionsCmd);\n collectorCmd.addCommand(componentsCmd);\n collectorCmd.addCommand(schemaCmd);\n collectorCmd.addCommand(readmeCmd);\n collectorCmd.addCommand(validateComponentCmd);\n collectorCmd.addCommand(refreshCmd);\n program.addCommand(collectorCmd);\n}\n","import { AutotelError } from './errors';\n\n/**\n * Commander raises `CommanderError` (with a `.code` like\n * `commander.missingMandatoryOptionValue`) when validation fails before any\n * action runs. With `exitOverride()` set in `run()`, those errors propagate\n * to the top-level handler instead of `process.exit`ing — and this maps\n * them onto our validation envelope so agents see a parseable JSON failure\n * for every kind of error, not a raw stderr line.\n *\n * Returns `null` for anything that isn't a `CommanderError`, so the caller\n * can fall through to the generic error converter.\n *\n * Note: `commander.help`, `commander.helpDisplayed`, and `commander.version`\n * aren't really errors — commander already printed the requested output and\n * we just exit cleanly.\n */\nexport function commanderErrorToAutotel(error: unknown): AutotelError | null {\n if (\n error === null ||\n typeof error !== 'object' ||\n !('code' in error) ||\n typeof (error as { code: unknown }).code !== 'string' ||\n !(error as { code: string }).code.startsWith('commander.')\n ) {\n return null;\n }\n const ce = error as { code: string; message: string; exitCode?: number };\n if (\n ce.code === 'commander.help' ||\n ce.code === 'commander.helpDisplayed' ||\n ce.code === 'commander.version'\n ) {\n process.exit(ce.exitCode ?? 0);\n }\n return new AutotelError({\n type: 'validation',\n code: 'AUTOTEL_E_INVALID_FLAG',\n message: ce.message,\n retryable: false,\n expected: { commanderCode: ce.code },\n });\n}\n","import { run } from './cli';\nimport {\n AutotelError,\n exitCodeForError,\n toAutotelError,\n} from './lib/errors';\nimport { commanderErrorToAutotel } from './lib/commander-error';\nimport { printJson } from './lib/json-output';\n\n/**\n * --json mode is detected from argv so the top-level handler can emit a\n * structured envelope even when an error fires before commander's action\n * runs (e.g. unknown command).\n */\nfunction jsonModeRequested(): boolean {\n return process.argv.includes('--json');\n}\n\nrun().catch((error: unknown) => {\n const err: AutotelError =\n commanderErrorToAutotel(error) ?? toAutotelError(error);\n const isJson =\n jsonModeRequested() ||\n // schema/commands/examples/version + investigate commands are JSON-only\n /^(schema|commands|examples|version|health|capabilities|discover|query|trace|diagnose|topology|correlate|llm|semconv|score|collector)\\b/.test(\n process.argv.slice(2).join(' ')\n );\n\n if (isJson) {\n printJson(err.toEnvelope());\n } else {\n process.stderr.write(\n `Error [${err.code}]: ${err.message}\\n` +\n (err.fix !== undefined ? `Fix: ${err.fix}\\n` : '')\n );\n }\n process.exit(exitCodeForError(err));\n});\n"],"mappings":"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","names":["Command","fs","path","path","error","path","path","relative","path","fs","path","info","path","input","fs","path","select","checkbox","chalk","chalk","applied","error","input","path","path","fs","execSync","execSync","execSync","path","glob","path","name","spanName","glob","error","fs","fs","path","error","path","Command","Command","Command","Command","Command","Command","Command","Command","Command","detectAnomalies","findRootCause","detectAnomalies","findRootCause","Command","toTraceSearchQuery","Command","input","toTraceSearchQuery","Command","Command","Command","Command","fs","Command","Command","fs","Command","Command","error","error"]}