bbdata-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli.ts","../../src/utils/http.ts","../../src/utils/logger.ts","../../src/adapters/mlb-stats-api.ts","../../src/adapters/savant.ts","../../src/adapters/fangraphs.ts","../../src/adapters/baseball-reference.ts","../../src/adapters/index.ts","../../src/formatters/json.ts","../../src/formatters/table.ts","../../src/formatters/csv.ts","../../src/formatters/markdown.ts","../../src/formatters/index.ts","../../src/config/config.ts","../../src/config/defaults.ts","../../src/templates/queries/registry.ts","../../src/adapters/types.ts","../../src/templates/queries/pitcher-arsenal.ts","../../src/templates/queries/pitcher-velocity-trend.ts","../../src/templates/queries/pitcher-handedness-splits.ts","../../src/templates/queries/hitter-batted-ball.ts","../../src/templates/queries/hitter-vs-pitch-type.ts","../../src/templates/queries/hitter-hot-cold-zones.ts","../../src/templates/queries/matchup-pitcher-vs-hitter.ts","../../src/templates/queries/matchup-situational.ts","../../src/templates/queries/leaderboard-custom.ts","../../src/templates/queries/leaderboard-comparison.ts","../../src/templates/queries/trend-rolling-average.ts","../../src/templates/queries/trend-year-over-year.ts","../../src/commands/query.ts","../../src/commands/report.ts","../../src/utils/grading.ts","../../src/templates/reports/registry.ts","../../bin/bbdata.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { registerQueryCommand } from './commands/query.js';\nimport { registerReportCommand } from './commands/report.js';\n\nexport const program = new Command();\n\nprogram\n .name('bbdata')\n .description('Baseball data CLI — query stats, generate scouting reports, and build analytics pipelines')\n .version('0.1.0');\n\nregisterQueryCommand(program);\nregisterReportCommand(program);\n","export interface FetchOptions {\n headers?: Record<string, string>;\n timeout?: number;\n retries?: number;\n}\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_RETRIES = 2;\n\nexport async function fetchWithRetry(\n url: string,\n options: FetchOptions = {},\n): Promise<Response> {\n const { headers, timeout = DEFAULT_TIMEOUT, retries = DEFAULT_RETRIES } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText} — ${url}`);\n }\n\n return response;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt < retries) {\n // Exponential backoff: 1s, 2s\n await new Promise((resolve) => setTimeout(resolve, 1000 * (attempt + 1)));\n }\n }\n }\n\n throw lastError ?? new Error(`Failed to fetch: ${url}`);\n}\n\nexport async function fetchJson<T>(url: string, options?: FetchOptions): Promise<T> {\n const response = await fetchWithRetry(url, options);\n return response.json() as Promise<T>;\n}\n\nexport async function fetchText(url: string, options?: FetchOptions): Promise<string> {\n const response = await fetchWithRetry(url, options);\n return response.text();\n}\n","import chalk from 'chalk';\n\n// Silent when stdout is piped (agent-friendly)\nconst isTTY = process.stdout.isTTY ?? false;\n\nexport const log = {\n info(message: string): void {\n if (isTTY) {\n process.stderr.write(chalk.blue('ℹ ') + message + '\\n');\n }\n },\n\n success(message: string): void {\n if (isTTY) {\n process.stderr.write(chalk.green('✓ ') + message + '\\n');\n }\n },\n\n warn(message: string): void {\n // Warnings always show (stderr doesn't interfere with piped stdout)\n process.stderr.write(chalk.yellow('⚠ ') + message + '\\n');\n },\n\n error(message: string): void {\n process.stderr.write(chalk.red('✗ ') + message + '\\n');\n },\n\n debug(message: string): void {\n if (process.env.BBDATA_DEBUG) {\n process.stderr.write(chalk.gray('⋯ ') + message + '\\n');\n }\n },\n\n /** Print data to stdout — this is what agents/pipes consume */\n data(content: string): void {\n process.stdout.write(content);\n },\n};\n","import { fetchJson } from '../utils/http.js';\nimport { log } from '../utils/logger.js';\nimport type {\n DataAdapter,\n AdapterQuery,\n AdapterResult,\n PlayerId,\n PlayerStats,\n} from './types.js';\n\nconst BASE_URL = 'https://statsapi.mlb.com/api/v1';\n\n// MLB Stats API response types (partial — only what we use)\ninterface MlbPeopleResponse {\n people: Array<{\n id: number;\n fullName: string;\n currentTeam?: { abbreviation: string };\n primaryPosition?: { abbreviation: string };\n }>;\n}\n\ninterface MlbStatsResponse {\n stats: Array<{\n splits: Array<{\n stat: Record<string, unknown>;\n season: string;\n team?: { abbreviation: string };\n player?: { id: number; fullName: string };\n }>;\n }>;\n}\n\nexport class MlbStatsApiAdapter implements DataAdapter {\n readonly source = 'mlb-stats-api' as const;\n readonly description = 'Official MLB Stats API — rosters, schedules, season stats (JSON)';\n\n supports(query: AdapterQuery): boolean {\n // MLB Stats API provides season-level aggregated stats, not pitch-level\n // Good for: player lookup, season stats, rosters, schedules\n return true;\n }\n\n async resolvePlayer(name: string): Promise<PlayerId | null> {\n log.debug(`MLB API: resolving player \"${name}\"`);\n\n try {\n const data = await fetchJson<MlbPeopleResponse>(\n `${BASE_URL}/people/search?names=${encodeURIComponent(name)}&hydrate=currentTeam`,\n );\n\n if (!data.people?.length) return null;\n\n const player = data.people[0];\n return {\n mlbam_id: String(player.id),\n name: player.fullName,\n team: player.currentTeam?.abbreviation,\n position: player.primaryPosition?.abbreviation,\n };\n } catch (error) {\n log.warn(`Failed to resolve player \"${name}\" via MLB API: ${error}`);\n return null;\n }\n }\n\n async fetch(\n query: AdapterQuery,\n options?: { bypassCache?: boolean },\n ): Promise<AdapterResult<PlayerStats[]>> {\n // Resolve player ID if we have a name\n let playerId = query.player_id;\n let playerName = query.player_name ?? 'Unknown';\n\n if (!playerId && query.player_name) {\n const resolved = await this.resolvePlayer(query.player_name);\n if (!resolved) {\n throw new Error(`Player not found: \"${query.player_name}\"`);\n }\n playerId = resolved.mlbam_id;\n playerName = resolved.name;\n }\n\n const statGroup = query.stat_type === 'batting' ? 'hitting' : query.stat_type;\n const url = playerId\n ? `${BASE_URL}/people/${playerId}/stats?stats=season&season=${query.season}&group=${statGroup}`\n : `${BASE_URL}/stats?stats=season&season=${query.season}&group=${statGroup}&gameType=R&limit=50&sortStat=onBasePlusSlugging`;\n\n log.debug(`MLB API: fetching ${url}`);\n const data = await fetchJson<MlbStatsResponse>(url);\n\n const stats: PlayerStats[] = [];\n\n for (const statGroup of data.stats ?? []) {\n for (const split of statGroup.splits ?? []) {\n stats.push({\n player_id: playerId ?? String(split.player?.id ?? ''),\n player_name: playerName ?? split.player?.fullName ?? 'Unknown',\n team: split.team?.abbreviation ?? query.team ?? '',\n season: Number(split.season) || query.season,\n stat_type: query.stat_type,\n stats: split.stat as Record<string, string | number | null>,\n });\n }\n }\n\n return {\n data: stats,\n source: this.source,\n cached: false,\n fetchedAt: new Date().toISOString(),\n meta: {\n rowCount: stats.length,\n season: query.season,\n query,\n },\n };\n }\n}\n","import { parse } from 'csv-parse/sync';\nimport { fetchText } from '../utils/http.js';\nimport { log } from '../utils/logger.js';\nimport type {\n DataAdapter,\n AdapterQuery,\n AdapterResult,\n PlayerId,\n PitchData,\n} from './types.js';\nimport { MlbStatsApiAdapter } from './mlb-stats-api.js';\n\nconst SAVANT_SEARCH_URL = 'https://baseballsavant.mlb.com/statcast_search/csv';\n\n/**\n * Baseball Savant adapter — fetches pitch-level Statcast data as CSV.\n * This is the richest data source: every pitch with velocity, spin, movement, location, and outcomes.\n */\nexport class SavantAdapter implements DataAdapter {\n readonly source = 'savant' as const;\n readonly description = 'Baseball Savant (Statcast) — pitch-level data via CSV export';\n\n // Use MLB API for player resolution since Savant needs MLBAM IDs\n private mlbApi = new MlbStatsApiAdapter();\n\n supports(query: AdapterQuery): boolean {\n // Savant is best for pitch-level data. It requires a player or narrow date range.\n return !!(query.player_name || query.player_id || (query.start_date && query.end_date));\n }\n\n async resolvePlayer(name: string): Promise<PlayerId | null> {\n return this.mlbApi.resolvePlayer(name);\n }\n\n async fetch(\n query: AdapterQuery,\n options?: { bypassCache?: boolean },\n ): Promise<AdapterResult<PitchData[]>> {\n // Resolve player ID\n let playerId = query.player_id;\n if (!playerId && query.player_name) {\n const resolved = await this.resolvePlayer(query.player_name);\n if (!resolved) {\n throw new Error(`Player not found: \"${query.player_name}\"`);\n }\n playerId = resolved.mlbam_id;\n }\n\n // Build Savant CSV search URL\n const params = new URLSearchParams({\n all: 'true',\n type: 'detail',\n ...(query.stat_type === 'pitching'\n ? { player_type: 'pitcher', pitchers_lookup: playerId ?? '' }\n : { player_type: 'batter', batters_lookup: playerId ?? '' }),\n ...(query.start_date\n ? { game_date_gt: query.start_date }\n : { game_date_gt: `${query.season}-01-01` }),\n ...(query.end_date\n ? { game_date_lt: query.end_date }\n : { game_date_lt: `${query.season}-12-31` }),\n });\n\n if (query.pitch_type?.length) {\n params.set('pitch_type', query.pitch_type.join(','));\n }\n\n const url = `${SAVANT_SEARCH_URL}?${params}`;\n log.info(`Fetching Statcast data from Baseball Savant...`);\n log.debug(`Savant URL: ${url}`);\n\n const csvText = await fetchText(url, { timeout: 60_000 });\n\n if (!csvText.trim() || csvText.includes('No Results')) {\n return {\n data: [],\n source: this.source,\n cached: false,\n fetchedAt: new Date().toISOString(),\n meta: { rowCount: 0, season: query.season, query },\n };\n }\n\n // Parse CSV into typed PitchData objects\n const rawRows = parse(csvText, {\n columns: true,\n skip_empty_lines: true,\n cast: true,\n cast_date: false,\n }) as Record<string, unknown>[];\n\n // Filter out rows with no pitch_type (intentional walks, pitchouts, automatic balls)\n const filteredRows = rawRows.filter(\n (row) => row.pitch_type && String(row.pitch_type).trim() !== '',\n );\n\n const data: PitchData[] = filteredRows.map((row) => ({\n pitcher_id: String(row.pitcher ?? ''),\n pitcher_name: String(row.player_name ?? ''),\n batter_id: String(row.batter ?? ''),\n batter_name: String(row.batter_name || '') || (row.batter ? `Unknown (#${row.batter})` : 'Unknown'),\n game_date: String(row.game_date ?? ''),\n pitch_type: String(row.pitch_type ?? ''),\n release_speed: Number(row.release_speed) || 0,\n release_spin_rate: Number(row.release_spin_rate) || 0,\n pfx_x: Number(row.pfx_x) || 0,\n pfx_z: Number(row.pfx_z) || 0,\n plate_x: Number(row.plate_x) || 0,\n plate_z: Number(row.plate_z) || 0,\n launch_speed: row.launch_speed != null ? Number(row.launch_speed) || null : null,\n launch_angle: row.launch_angle != null ? Number(row.launch_angle) || null : null,\n description: String(row.description ?? ''),\n events: row.events ? String(row.events) : null,\n bb_type: row.bb_type ? String(row.bb_type) : null,\n stand: (String(row.stand ?? 'R') as 'L' | 'R'),\n p_throws: (String(row.p_throws ?? 'R') as 'L' | 'R'),\n estimated_ba: row.estimated_ba_using_speedangle != null\n ? Number(row.estimated_ba_using_speedangle) || null\n : null,\n estimated_woba: row.estimated_woba_using_speedangle != null\n ? Number(row.estimated_woba_using_speedangle) || null\n : null,\n }));\n\n log.success(`Fetched ${data.length} pitches from Savant`);\n\n return {\n data,\n source: this.source,\n cached: false,\n fetchedAt: new Date().toISOString(),\n meta: { rowCount: data.length, season: query.season, query },\n };\n }\n}\n","import { parse } from 'csv-parse/sync';\nimport { fetchText } from '../utils/http.js';\nimport { log } from '../utils/logger.js';\nimport type {\n DataAdapter,\n AdapterQuery,\n AdapterResult,\n PlayerId,\n PlayerStats,\n} from './types.js';\n\nconst FG_LEADERS_URL = 'https://www.fangraphs.com/api/leaders/major-league/data';\n\n/**\n * FanGraphs adapter — fetches aggregated player stats via their leaderboard API.\n * Best for: season stats, leaderboards, wRC+, FIP, WAR, projections.\n */\nexport class FanGraphsAdapter implements DataAdapter {\n readonly source = 'fangraphs' as const;\n readonly description = 'FanGraphs — aggregated stats, leaderboards, WAR, wRC+, FIP';\n\n supports(query: AdapterQuery): boolean {\n // FanGraphs is best for aggregated season-level stats and leaderboards\n return true;\n }\n\n async resolvePlayer(name: string): Promise<PlayerId | null> {\n // FanGraphs doesn't have a clean player search API.\n // We search the leaderboard and match by name.\n // For robust resolution, we'd use the Chadwick Bureau register.\n log.debug(`FanGraphs: resolving player \"${name}\" via leaderboard search`);\n\n try {\n const season = new Date().getFullYear();\n const params = new URLSearchParams({\n pos: 'all',\n stats: 'bat',\n lg: 'all',\n qual: '0',\n season: String(season),\n month: '0',\n ind: '0',\n team: '',\n pageitems: '500',\n pagenum: '1',\n type: '8', // standard stats\n });\n\n const data = await fetchText(`${FG_LEADERS_URL}?${params}`);\n const parsed = JSON.parse(data);\n\n const nameNorm = name.toLowerCase().trim();\n const players = (parsed.data ?? []) as Record<string, unknown>[];\n const getName = (p: Record<string, unknown>) =>\n String(p.PlayerName ?? p.Name ?? '').toLowerCase().trim();\n\n // Exact match first, then token-based fuzzy match\n let match = players.find((p) => getName(p) === nameNorm);\n if (!match) {\n const tokens = nameNorm.split(/\\s+/);\n match = players.find((p) => {\n const words = getName(p).split(/\\s+/);\n return tokens.every((t) => words.some((w) => w.startsWith(t)));\n });\n if (match) {\n log.debug(`FanGraphs: fuzzy match for \"${name}\" → \"${getName(match)}\"`);\n }\n }\n\n if (!match) return null;\n\n return {\n mlbam_id: String(match.xMLBAMID ?? ''),\n fangraphs_id: String(match.playerid ?? ''),\n name: String(match.PlayerName ?? match.Name),\n team: String(match.Team ?? ''),\n };\n } catch (error) {\n log.warn(`FanGraphs player resolution failed: ${error}`);\n return null;\n }\n }\n\n async fetch(\n query: AdapterQuery,\n options?: { bypassCache?: boolean },\n ): Promise<AdapterResult<PlayerStats[]>> {\n const statType = query.stat_type === 'batting' ? 'bat' : 'pit';\n\n const params = new URLSearchParams({\n pos: 'all',\n stats: statType,\n lg: 'all',\n qual: String(query.min_pa ?? query.min_ip ?? 0),\n season: String(query.season),\n month: '0',\n ind: '0',\n team: query.team ? await this.resolveTeamId(query.team) : '',\n pageitems: '500',\n pagenum: '1',\n type: '8', // standard + advanced stats\n });\n\n const url = `${FG_LEADERS_URL}?${params}`;\n log.info('Fetching stats from FanGraphs...');\n log.debug(`FanGraphs URL: ${url}`);\n\n const raw = await fetchText(url);\n const parsed = JSON.parse(raw);\n const rows: Record<string, unknown>[] = parsed.data ?? [];\n\n // If searching for a specific player, filter\n let filtered = rows;\n if (query.player_name) {\n const nameNorm = query.player_name.toLowerCase().trim();\n const getName = (r: Record<string, unknown>) =>\n String(r.PlayerName ?? r.Name ?? '').toLowerCase().trim();\n\n // Exact match first, then token-based fuzzy match\n const exact = rows.filter((r) => getName(r) === nameNorm);\n if (exact.length > 0) {\n filtered = exact;\n } else {\n const tokens = nameNorm.split(/\\s+/);\n filtered = rows.filter((r) => {\n const words = getName(r).split(/\\s+/);\n return tokens.every((t) => words.some((w) => w.startsWith(t)));\n });\n }\n }\n\n const stats: PlayerStats[] = filtered.map((row) => ({\n player_id: String(row.xMLBAMID ?? row.playerid ?? ''),\n player_name: String(row.PlayerName ?? row.Name ?? ''),\n team: String(row.Team ?? ''),\n season: query.season,\n stat_type: query.stat_type,\n stats: row as Record<string, string | number | null>,\n }));\n\n log.success(`Fetched ${stats.length} player(s) from FanGraphs`);\n\n return {\n data: stats,\n source: this.source,\n cached: false,\n fetchedAt: new Date().toISOString(),\n meta: { rowCount: stats.length, season: query.season, query },\n };\n }\n\n private async resolveTeamId(abbrev: string): Promise<string> {\n // FanGraphs uses team IDs, not abbreviations. Common mappings:\n const TEAM_IDS: Record<string, string> = {\n LAA: '1', ARI: '15', BAL: '2', BOS: '3', CHC: '17', CHW: '4',\n CIN: '18', CLE: '5', COL: '19', DET: '6', HOU: '21', KC: '7',\n LAD: '22', MIA: '20', MIL: '23', MIN: '8', NYM: '25', NYY: '9',\n OAK: '10', PHI: '26', PIT: '27', SD: '29', SF: '30', SEA: '11',\n STL: '28', TB: '12', TEX: '13', TOR: '14', WSH: '24', ATL: '16',\n };\n return TEAM_IDS[abbrev.toUpperCase()] ?? '';\n }\n}\n","import { log } from '../utils/logger.js';\nimport type {\n DataAdapter,\n AdapterQuery,\n AdapterResult,\n PlayerId,\n PlayerStats,\n} from './types.js';\n\n/**\n * Baseball Reference adapter — BETA.\n *\n * Baseball Reference serves HTML, not structured data. This adapter is a\n * placeholder that will be implemented incrementally. For now, it delegates\n * to the MLB Stats API for basic queries and logs a warning.\n *\n * Future implementation will use HTML parsing for:\n * - Historical stats (pre-Statcast era)\n * - Career game logs\n * - Minor league stats\n * - Transaction and injury history\n */\nexport class BaseballReferenceAdapter implements DataAdapter {\n readonly source = 'baseball-reference' as const;\n readonly description = 'Baseball Reference — historical stats, career data (BETA)';\n\n supports(_query: AdapterQuery): boolean {\n // Only enable when explicitly requested — this is not yet fully implemented\n return false;\n }\n\n async resolvePlayer(_name: string): Promise<PlayerId | null> {\n log.warn('Baseball Reference adapter is in beta — player resolution not yet implemented');\n return null;\n }\n\n async fetch(\n query: AdapterQuery,\n _options?: { bypassCache?: boolean },\n ): Promise<AdapterResult<PlayerStats[]>> {\n log.warn('Baseball Reference adapter is in beta — returning empty results');\n return {\n data: [],\n source: this.source,\n cached: false,\n fetchedAt: new Date().toISOString(),\n meta: { rowCount: 0, season: query.season, query },\n };\n }\n}\n","import type { DataAdapter, DataSource } from './types.js';\nimport { MlbStatsApiAdapter } from './mlb-stats-api.js';\nimport { SavantAdapter } from './savant.js';\nimport { FanGraphsAdapter } from './fangraphs.js';\nimport { BaseballReferenceAdapter } from './baseball-reference.js';\n\nconst adapters: Record<DataSource, DataAdapter> = {\n 'mlb-stats-api': new MlbStatsApiAdapter(),\n 'savant': new SavantAdapter(),\n 'fangraphs': new FanGraphsAdapter(),\n 'baseball-reference': new BaseballReferenceAdapter(),\n};\n\nexport function getAdapter(source: DataSource): DataAdapter {\n return adapters[source];\n}\n\nexport function getAllAdapters(): DataAdapter[] {\n return Object.values(adapters);\n}\n\nexport function resolveAdapters(\n preferred: DataSource[],\n): DataAdapter[] {\n return preferred.map((source) => adapters[source]).filter(Boolean);\n}\n","export type OutputFormat = 'json' | 'table' | 'csv' | 'markdown';\n\nexport interface FormatMeta {\n source: string;\n cached: boolean;\n queryTimeMs: number;\n season: number;\n sampleSize: number;\n template?: string;\n}\n\nexport interface FormattedOutput {\n raw: unknown;\n formatted: string;\n meta: FormatMeta;\n}\n\nexport function formatJson(data: unknown, meta: FormatMeta): FormattedOutput {\n const output = { data, meta };\n return {\n raw: data,\n formatted: JSON.stringify(output, null, 2) + '\\n',\n meta,\n };\n}\n","import Table from 'cli-table3';\nimport chalk from 'chalk';\nimport type { FormatMeta, FormattedOutput } from './json.js';\n\nexport function formatTable(\n data: Record<string, unknown>[],\n meta: FormatMeta,\n options: { columns?: string[] } = {},\n): FormattedOutput {\n if (data.length === 0) {\n return {\n raw: data,\n formatted: 'No data found.\\n',\n meta,\n };\n }\n\n // Use specified columns or infer from first row\n const columns = options.columns ?? Object.keys(data[0]);\n\n const table = new Table({\n head: columns.map((col) => chalk.bold(col)),\n style: { head: ['cyan'] },\n });\n\n for (const row of data) {\n table.push(columns.map((col) => formatCell(row[col])));\n }\n\n const footer = chalk.gray(\n `\\n${meta.sampleSize} rows · Source: ${meta.source} · ${meta.cached ? 'cached' : 'live'}`,\n );\n\n return {\n raw: data,\n formatted: table.toString() + footer + '\\n',\n meta,\n };\n}\n\nfunction formatCell(value: unknown): string {\n if (value === null || value === undefined) return chalk.gray('—');\n if (typeof value === 'number') {\n // Format percentages\n if (Math.abs(value) <= 1 && value !== 0) {\n return (value * 100).toFixed(1) + '%';\n }\n // Format large numbers\n if (Number.isInteger(value) && value > 999) {\n return value.toLocaleString();\n }\n return value.toFixed(1);\n }\n return String(value);\n}\n","import { stringify } from 'csv-stringify/sync';\nimport type { FormatMeta, FormattedOutput } from './json.js';\n\nexport function formatCsv(\n data: Record<string, unknown>[],\n meta: FormatMeta,\n): FormattedOutput {\n if (data.length === 0) {\n return { raw: data, formatted: '', meta };\n }\n\n const columns = Object.keys(data[0]);\n const formatted = stringify(data, { header: true, columns });\n\n return { raw: data, formatted, meta };\n}\n","import type { FormatMeta, FormattedOutput } from './json.js';\n\nexport function formatMarkdown(\n data: Record<string, unknown>[],\n meta: FormatMeta,\n): FormattedOutput {\n if (data.length === 0) {\n return { raw: data, formatted: '*No data found.*\\n', meta };\n }\n\n const columns = Object.keys(data[0]);\n\n // Header row\n const header = '| ' + columns.join(' | ') + ' |';\n const separator = '| ' + columns.map(() => '---').join(' | ') + ' |';\n\n // Data rows\n const rows = data.map(\n (row) => '| ' + columns.map((col) => formatMdCell(row[col])).join(' | ') + ' |',\n );\n\n // Footer\n const footer = `\\n*${meta.sampleSize} rows · Source: ${meta.source} · Season ${meta.season}*`;\n\n return {\n raw: data,\n formatted: [header, separator, ...rows, footer].join('\\n') + '\\n',\n meta,\n };\n}\n\nfunction formatMdCell(value: unknown): string {\n if (value === null || value === undefined) return '—';\n if (typeof value === 'number') {\n if (Math.abs(value) <= 1 && value !== 0) return (value * 100).toFixed(1) + '%';\n if (Number.isInteger(value)) return String(value);\n return value.toFixed(1);\n }\n return String(value);\n}\n","import type { OutputFormat, FormatMeta, FormattedOutput } from './json.js';\nimport { formatJson } from './json.js';\nimport { formatTable } from './table.js';\nimport { formatCsv } from './csv.js';\nimport { formatMarkdown } from './markdown.js';\n\nexport type { OutputFormat, FormatMeta, FormattedOutput };\n\nexport function format(\n data: Record<string, unknown>[],\n meta: FormatMeta,\n outputFormat: OutputFormat,\n options?: { columns?: string[] },\n): FormattedOutput {\n switch (outputFormat) {\n case 'json':\n return formatJson(data, meta);\n case 'table':\n return formatTable(data, meta, options);\n case 'csv':\n return formatCsv(data, meta);\n case 'markdown':\n return formatMarkdown(data, meta);\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { ConfigSchema, getDefaultConfig, type BbdataConfig } from './defaults.js';\n\nconst BBDATA_DIR = join(homedir(), '.bbdata');\nconst CONFIG_PATH = join(BBDATA_DIR, 'config.json');\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function getConfigDir(): string {\n return BBDATA_DIR;\n}\n\nexport function getConfig(): BbdataConfig {\n ensureDir(BBDATA_DIR);\n\n if (!existsSync(CONFIG_PATH)) {\n const defaults = getDefaultConfig();\n writeFileSync(CONFIG_PATH, JSON.stringify(defaults, null, 2), 'utf-8');\n return defaults;\n }\n\n try {\n const raw = JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));\n return ConfigSchema.parse(raw);\n } catch {\n // If config is corrupted, return defaults without overwriting\n return getDefaultConfig();\n }\n}\n\nexport function setConfig(updates: Partial<BbdataConfig>): BbdataConfig {\n const current = getConfig();\n const merged = { ...current, ...updates };\n const validated = ConfigSchema.parse(merged);\n\n ensureDir(BBDATA_DIR);\n writeFileSync(CONFIG_PATH, JSON.stringify(validated, null, 2), 'utf-8');\n\n return validated;\n}\n\nexport function getCacheDir(): string {\n const config = getConfig();\n const dir = config.cache.directory || join(BBDATA_DIR, 'cache');\n ensureDir(dir);\n return dir;\n}\n\nexport function getTemplatesDir(): string {\n const config = getConfig();\n const dir = config.templates.directory || join(BBDATA_DIR, 'templates');\n ensureDir(dir);\n return dir;\n}\n","import { z } from 'zod';\n\nexport const ConfigSchema = z.object({\n defaultTeam: z.string().optional(),\n defaultFormat: z.enum(['json', 'table', 'csv', 'markdown']).default('json'),\n defaultAudience: z.enum(['coach', 'gm', 'scout', 'analyst']).default('analyst'),\n cache: z.object({\n enabled: z.boolean().default(true),\n maxAgeDays: z.number().default(30),\n directory: z.string().default(''),\n }).default({}),\n templates: z.object({\n directory: z.string().default(''),\n }).default({}),\n sources: z.object({\n savant: z.object({ enabled: z.boolean().default(true) }).default({}),\n fangraphs: z.object({ enabled: z.boolean().default(true) }).default({}),\n mlbStatsApi: z.object({ enabled: z.boolean().default(true) }).default({}),\n baseballReference: z.object({ enabled: z.boolean().default(false) }).default({}),\n }).default({}),\n});\n\nexport type BbdataConfig = z.infer<typeof ConfigSchema>;\n\nexport function getDefaultConfig(): BbdataConfig {\n return ConfigSchema.parse({});\n}\n","import type { DataSource, AdapterQuery, PitchData, PlayerStats } from '../../adapters/types.js';\n\nexport type QueryCategory = 'pitcher' | 'hitter' | 'matchup' | 'leaderboard' | 'trend';\n\nexport interface QueryTemplateParams {\n player?: string;\n players?: string[];\n team?: string;\n season?: number;\n stat?: string;\n pitchType?: string;\n minPa?: number;\n minIp?: number;\n top?: number;\n seasons?: string; // \"2023-2025\"\n}\n\nexport interface QueryResult {\n rows: Record<string, unknown>[];\n columns: string[];\n title: string;\n description: string;\n source: DataSource;\n cached: boolean;\n}\n\nexport interface QueryTemplate {\n id: string;\n name: string;\n category: QueryCategory;\n description: string;\n preferredSources: DataSource[];\n requiredParams: (keyof QueryTemplateParams)[];\n optionalParams: (keyof QueryTemplateParams)[];\n examples: string[];\n\n /** Build the adapter query from user-provided params */\n buildQuery(params: QueryTemplateParams): AdapterQuery;\n\n /** Transform raw adapter data into display rows */\n transform(data: PitchData[] | PlayerStats[], params: QueryTemplateParams): Record<string, unknown>[];\n\n /** Column names for display */\n columns(params: QueryTemplateParams): string[];\n}\n\n// Template registry\nconst templates = new Map<string, QueryTemplate>();\n\nexport function registerTemplate(template: QueryTemplate): void {\n templates.set(template.id, template);\n}\n\nexport function getTemplate(id: string): QueryTemplate | undefined {\n return templates.get(id);\n}\n\nexport function getAllTemplates(): QueryTemplate[] {\n return Array.from(templates.values());\n}\n\nexport function getTemplatesByCategory(category: QueryCategory): QueryTemplate[] {\n return getAllTemplates().filter((t) => t.category === category);\n}\n\nexport function listTemplates(): { id: string; name: string; category: string; description: string }[] {\n return getAllTemplates().map((t) => ({\n id: t.id,\n name: t.name,\n category: t.category,\n description: t.description,\n }));\n}\n","import { z } from 'zod';\n\n// --- Data Source Types ---\n\nexport type DataSource = 'savant' | 'fangraphs' | 'mlb-stats-api' | 'baseball-reference';\n\n// --- Pitch-level data (Statcast granularity) ---\n\nexport const PitchDataSchema = z.object({\n pitcher_id: z.string(),\n pitcher_name: z.string(),\n batter_id: z.string(),\n batter_name: z.string(),\n game_date: z.string(),\n pitch_type: z.string(), // FF, SL, CH, CU, SI, FC, KC, FS, etc.\n release_speed: z.number(), // mph\n release_spin_rate: z.number(), // rpm\n pfx_x: z.number(), // horizontal movement (inches)\n pfx_z: z.number(), // vertical movement (inches)\n plate_x: z.number(), // horizontal location\n plate_z: z.number(), // vertical location\n launch_speed: z.number().nullable(), // exit velocity (mph)\n launch_angle: z.number().nullable(), // degrees\n description: z.string(), // called_strike, swinging_strike, ball, foul, hit_into_play, etc.\n events: z.string().nullable(), // single, double, home_run, strikeout, etc.\n bb_type: z.string().nullable(), // fly_ball, ground_ball, line_drive, popup\n stand: z.enum(['L', 'R']), // batter handedness\n p_throws: z.enum(['L', 'R']), // pitcher handedness\n estimated_ba: z.number().nullable(), // xBA\n estimated_woba: z.number().nullable(), // xwOBA\n});\n\nexport type PitchData = z.infer<typeof PitchDataSchema>;\n\n// --- Aggregated player stats (FanGraphs/BBRef granularity) ---\n\nexport const PlayerStatsSchema = z.object({\n player_id: z.string(),\n player_name: z.string(),\n team: z.string(),\n season: z.number(),\n stat_type: z.enum(['batting', 'pitching', 'fielding']),\n stats: z.record(z.union([z.number(), z.string(), z.null()])),\n});\n\nexport type PlayerStats = z.infer<typeof PlayerStatsSchema>;\n\n// --- Player identity (cross-source resolution) ---\n\nexport interface PlayerId {\n mlbam_id: string;\n fangraphs_id?: string;\n bbref_id?: string;\n name: string;\n team?: string;\n position?: string;\n}\n\n// --- Query parameters passed to adapters ---\n\nexport interface AdapterQuery {\n player_name?: string;\n player_id?: string;\n team?: string;\n season: number;\n start_date?: string; // YYYY-MM-DD\n end_date?: string; // YYYY-MM-DD\n stat_type: 'batting' | 'pitching' | 'fielding';\n pitch_type?: string[]; // filter by pitch type codes\n min_pa?: number;\n min_ip?: number;\n metrics?: string[]; // specific stat columns to return\n}\n\n// --- Adapter fetch result ---\n\nexport interface AdapterResult<T = PitchData[] | PlayerStats[]> {\n data: T;\n source: DataSource;\n cached: boolean;\n fetchedAt: string; // ISO 8601\n meta: {\n rowCount: number;\n season: number;\n query: AdapterQuery;\n };\n}\n\n// --- The adapter contract ---\n\nexport interface DataAdapter {\n readonly source: DataSource;\n readonly description: string;\n\n /** Can this adapter service this query type? */\n supports(query: AdapterQuery): boolean;\n\n /** Fetch data, checking cache first */\n fetch(query: AdapterQuery, options?: { bypassCache?: boolean }): Promise<AdapterResult>;\n\n /** Resolve a player name to this source's ID */\n resolvePlayer(name: string): Promise<PlayerId | null>;\n}\n\n// --- Pitch type mappings (normalize across sources) ---\n\nexport const PITCH_TYPE_MAP: Record<string, string> = {\n FF: 'Four-Seam Fastball',\n SI: 'Sinker',\n FC: 'Cutter',\n SL: 'Slider',\n CU: 'Curveball',\n KC: 'Knuckle Curve',\n CH: 'Changeup',\n FS: 'Splitter',\n KN: 'Knuckleball',\n EP: 'Eephus',\n SC: 'Screwball',\n ST: 'Sweeper',\n SV: 'Slurve',\n};\n\nexport function pitchTypeName(code: string): string {\n return PITCH_TYPE_MAP[code.toUpperCase()] ?? code;\n}\n","import { registerTemplate, type QueryTemplate, type QueryTemplateParams } from './registry.js';\nimport type { PitchData } from '../../adapters/types.js';\nimport { pitchTypeName } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'pitcher-arsenal',\n name: 'Pitcher Arsenal Profile',\n category: 'pitcher',\n description: 'Pitch usage rates, velocity, spin, movement, and whiff rates by pitch type',\n preferredSources: ['savant', 'fangraphs', 'mlb-stats-api'],\n requiredParams: ['player'],\n optionalParams: ['season', 'pitchType'],\n examples: [\n 'bbdata query pitcher-arsenal --player \"Corbin Burnes\" --season 2025',\n 'bbdata query pitcher-arsenal --player \"Spencer Strider\"',\n ],\n\n buildQuery(params) {\n return {\n player_name: params.player,\n season: params.season ?? new Date().getFullYear(),\n stat_type: 'pitching',\n pitch_type: params.pitchType ? [params.pitchType] : undefined,\n };\n },\n\n columns() {\n return [\n 'Pitch Type',\n 'Usage %',\n 'Avg Velo',\n 'Avg Spin',\n 'H Break',\n 'V Break',\n 'Whiff %',\n 'Put Away %',\n 'Pitches',\n ];\n },\n\n transform(data, _params) {\n const pitches = data as PitchData[];\n if (pitches.length === 0) return [];\n\n // Group by pitch type\n const byType = new Map<string, PitchData[]>();\n for (const pitch of pitches) {\n if (!pitch.pitch_type) continue;\n const group = byType.get(pitch.pitch_type) ?? [];\n group.push(pitch);\n byType.set(pitch.pitch_type, group);\n }\n\n const total = pitches.length;\n\n return Array.from(byType.entries())\n .map(([type, group]) => {\n const count = group.length;\n const swings = group.filter((p) =>\n p.description.includes('swing') || p.description.includes('foul'),\n );\n const whiffs = group.filter((p) =>\n p.description.includes('swinging_strike'),\n );\n const twoStrikes = group.filter((p) =>\n p.description.includes('strikeout') || p.description.includes('swinging_strike'),\n );\n\n return {\n 'Pitch Type': pitchTypeName(type),\n 'Usage %': ((count / total) * 100).toFixed(1) + '%',\n 'Avg Velo': (group.reduce((s, p) => s + p.release_speed, 0) / count).toFixed(1) + ' mph',\n 'Avg Spin': Math.round(group.reduce((s, p) => s + p.release_spin_rate, 0) / count) + ' rpm',\n 'H Break': (group.reduce((s, p) => s + p.pfx_x, 0) / count).toFixed(1) + ' in',\n 'V Break': (group.reduce((s, p) => s + p.pfx_z, 0) / count).toFixed(1) + ' in',\n 'Whiff %': swings.length > 0\n ? ((whiffs.length / swings.length) * 100).toFixed(1) + '%'\n : '—',\n 'Put Away %': twoStrikes.length > 0\n ? ((whiffs.length / count) * 100).toFixed(1) + '%'\n : '—',\n 'Pitches': count,\n };\n })\n .sort((a, b) => (b.Pitches as number) - (a.Pitches as number));\n },\n};\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PitchData } from '../../adapters/types.js';\nimport { pitchTypeName } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'pitcher-velocity-trend',\n name: 'Pitcher Velocity Trend',\n category: 'pitcher',\n description: 'Month-by-month fastball velocity tracking — flags drops > 0.5 mph',\n preferredSources: ['savant'],\n requiredParams: ['player'],\n optionalParams: ['season'],\n examples: [\n 'bbdata query pitcher-velocity-trend --player \"Gerrit Cole\" --season 2025',\n ],\n\n buildQuery(params) {\n return {\n player_name: params.player,\n season: params.season ?? new Date().getFullYear(),\n stat_type: 'pitching',\n };\n },\n\n columns() {\n return ['Month', 'Avg Velo', 'Max Velo', 'Min Velo', 'Δ vs Prior', 'Pitches', 'Flag'];\n },\n\n transform(data) {\n const pitches = (data as PitchData[]).filter(\n (p) => ['FF', 'SI', 'FC'].includes(p.pitch_type) && p.release_speed > 0,\n );\n\n if (pitches.length === 0) return [];\n\n // Group by month\n const byMonth = new Map<string, PitchData[]>();\n for (const pitch of pitches) {\n const month = pitch.game_date.slice(0, 7); // YYYY-MM\n const group = byMonth.get(month) ?? [];\n group.push(pitch);\n byMonth.set(month, group);\n }\n\n const months = Array.from(byMonth.entries()).sort(([a], [b]) => a.localeCompare(b));\n let prevAvg: number | null = null;\n\n return months.map(([month, group]) => {\n const velos = group.map((p) => p.release_speed);\n const avg = velos.reduce((s, v) => s + v, 0) / velos.length;\n const max = Math.max(...velos);\n const min = Math.min(...velos);\n\n const delta = prevAvg !== null ? avg - prevAvg : 0;\n const flag = prevAvg !== null && delta < -0.5 ? '⚠ DROP' : '';\n prevAvg = avg;\n\n return {\n Month: month,\n 'Avg Velo': avg.toFixed(1) + ' mph',\n 'Max Velo': max.toFixed(1) + ' mph',\n 'Min Velo': min.toFixed(1) + ' mph',\n 'Δ vs Prior': prevAvg !== null && delta !== 0\n ? (delta > 0 ? '+' : '') + delta.toFixed(1) + ' mph'\n : '—',\n Pitches: group.length,\n Flag: flag,\n };\n });\n },\n};\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PitchData } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'pitcher-handedness-splits',\n name: 'Pitcher Handedness Splits',\n category: 'pitcher',\n description: 'Performance splits vs LHH and RHH — BA, SLG, K%, BB%, pitch mix, exit velocity',\n preferredSources: ['savant', 'fangraphs'],\n requiredParams: ['player'],\n optionalParams: ['season'],\n examples: [\n 'bbdata query pitcher-handedness-splits --player \"Blake Snell\" --season 2025',\n ],\n\n buildQuery(params) {\n return {\n player_name: params.player,\n season: params.season ?? new Date().getFullYear(),\n stat_type: 'pitching',\n };\n },\n\n columns() {\n return ['vs', 'PA', 'AVG', 'SLG', 'K %', 'BB %', 'Avg EV', 'Whiff %'];\n },\n\n transform(data) {\n const pitches = data as PitchData[];\n if (pitches.length === 0) return [];\n\n return (['L', 'R'] as const).map((hand) => {\n const group = pitches.filter((p) => p.stand === hand);\n if (group.length === 0) {\n return { vs: `vs ${hand}HH`, PA: 0, AVG: '—', SLG: '—', 'K %': '—', 'BB %': '—', 'Avg EV': '—', 'Whiff %': '—' };\n }\n\n // Plate appearances (approximate: count events)\n const pas = group.filter((p) => p.events !== null);\n const hits = pas.filter((p) =>\n ['single', 'double', 'triple', 'home_run'].includes(p.events ?? ''),\n );\n const strikeouts = pas.filter((p) => p.events === 'strikeout');\n const walks = pas.filter((p) => ['walk', 'hit_by_pitch'].includes(p.events ?? ''));\n\n // Exit velocity on contact\n const contacted = group.filter((p) => p.launch_speed !== null && p.launch_speed > 0);\n const avgEv = contacted.length > 0\n ? contacted.reduce((s, p) => s + (p.launch_speed ?? 0), 0) / contacted.length\n : null;\n\n // Total bases for SLG\n const totalBases = pas.reduce((sum, p) => {\n if (p.events === 'single') return sum + 1;\n if (p.events === 'double') return sum + 2;\n if (p.events === 'triple') return sum + 3;\n if (p.events === 'home_run') return sum + 4;\n return sum;\n }, 0);\n\n // Whiff rate\n const swings = group.filter((p) =>\n p.description.includes('swing') || p.description.includes('foul'),\n );\n const whiffs = group.filter((p) => p.description.includes('swinging_strike'));\n\n return {\n vs: `vs ${hand}HH`,\n PA: pas.length,\n AVG: pas.length > 0 ? (hits.length / pas.length).toFixed(3) : '—',\n SLG: pas.length > 0 ? (totalBases / pas.length).toFixed(3) : '—',\n 'K %': pas.length > 0 ? ((strikeouts.length / pas.length) * 100).toFixed(1) + '%' : '—',\n 'BB %': pas.length > 0 ? ((walks.length / pas.length) * 100).toFixed(1) + '%' : '—',\n 'Avg EV': avgEv !== null ? avgEv.toFixed(1) + ' mph' : '—',\n 'Whiff %': swings.length > 0 ? ((whiffs.length / swings.length) * 100).toFixed(1) + '%' : '—',\n };\n });\n },\n};\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PitchData } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'hitter-batted-ball',\n name: 'Hitter Batted Ball Profile',\n category: 'hitter',\n description: 'Exit velocity, launch angle, hard hit rate, barrel rate, batted ball distribution',\n preferredSources: ['savant', 'fangraphs'],\n requiredParams: ['player'],\n optionalParams: ['season'],\n examples: [\n 'bbdata query hitter-batted-ball --player \"Aaron Judge\" --season 2025',\n 'bbdata query hitter-batted-ball --player \"Juan Soto\"',\n ],\n\n buildQuery(params) {\n return {\n player_name: params.player,\n season: params.season ?? new Date().getFullYear(),\n stat_type: 'batting',\n };\n },\n\n columns() {\n return ['Metric', 'Value'];\n },\n\n transform(data) {\n const pitches = data as PitchData[];\n const batted = pitches.filter((p) => p.launch_speed !== null && p.launch_speed > 0);\n\n if (batted.length === 0) return [];\n\n const evs = batted.map((p) => p.launch_speed!);\n const las = batted.map((p) => p.launch_angle!);\n const avgEv = evs.reduce((s, v) => s + v, 0) / evs.length;\n const avgLa = las.reduce((s, v) => s + v, 0) / las.length;\n\n const hardHit = batted.filter((p) => p.launch_speed! >= 95).length;\n // Barrel = EV >= 98 mph and LA between 26-30 (simplified)\n const barrels = batted.filter(\n (p) => p.launch_speed! >= 98 && p.launch_angle! >= 26 && p.launch_angle! <= 30,\n ).length;\n\n const linedrives = batted.filter((p) => p.bb_type === 'line_drive').length;\n const flyballs = batted.filter((p) => p.bb_type === 'fly_ball').length;\n const groundballs = batted.filter((p) => p.bb_type === 'ground_ball').length;\n const popups = batted.filter((p) => p.bb_type === 'popup').length;\n\n return [\n { Metric: 'Batted Balls', Value: batted.length },\n { Metric: 'Avg Exit Velocity', Value: avgEv.toFixed(1) + ' mph' },\n { Metric: 'Max Exit Velocity', Value: Math.max(...evs).toFixed(1) + ' mph' },\n { Metric: 'Avg Launch Angle', Value: avgLa.toFixed(1) + '°' },\n { Metric: 'Hard Hit Rate (95+ mph)', Value: ((hardHit / batted.length) * 100).toFixed(1) + '%' },\n { Metric: 'Barrel Rate', Value: ((barrels / batted.length) * 100).toFixed(1) + '%' },\n { Metric: 'Line Drive %', Value: ((linedrives / batted.length) * 100).toFixed(1) + '%' },\n { Metric: 'Fly Ball %', Value: ((flyballs / batted.length) * 100).toFixed(1) + '%' },\n { Metric: 'Ground Ball %', Value: ((groundballs / batted.length) * 100).toFixed(1) + '%' },\n { Metric: 'Popup %', Value: ((popups / batted.length) * 100).toFixed(1) + '%' },\n ];\n },\n};\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PitchData } from '../../adapters/types.js';\nimport { pitchTypeName } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'hitter-vs-pitch-type',\n name: 'Hitter vs Pitch Type',\n category: 'hitter',\n description: 'Swing rate, whiff rate, exit velocity, and outcomes by pitch type faced',\n preferredSources: ['savant'],\n requiredParams: ['player'],\n optionalParams: ['season'],\n examples: [\n 'bbdata query hitter-vs-pitch-type --player \"Mookie Betts\" --season 2025',\n ],\n\n buildQuery(params) {\n return {\n player_name: params.player,\n season: params.season ?? new Date().getFullYear(),\n stat_type: 'batting',\n };\n },\n\n columns() {\n return ['Pitch Type', 'Seen', 'Swing %', 'Whiff %', 'Foul %', 'In Play', 'Avg EV', 'SLG'];\n },\n\n transform(data) {\n const pitches = data as PitchData[];\n if (pitches.length === 0) return [];\n\n const byType = new Map<string, PitchData[]>();\n for (const p of pitches) {\n if (!p.pitch_type) continue;\n const group = byType.get(p.pitch_type) ?? [];\n group.push(p);\n byType.set(p.pitch_type, group);\n }\n\n return Array.from(byType.entries())\n .map(([type, group]) => {\n const swings = group.filter((p) =>\n p.description.includes('swing') || p.description.includes('foul') || p.description.includes('hit_into_play'),\n );\n const whiffs = group.filter((p) => p.description.includes('swinging_strike'));\n const fouls = group.filter((p) => p.description.includes('foul'));\n const inPlay = group.filter((p) => p.description.includes('hit_into_play'));\n const contacted = group.filter((p) => p.launch_speed !== null && p.launch_speed > 0);\n\n // SLG on contact\n const totalBases = group.reduce((sum, p) => {\n if (p.events === 'single') return sum + 1;\n if (p.events === 'double') return sum + 2;\n if (p.events === 'triple') return sum + 3;\n if (p.events === 'home_run') return sum + 4;\n return sum;\n }, 0);\n const abs = group.filter((p) => p.events && !['walk', 'hit_by_pitch', 'sac_fly', 'sac_bunt'].includes(p.events)).length;\n\n return {\n 'Pitch Type': pitchTypeName(type),\n Seen: group.length,\n 'Swing %': ((swings.length / group.length) * 100).toFixed(1) + '%',\n 'Whiff %': swings.length > 0 ? ((whiffs.length / swings.length) * 100).toFixed(1) + '%' : '—',\n 'Foul %': swings.length > 0 ? ((fouls.length / swings.length) * 100).toFixed(1) + '%' : '—',\n 'In Play': inPlay.length,\n 'Avg EV': contacted.length > 0\n ? (contacted.reduce((s, p) => s + p.launch_speed!, 0) / contacted.length).toFixed(1) + ' mph'\n : '—',\n SLG: abs > 0 ? (totalBases / abs).toFixed(3) : '—',\n };\n })\n .sort((a, b) => (b.Seen as number) - (a.Seen as number));\n },\n};\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PitchData } from '../../adapters/types.js';\n\n// 3x3 strike zone grid\nconst ZONES = {\n 'High-In': { xMin: -0.83, xMax: -0.28, zMin: 2.83, zMax: 3.5 },\n 'High-Mid': { xMin: -0.28, xMax: 0.28, zMin: 2.83, zMax: 3.5 },\n 'High-Out': { xMin: 0.28, xMax: 0.83, zMin: 2.83, zMax: 3.5 },\n 'Mid-In': { xMin: -0.83, xMax: -0.28, zMin: 2.17, zMax: 2.83 },\n 'Mid-Mid': { xMin: -0.28, xMax: 0.28, zMin: 2.17, zMax: 2.83 },\n 'Mid-Out': { xMin: 0.28, xMax: 0.83, zMin: 2.17, zMax: 2.83 },\n 'Low-In': { xMin: -0.83, xMax: -0.28, zMin: 1.5, zMax: 2.17 },\n 'Low-Mid': { xMin: -0.28, xMax: 0.28, zMin: 1.5, zMax: 2.17 },\n 'Low-Out': { xMin: 0.28, xMax: 0.83, zMin: 1.5, zMax: 2.17 },\n} as const;\n\nconst template: QueryTemplate = {\n id: 'hitter-hot-cold-zones',\n name: 'Hitter Hot/Cold Zones',\n category: 'hitter',\n description: '3x3 strike zone grid with BA, SLG, whiff rate, and pitch count per zone',\n preferredSources: ['savant'],\n requiredParams: ['player'],\n optionalParams: ['season'],\n examples: [\n 'bbdata query hitter-hot-cold-zones --player \"Shohei Ohtani\" --season 2025',\n ],\n\n buildQuery(params) {\n return {\n player_name: params.player,\n season: params.season ?? new Date().getFullYear(),\n stat_type: 'batting',\n };\n },\n\n columns() {\n return ['Zone', 'Pitches', 'Swings', 'Whiff %', 'AVG', 'SLG'];\n },\n\n transform(data) {\n const pitches = data as PitchData[];\n if (pitches.length === 0) return [];\n\n return Object.entries(ZONES).map(([zoneName, bounds]) => {\n const inZone = pitches.filter(\n (p) =>\n p.plate_x >= bounds.xMin && p.plate_x < bounds.xMax &&\n p.plate_z >= bounds.zMin && p.plate_z < bounds.zMax,\n );\n\n const swings = inZone.filter((p) =>\n p.description.includes('swing') || p.description.includes('foul') || p.description.includes('hit_into_play'),\n );\n const whiffs = inZone.filter((p) => p.description.includes('swinging_strike'));\n\n const abs = inZone.filter((p) => p.events && !['walk', 'hit_by_pitch'].includes(p.events));\n const hits = abs.filter((p) =>\n ['single', 'double', 'triple', 'home_run'].includes(p.events ?? ''),\n );\n const totalBases = abs.reduce((sum, p) => {\n if (p.events === 'single') return sum + 1;\n if (p.events === 'double') return sum + 2;\n if (p.events === 'triple') return sum + 3;\n if (p.events === 'home_run') return sum + 4;\n return sum;\n }, 0);\n\n return {\n Zone: zoneName,\n Pitches: inZone.length,\n Swings: swings.length,\n 'Whiff %': swings.length > 0 ? ((whiffs.length / swings.length) * 100).toFixed(1) + '%' : '—',\n AVG: abs.length > 0 ? (hits.length / abs.length).toFixed(3) : '—',\n SLG: abs.length > 0 ? (totalBases / abs.length).toFixed(3) : '—',\n };\n });\n },\n};\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PitchData } from '../../adapters/types.js';\nimport { pitchTypeName } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'matchup-pitcher-vs-hitter',\n name: 'Pitcher vs Hitter Matchup',\n category: 'matchup',\n description: 'Career head-to-head history — PA, H, HR, BB, K, BA, SLG, most common pitches',\n preferredSources: ['savant'],\n requiredParams: ['players'], // expects [pitcher, hitter]\n optionalParams: ['season'],\n examples: [\n 'bbdata query matchup-pitcher-vs-hitter --players \"Gerrit Cole,Aaron Judge\"',\n ],\n\n buildQuery(params) {\n // Query for the pitcher's data — we'll filter for the specific batter in transform\n return {\n player_name: params.players?.[0],\n season: params.season ?? new Date().getFullYear(),\n stat_type: 'pitching',\n };\n },\n\n columns() {\n return ['Metric', 'Value'];\n },\n\n transform(data, params) {\n const pitches = data as PitchData[];\n const hitterName = (params.players?.[1] ?? '').toLowerCase();\n\n // Filter to only PAs against the target hitter\n const matchup = pitches.filter((p) =>\n p.batter_name.toLowerCase().includes(hitterName),\n );\n\n if (matchup.length === 0) {\n return [{ Metric: 'Note', Value: `No matchup data found for ${params.players?.[1] ?? 'hitter'}` }];\n }\n\n const pas = matchup.filter((p) => p.events !== null);\n const hits = pas.filter((p) => ['single', 'double', 'triple', 'home_run'].includes(p.events ?? ''));\n const hrs = pas.filter((p) => p.events === 'home_run');\n const ks = pas.filter((p) => p.events === 'strikeout');\n const bbs = pas.filter((p) => ['walk', 'hit_by_pitch'].includes(p.events ?? ''));\n const totalBases = pas.reduce((sum, p) => {\n if (p.events === 'single') return sum + 1;\n if (p.events === 'double') return sum + 2;\n if (p.events === 'triple') return sum + 3;\n if (p.events === 'home_run') return sum + 4;\n return sum;\n }, 0);\n\n // Most common pitch types\n const pitchCounts = new Map<string, number>();\n for (const p of matchup) {\n pitchCounts.set(p.pitch_type, (pitchCounts.get(p.pitch_type) ?? 0) + 1);\n }\n const topPitches = Array.from(pitchCounts.entries())\n .sort(([, a], [, b]) => b - a)\n .slice(0, 3)\n .map(([type, count]) => `${pitchTypeName(type)} (${count})`)\n .join(', ');\n\n return [\n { Metric: 'Total Pitches', Value: matchup.length },\n { Metric: 'Plate Appearances', Value: pas.length },\n { Metric: 'Hits', Value: hits.length },\n { Metric: 'Home Runs', Value: hrs.length },\n { Metric: 'Strikeouts', Value: ks.length },\n { Metric: 'Walks', Value: bbs.length },\n { Metric: 'AVG', Value: pas.length > 0 ? (hits.length / pas.length).toFixed(3) : '—' },\n { Metric: 'SLG', Value: pas.length > 0 ? (totalBases / pas.length).toFixed(3) : '—' },\n { Metric: 'Most Common Pitches', Value: topPitches },\n ];\n },\n};\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PlayerStats } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'matchup-situational',\n name: 'Situational Splits',\n category: 'matchup',\n description: 'Performance in key situations — RISP, high leverage, close & late, by inning',\n preferredSources: ['fangraphs', 'mlb-stats-api'],\n requiredParams: ['player'],\n optionalParams: ['season'],\n examples: [\n 'bbdata query matchup-situational --player \"Juan Soto\" --season 2025',\n ],\n\n buildQuery(params) {\n return {\n player_name: params.player,\n season: params.season ?? new Date().getFullYear(),\n stat_type: 'batting',\n };\n },\n\n columns() {\n return ['Situation', 'PA', 'AVG', 'OBP', 'SLG', 'K %', 'BB %'];\n },\n\n transform(data) {\n // Situational splits typically come pre-computed from FanGraphs\n // With raw pitch data this would require game state context\n // This template works best with FanGraphs/MLB API aggregated splits\n const stats = data as PlayerStats[];\n\n if (stats.length === 0) return [];\n\n const player = stats[0];\n const s = player.stats;\n\n // Return whatever aggregated stats we have — format for display\n return [\n {\n Situation: 'Overall',\n PA: s.plateAppearances ?? s.PA ?? '—',\n AVG: formatStat(s.avg ?? s.AVG),\n OBP: formatStat(s.obp ?? s.OBP),\n SLG: formatStat(s.slg ?? s.SLG),\n 'K %': formatPct(s.strikeOuts ?? s.SO, s.plateAppearances ?? s.PA),\n 'BB %': formatPct(s.baseOnBalls ?? s.BB, s.plateAppearances ?? s.PA),\n },\n ];\n },\n};\n\nfunction formatStat(val: unknown): string {\n if (val === null || val === undefined) return '—';\n const n = Number(val);\n if (isNaN(n)) return String(val);\n return n < 1 ? n.toFixed(3) : n.toFixed(1);\n}\n\nfunction formatPct(num: unknown, denom: unknown): string {\n const n = Number(num);\n const d = Number(denom);\n if (isNaN(n) || isNaN(d) || d === 0) return '—';\n return ((n / d) * 100).toFixed(1) + '%';\n}\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PlayerStats } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'leaderboard-custom',\n name: 'Custom Leaderboard',\n category: 'leaderboard',\n description: 'Top N players by any metric — with minimum qualification thresholds',\n preferredSources: ['fangraphs', 'mlb-stats-api'],\n requiredParams: ['stat'],\n optionalParams: ['season', 'team', 'top', 'minPa', 'minIp'],\n examples: [\n 'bbdata query leaderboard-custom --stat barrel_rate --min-pa 200 --top 20',\n 'bbdata query leaderboard-custom --stat ERA --min-ip 100 --top 10 --format table',\n ],\n\n buildQuery(params) {\n return {\n season: params.season ?? new Date().getFullYear(),\n team: params.team,\n stat_type: 'batting', // Will be overridden based on stat\n min_pa: params.minPa,\n min_ip: params.minIp,\n };\n },\n\n columns(params) {\n return ['Rank', 'Player', 'Team', params.stat ?? 'Stat', 'PA/IP'];\n },\n\n transform(data, params) {\n const stats = data as PlayerStats[];\n if (stats.length === 0) return [];\n\n const statKey = params.stat ?? '';\n const top = params.top ?? 20;\n\n // Find the stat in each player's stats object (case-insensitive search)\n const withStat = stats\n .map((player) => {\n const value = findStat(player.stats, statKey);\n return { player, value };\n })\n .filter((p) => p.value !== null)\n .sort((a, b) => {\n // ERA, FIP, etc. sort ascending; most others descending\n const ascending = ['era', 'fip', 'xfip', 'siera', 'whip', 'bb%'].includes(\n statKey.toLowerCase(),\n );\n return ascending\n ? (a.value as number) - (b.value as number)\n : (b.value as number) - (a.value as number);\n })\n .slice(0, top);\n\n return withStat.map((entry, idx) => ({\n Rank: idx + 1,\n Player: entry.player.player_name,\n Team: entry.player.team,\n [statKey]: typeof entry.value === 'number'\n ? entry.value < 1 && entry.value > 0\n ? entry.value.toFixed(3)\n : entry.value.toFixed(1)\n : String(entry.value),\n 'PA/IP': entry.player.stats.plateAppearances ?? entry.player.stats.PA\n ?? entry.player.stats.inningsPitched ?? entry.player.stats.IP ?? '—',\n }));\n },\n};\n\nfunction findStat(stats: Record<string, unknown>, key: string): number | null {\n // Direct match\n if (key in stats) {\n const val = Number(stats[key]);\n return isNaN(val) ? null : val;\n }\n // Case-insensitive match\n const lower = key.toLowerCase();\n for (const [k, v] of Object.entries(stats)) {\n if (k.toLowerCase() === lower || k.toLowerCase().replace(/[_%]/g, '') === lower.replace(/[_%]/g, '')) {\n const val = Number(v);\n return isNaN(val) ? null : val;\n }\n }\n return null;\n}\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PlayerStats } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'leaderboard-comparison',\n name: 'Player Comparison',\n category: 'leaderboard',\n description: 'Side-by-side comparison of multiple players across key metrics vs league average',\n preferredSources: ['fangraphs', 'mlb-stats-api'],\n requiredParams: ['players'],\n optionalParams: ['season'],\n examples: [\n 'bbdata query leaderboard-comparison --players \"Aaron Judge,Juan Soto,Mookie Betts\"',\n ],\n\n buildQuery(params) {\n return {\n season: params.season ?? new Date().getFullYear(),\n stat_type: 'batting',\n };\n },\n\n columns(params) {\n return ['Metric', ...(params.players ?? [])];\n },\n\n transform(data, params) {\n const allStats = data as PlayerStats[];\n const playerNames = params.players ?? [];\n\n // Match players by name (case-insensitive partial match)\n const matched = playerNames.map((name) => {\n const norm = name.toLowerCase();\n return allStats.find((s) => s.player_name.toLowerCase().includes(norm));\n });\n\n // Key batting metrics to compare\n const metrics = [\n 'AVG', 'OBP', 'SLG', 'OPS', 'wRC+', 'WAR', 'HR', 'RBI',\n 'K%', 'BB%', 'ISO', 'BABIP',\n ];\n\n return metrics.map((metric) => {\n const row: Record<string, unknown> = { Metric: metric };\n for (let i = 0; i < playerNames.length; i++) {\n const player = matched[i];\n if (!player) {\n row[playerNames[i]] = '—';\n continue;\n }\n const val = findStatValue(player.stats, metric);\n row[playerNames[i]] = val ?? '—';\n }\n return row;\n });\n },\n};\n\nfunction findStatValue(stats: Record<string, unknown>, key: string): string | null {\n const lower = key.toLowerCase().replace(/[+%]/g, '');\n for (const [k, v] of Object.entries(stats)) {\n if (k.toLowerCase().replace(/[+%]/g, '') === lower) {\n if (v === null || v === undefined) return null;\n const n = Number(v);\n if (isNaN(n)) return String(v);\n return n < 1 && n > 0 ? n.toFixed(3) : n % 1 === 0 ? String(n) : n.toFixed(1);\n }\n }\n return null;\n}\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PitchData } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'trend-rolling-average',\n name: 'Season Trend (Rolling Average)',\n category: 'trend',\n description: '15-game (hitters) or 5-start (pitchers) rolling averages — identifies sustained trends',\n preferredSources: ['savant'],\n requiredParams: ['player'],\n optionalParams: ['season'],\n examples: [\n 'bbdata query trend-rolling-average --player \"Freddie Freeman\" --season 2025',\n ],\n\n buildQuery(params) {\n return {\n player_name: params.player,\n season: params.season ?? new Date().getFullYear(),\n stat_type: 'batting',\n };\n },\n\n columns() {\n return ['Window', 'Games', 'AVG', 'SLG', 'K %', 'Avg EV', 'Hard Hit %'];\n },\n\n transform(data) {\n const pitches = data as PitchData[];\n if (pitches.length === 0) return [];\n\n // Group by game date\n const byDate = new Map<string, PitchData[]>();\n for (const p of pitches) {\n const group = byDate.get(p.game_date) ?? [];\n group.push(p);\n byDate.set(p.game_date, group);\n }\n\n const dates = Array.from(byDate.keys()).sort();\n const windowSize = 15;\n\n if (dates.length < windowSize) {\n return [{ Window: 'Insufficient data', Games: dates.length, AVG: '—', SLG: '—', 'K %': '—', 'Avg EV': '—', 'Hard Hit %': '—' }];\n }\n\n // Calculate rolling windows\n const results: Record<string, unknown>[] = [];\n\n for (let i = 0; i <= dates.length - windowSize; i += Math.max(1, Math.floor(windowSize / 3))) {\n const windowDates = dates.slice(i, i + windowSize);\n const windowPitches = windowDates.flatMap((d) => byDate.get(d) ?? []);\n\n const pas = windowPitches.filter((p) => p.events !== null);\n const hits = pas.filter((p) => ['single', 'double', 'triple', 'home_run'].includes(p.events ?? ''));\n const ks = pas.filter((p) => p.events === 'strikeout');\n const totalBases = pas.reduce((sum, p) => {\n if (p.events === 'single') return sum + 1;\n if (p.events === 'double') return sum + 2;\n if (p.events === 'triple') return sum + 3;\n if (p.events === 'home_run') return sum + 4;\n return sum;\n }, 0);\n\n const batted = windowPitches.filter((p) => p.launch_speed !== null && p.launch_speed > 0);\n const avgEv = batted.length > 0\n ? batted.reduce((s, p) => s + p.launch_speed!, 0) / batted.length\n : null;\n const hardHit = batted.filter((p) => p.launch_speed! >= 95).length;\n\n results.push({\n Window: `${windowDates[0]} → ${windowDates[windowDates.length - 1]}`,\n Games: windowDates.length,\n AVG: pas.length > 0 ? (hits.length / pas.length).toFixed(3) : '—',\n SLG: pas.length > 0 ? (totalBases / pas.length).toFixed(3) : '—',\n 'K %': pas.length > 0 ? ((ks.length / pas.length) * 100).toFixed(1) + '%' : '—',\n 'Avg EV': avgEv !== null ? avgEv.toFixed(1) + ' mph' : '—',\n 'Hard Hit %': batted.length > 0 ? ((hardHit / batted.length) * 100).toFixed(1) + '%' : '—',\n });\n }\n\n return results;\n },\n};\n\nregisterTemplate(template);\n","import { registerTemplate, type QueryTemplate } from './registry.js';\nimport type { PlayerStats } from '../../adapters/types.js';\n\nconst template: QueryTemplate = {\n id: 'trend-year-over-year',\n name: 'Year-over-Year Comparison',\n category: 'trend',\n description: 'Compare metric changes year to year — flags changes greater than 10%',\n preferredSources: ['fangraphs', 'mlb-stats-api'],\n requiredParams: ['player'],\n optionalParams: ['seasons'], // e.g. \"2023-2025\"\n examples: [\n 'bbdata query trend-year-over-year --player \"Julio Rodriguez\" --seasons 2023-2025',\n ],\n\n buildQuery(params) {\n // We'll need multiple seasons — use the most recent by default\n const season = params.season ?? new Date().getFullYear();\n return {\n player_name: params.player,\n season,\n stat_type: 'batting',\n };\n },\n\n columns() {\n return ['Metric', 'Prior', 'Current', 'Change', 'Flag'];\n },\n\n transform(data, params) {\n const stats = data as PlayerStats[];\n if (stats.length === 0) return [];\n\n // If we have multi-season data, compare last two\n // With single-season data, we show what we have\n const player = stats[0];\n const s = player.stats;\n\n // Key metrics to compare\n const metrics = ['AVG', 'OBP', 'SLG', 'HR', 'wRC+', 'K%', 'BB%', 'WAR', 'ISO', 'BABIP'];\n\n return metrics.map((metric) => {\n const current = findStat(s, metric);\n // Without multi-season support in a single query, we show current only\n // Full YoY requires querying multiple seasons (future enhancement)\n return {\n Metric: metric,\n Prior: '—',\n Current: current !== null ? formatVal(current) : '—',\n Change: '—',\n Flag: '',\n };\n });\n },\n};\n\nfunction findStat(stats: Record<string, unknown>, key: string): number | null {\n const lower = key.toLowerCase().replace(/[+%]/g, '');\n for (const [k, v] of Object.entries(stats)) {\n if (k.toLowerCase().replace(/[+%]/g, '') === lower) {\n const n = Number(v);\n return isNaN(n) ? null : n;\n }\n }\n return null;\n}\n\nfunction formatVal(n: number): string {\n if (n < 1 && n > 0) return n.toFixed(3);\n return n % 1 === 0 ? String(n) : n.toFixed(1);\n}\n\nregisterTemplate(template);\n","import { Command } from 'commander';\nimport { resolveAdapters } from '../adapters/index.js';\nimport { format, type OutputFormat, type FormattedOutput } from '../formatters/index.js';\nimport { getConfig } from '../config/config.js';\nimport { log } from '../utils/logger.js';\nimport {\n getTemplate,\n listTemplates,\n type QueryTemplateParams,\n type QueryResult as TemplateQueryResult,\n} from '../templates/queries/index.js';\n\nexport interface QueryOptions {\n template: string;\n player?: string;\n players?: string;\n team?: string;\n season?: number;\n stat?: string;\n pitchType?: string;\n minPa?: number;\n minIp?: number;\n top?: number;\n seasons?: string;\n format?: OutputFormat;\n source?: string;\n cache?: boolean;\n}\n\nexport interface QueryResult {\n data: Record<string, unknown>[];\n formatted: string;\n meta: {\n template: string;\n source: string;\n cached: boolean;\n rowCount: number;\n season: number;\n };\n}\n\n/**\n * Programmatic API — skills and agents call this directly.\n */\nexport async function query(options: QueryOptions): Promise<QueryResult> {\n const config = getConfig();\n const outputFormat = options.format ?? (config.defaultFormat as OutputFormat);\n\n const template = getTemplate(options.template);\n if (!template) {\n const available = listTemplates().map((t) => ` ${t.id} — ${t.description}`).join('\\n');\n throw new Error(`Unknown template \"${options.template}\". Available templates:\\n${available}`);\n }\n\n // Build template params from CLI options\n const params: QueryTemplateParams = {\n player: options.player,\n players: options.players?.split(',').map((s) => s.trim()),\n team: options.team,\n season: options.season ?? new Date().getFullYear(),\n stat: options.stat,\n pitchType: options.pitchType,\n minPa: options.minPa,\n minIp: options.minIp,\n top: options.top,\n seasons: options.seasons,\n };\n\n // Validate required params\n for (const req of template.requiredParams) {\n if (!params[req] && !(req === 'players' && params.player)) {\n throw new Error(`Template \"${template.id}\" requires --${req}`);\n }\n }\n\n // Build adapter query\n const adapterQuery = template.buildQuery(params);\n\n // Get adapters in preference order\n const preferredSources = options.source\n ? [options.source as any]\n : template.preferredSources;\n const adapters = resolveAdapters(preferredSources);\n\n let lastError: Error | undefined;\n let result: TemplateQueryResult | undefined;\n\n const startTime = Date.now();\n\n // Try adapters in preference order\n for (const adapter of adapters) {\n if (!adapter.supports(adapterQuery)) continue;\n\n try {\n log.info(`Querying ${adapter.source}...`);\n const adapterResult = await adapter.fetch(adapterQuery, {\n bypassCache: options.cache === false,\n });\n\n const rows = template.transform(adapterResult.data, params);\n const columns = template.columns(params);\n\n result = {\n rows,\n columns,\n title: template.name,\n description: template.description,\n source: adapter.source,\n cached: adapterResult.cached,\n };\n break;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n log.debug(`${adapter.source} failed: ${lastError.message}. Trying next source...`);\n }\n }\n\n if (!result) {\n throw lastError ?? new Error(`No adapter could fulfill this query`);\n }\n\n const queryTimeMs = Date.now() - startTime;\n\n const output = format(result.rows, {\n source: result.source,\n cached: result.cached,\n queryTimeMs,\n season: params.season ?? new Date().getFullYear(),\n sampleSize: result.rows.length,\n template: template.id,\n }, outputFormat, { columns: result.columns });\n\n return {\n data: result.rows,\n formatted: output.formatted,\n meta: {\n template: template.id,\n source: result.source,\n cached: result.cached,\n rowCount: result.rows.length,\n season: params.season ?? new Date().getFullYear(),\n },\n };\n}\n\n/**\n * CLI registration — Commander calls this.\n */\nexport function registerQueryCommand(program: Command): void {\n const cmd = program\n .command('query [template]')\n .description('Query baseball data using pre-built templates')\n .option('-p, --player <name>', 'Player name')\n .option('--players <names>', 'Comma-separated player names (for matchups/comparisons)')\n .option('-s, --season <year>', 'Season year', String(new Date().getFullYear()))\n .option('-f, --format <fmt>', 'Output: json, table, csv, markdown', 'json')\n .option('--source <src>', 'Force a data source: savant, fangraphs, mlb-stats-api')\n .option('--stat <stat>', 'Stat to query (for leaderboards)')\n .option('--pitch-type <type>', 'Filter by pitch type (e.g., FF, SL)')\n .option('--min-pa <n>', 'Minimum plate appearances', parseInt)\n .option('--min-ip <n>', 'Minimum innings pitched', parseInt)\n .option('--top <n>', 'Number of results for leaderboards', parseInt)\n .option('--seasons <range>', 'Season range (e.g., 2023-2025)')\n .option('--no-cache', 'Bypass cache')\n .addHelpText('after', `\nExamples:\n bbdata query pitcher-arsenal --player \"Corbin Burnes\" --season 2025\n bbdata query hitter-batted-ball --player \"Aaron Judge\" --format table\n bbdata query leaderboard-custom --stat ERA --min-ip 100 --top 10\n bbdata query hitter-hot-cold-zones --player \"Shohei Ohtani\"\n\nAvailable templates:\n Pitcher: pitcher-arsenal, pitcher-velocity-trend, pitcher-handedness-splits\n Hitter: hitter-batted-ball, hitter-vs-pitch-type, hitter-hot-cold-zones\n Matchup: matchup-pitcher-vs-hitter, matchup-situational\n Leaderboard: leaderboard-custom, leaderboard-comparison\n Trend: trend-rolling-average, trend-year-over-year\n`)\n .action(async (templateId, opts) => {\n if (!templateId) {\n // List available templates\n const templates = listTemplates();\n log.data('\\nAvailable query templates:\\n\\n');\n for (const t of templates) {\n log.data(` ${t.id.padEnd(32)} ${t.description}\\n`);\n }\n log.data('\\nUsage: bbdata query <template> --player \"Name\" [options]\\n\\n');\n return;\n }\n\n try {\n const result = await query({\n template: templateId,\n player: opts.player,\n players: opts.players,\n team: opts.team,\n season: opts.season ? parseInt(opts.season) : undefined,\n stat: opts.stat,\n pitchType: opts.pitchType,\n minPa: opts.minPa,\n minIp: opts.minIp,\n top: opts.top,\n seasons: opts.seasons,\n format: opts.format as OutputFormat,\n source: opts.source,\n cache: opts.cache,\n });\n\n log.data(result.formatted);\n } catch (error) {\n log.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","import { Command } from 'commander';\nimport Handlebars from 'handlebars';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { getConfig, getTemplatesDir } from '../config/config.js';\nimport { log } from '../utils/logger.js';\nimport { gradeLabel, gradeColor, formatGrade } from '../utils/grading.js';\nimport { pitchTypeName } from '../adapters/types.js';\nimport { query as runQuery } from './query.js';\nimport {\n getReportTemplate,\n listReportTemplates,\n type Audience,\n} from '../templates/reports/registry.js';\n\nexport interface ReportOptions {\n template: string;\n player?: string;\n team?: string;\n season?: number;\n audience?: Audience;\n format?: 'markdown' | 'json';\n validate?: boolean;\n}\n\nexport interface ReportResult {\n content: string;\n formatted: string;\n validation?: ValidationResult;\n meta: {\n template: string;\n player: string;\n audience: Audience;\n season: number;\n dataSources: string[];\n };\n}\n\nexport interface ValidationResult {\n passed: boolean;\n issues: { severity: 'error' | 'warning'; message: string }[];\n}\n\n// Register Handlebars helpers\nHandlebars.registerHelper('grade', (value: number) => formatGrade(value));\nHandlebars.registerHelper('gradeLabel', (value: number) => gradeLabel(value));\nHandlebars.registerHelper('pitchType', (code: string) => pitchTypeName(code));\nHandlebars.registerHelper('formatStat', (value: number, decimals: number) => {\n if (value === null || value === undefined) return '—';\n return typeof decimals === 'number' ? Number(value).toFixed(decimals) : String(value);\n});\nHandlebars.registerHelper('compare', (value: number, leagueAvg: number) => {\n if (value === null || value === undefined) return '—';\n const diff = value - leagueAvg;\n const pct = leagueAvg !== 0 ? ((diff / leagueAvg) * 100).toFixed(1) : '0';\n return diff > 0 ? `+${pct}%` : `${pct}%`;\n});\nHandlebars.registerHelper('ifGt', function (this: unknown, a: number, b: number, options: any) {\n return a > b ? options.fn(this) : options.inverse(this);\n});\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst BUNDLED_TEMPLATES_DIR = join(__dirname, '..', 'templates', 'reports');\n\nfunction loadTemplate(templateFile: string): string {\n // Check user overrides first\n const userDir = join(getTemplatesDir(), 'reports');\n const userPath = join(userDir, templateFile);\n if (existsSync(userPath)) {\n return readFileSync(userPath, 'utf-8');\n }\n\n // Fall back to bundled templates\n const bundledPath = join(BUNDLED_TEMPLATES_DIR, templateFile);\n if (existsSync(bundledPath)) {\n return readFileSync(bundledPath, 'utf-8');\n }\n\n // Generate a basic template structure from the template definition\n return generateFallbackTemplate(templateFile);\n}\n\nfunction generateFallbackTemplate(templateFile: string): string {\n // When no .hbs file exists yet, generate markdown structure from the template definition\n const templateId = templateFile.replace('.hbs', '');\n const template = getReportTemplate(templateId);\n\n if (!template) return '# Report\\n\\n{{data}}';\n\n const sections = template.requiredSections\n .map((s) => `## ${s}\\n\\n{{!-- ${s} data goes here --}}\\n*Data pending*\\n`)\n .join('\\n');\n\n return `# ${template.name}\\n\\n**Player:** {{player}}\\n**Season:** {{season}}\\n**Audience:** {{audience}}\\n**Generated:** {{date}}\\n\\n---\\n\\n${sections}\\n\\n---\\n*Generated by bbdata CLI · Data sources: {{sources}}*\\n`;\n}\n\n/**\n * Programmatic API — skills and agents call this directly.\n */\nexport async function report(options: ReportOptions): Promise<ReportResult> {\n const config = getConfig();\n const audience = options.audience ?? (config.defaultAudience as Audience);\n\n const template = getReportTemplate(options.template);\n if (!template) {\n const available = listReportTemplates().map((t) => ` ${t.id} — ${t.description}`).join('\\n');\n throw new Error(`Unknown report template \"${options.template}\". Available:\\n${available}`);\n }\n\n const season = options.season ?? new Date().getFullYear();\n const player = options.player ?? 'Unknown';\n\n // Gather data from required queries\n const dataResults: Record<string, unknown> = {};\n const dataSources: string[] = [];\n\n for (const req of template.dataRequirements) {\n try {\n const result = await runQuery({\n template: req.queryTemplate,\n player: options.player,\n team: options.team,\n season,\n format: 'json',\n });\n dataResults[req.queryTemplate] = result.data;\n if (!dataSources.includes(result.meta.source)) {\n dataSources.push(result.meta.source);\n }\n } catch (error) {\n if (req.required) {\n log.warn(`Required data \"${req.queryTemplate}\" failed: ${error}`);\n }\n dataResults[req.queryTemplate] = null;\n }\n }\n\n // Load and compile Handlebars template\n const hbsSource = loadTemplate(template.templateFile);\n const compiled = Handlebars.compile(hbsSource);\n\n // Render\n const content = compiled({\n player,\n season,\n audience,\n date: new Date().toISOString().split('T')[0],\n sources: dataSources.join(', ') || 'none',\n data: dataResults,\n ...dataResults,\n });\n\n // Validate if requested\n let validation: ValidationResult | undefined;\n if (options.validate) {\n validation = validateReport(content, template.requiredSections);\n }\n\n const formatted = options.format === 'json'\n ? JSON.stringify({ content, validation, meta: { template: template.id, player, audience, season, dataSources } }, null, 2) + '\\n'\n : content + '\\n';\n\n return {\n content,\n formatted,\n validation,\n meta: {\n template: template.id,\n player,\n audience,\n season,\n dataSources,\n },\n };\n}\n\nfunction validateReport(content: string, requiredSections: string[]): ValidationResult {\n const issues: ValidationResult['issues'] = [];\n\n // Check required sections are present\n for (const section of requiredSections) {\n if (!content.includes(section)) {\n issues.push({ severity: 'warning', message: `Missing section: \"${section}\"` });\n }\n }\n\n // Check for common AI hallucination patterns\n if (content.includes('Data pending') || content.includes('data goes here')) {\n issues.push({ severity: 'error', message: 'Report contains placeholder text — data was not populated' });\n }\n\n // Check for generic language\n const genericPhrases = ['shows promise', 'solid player', 'good potential', 'talented athlete'];\n for (const phrase of genericPhrases) {\n if (content.toLowerCase().includes(phrase)) {\n issues.push({ severity: 'warning', message: `Generic language detected: \"${phrase}\" — be more specific` });\n }\n }\n\n // Check minimum length\n if (content.length < 200) {\n issues.push({ severity: 'warning', message: 'Report seems too short — may be missing content' });\n }\n\n return {\n passed: issues.filter((i) => i.severity === 'error').length === 0,\n issues,\n };\n}\n\n/**\n * CLI registration — Commander calls this.\n */\nexport function registerReportCommand(program: Command): void {\n program\n .command('report [template]')\n .description('Generate scouting reports using pre-built templates')\n .option('-p, --player <name>', 'Player name')\n .option('-t, --team <code>', 'Team abbreviation')\n .option('-s, --season <year>', 'Season year', String(new Date().getFullYear()))\n .option('-a, --audience <role>', 'Target audience: coach, gm, scout, analyst')\n .option('-f, --format <fmt>', 'Output: markdown, json', 'markdown')\n .option('--validate', 'Run validation checklist on the report')\n .addHelpText('after', `\nExamples:\n bbdata report pro-pitcher-eval --player \"Corbin Burnes\"\n bbdata report advance-sp --player \"Gerrit Cole\" --audience coach --validate\n bbdata report trade-target-onepager --player \"Vladimir Guerrero Jr.\" --audience gm\n\nAvailable templates:\n Pro Scouting: pro-pitcher-eval, pro-hitter-eval, relief-pitcher-quick\n Amateur: college-pitcher-draft, college-hitter-draft, hs-prospect\n Advance: advance-sp, advance-lineup\n Player Dev: dev-progress, post-promotion\n Executive: trade-target-onepager, draft-board-card\n`)\n .action(async (templateId, opts) => {\n if (!templateId) {\n const templates = listReportTemplates();\n log.data('\\nAvailable report templates:\\n\\n');\n for (const t of templates) {\n log.data(` ${t.id.padEnd(28)} ${t.description}\\n`);\n }\n log.data('\\nUsage: bbdata report <template> --player \"Name\" [options]\\n\\n');\n return;\n }\n\n try {\n const result = await report({\n template: templateId,\n player: opts.player,\n team: opts.team,\n season: opts.season ? parseInt(opts.season) : undefined,\n audience: opts.audience as Audience,\n format: opts.format,\n validate: opts.validate,\n });\n\n log.data(result.formatted);\n\n if (result.validation && !result.validation.passed) {\n log.warn('Validation issues found:');\n for (const issue of result.validation.issues) {\n const prefix = issue.severity === 'error' ? ' ✗' : ' ⚠';\n log.warn(`${prefix} ${issue.message}`);\n }\n }\n } catch (error) {\n log.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","import chalk from 'chalk';\n\n/**\n * The 20-80 scouting scale used throughout baseball.\n *\n * 80 = elite (top ~2%)\n * 70 = plus-plus (top ~5%)\n * 60 = plus (above average)\n * 55 = above average\n * 50 = average\n * 45 = below average\n * 40 = fringe\n * 30 = poor\n * 20 = non-existent\n */\n\nexport type ScoutGrade = 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80;\n\nexport function gradeLabel(grade: number): string {\n if (grade >= 70) return 'Plus-Plus';\n if (grade >= 60) return 'Plus';\n if (grade >= 55) return 'Above Average';\n if (grade >= 50) return 'Average';\n if (grade >= 45) return 'Below Average';\n if (grade >= 40) return 'Fringe';\n if (grade >= 30) return 'Poor';\n return 'Non-existent';\n}\n\nexport function gradeColor(grade: number): string {\n if (grade >= 70) return chalk.green.bold(String(grade));\n if (grade >= 60) return chalk.green(String(grade));\n if (grade >= 55) return chalk.cyan(String(grade));\n if (grade >= 50) return chalk.white(String(grade));\n if (grade >= 45) return chalk.yellow(String(grade));\n if (grade >= 40) return chalk.red(String(grade));\n return chalk.red.dim(String(grade));\n}\n\nexport function formatGrade(grade: number): string {\n return `${gradeColor(grade)} (${gradeLabel(grade)})`;\n}\n\n/**\n * Convert a percentile rank to a 20-80 grade.\n * Percentile 50 = grade 50, percentile 90 = ~grade 65, percentile 99 = ~grade 80.\n */\nexport function percentileToGrade(percentile: number): ScoutGrade {\n if (percentile >= 99) return 80;\n if (percentile >= 95) return 70;\n if (percentile >= 85) return 60;\n if (percentile >= 70) return 55;\n if (percentile >= 50) return 50;\n if (percentile >= 30) return 45;\n if (percentile >= 15) return 40;\n if (percentile >= 5) return 30;\n return 20;\n}\n","import type { DataSource, AdapterQuery } from '../../adapters/types.js';\n\nexport type ReportCategory = 'pro-scouting' | 'amateur-scouting' | 'advance' | 'player-dev' | 'executive';\nexport type Audience = 'coach' | 'gm' | 'scout' | 'analyst';\n\nexport interface ReportTemplate {\n id: string;\n name: string;\n category: ReportCategory;\n description: string;\n audiences: Audience[];\n templateFile: string;\n\n /** What data queries this report needs */\n dataRequirements: {\n queryTemplate: string;\n paramMapping: Record<string, string>;\n required: boolean;\n }[];\n\n /** Sections that must be present in the output */\n requiredSections: string[];\n\n examples: string[];\n}\n\n// Template registry\nconst templates = new Map<string, ReportTemplate>();\n\nexport function registerReportTemplate(template: ReportTemplate): void {\n templates.set(template.id, template);\n}\n\nexport function getReportTemplate(id: string): ReportTemplate | undefined {\n return templates.get(id);\n}\n\nexport function getAllReportTemplates(): ReportTemplate[] {\n return Array.from(templates.values());\n}\n\nexport function getReportTemplatesByCategory(category: ReportCategory): ReportTemplate[] {\n return getAllReportTemplates().filter((t) => t.category === category);\n}\n\nexport function listReportTemplates(): { id: string; name: string; category: string; description: string }[] {\n return getAllReportTemplates().map((t) => ({\n id: t.id,\n name: t.name,\n category: t.category,\n description: t.description,\n }));\n}\n\n// --- Register all 12 report templates ---\n\nregisterReportTemplate({\n id: 'pro-pitcher-eval',\n name: 'Pro Pitcher Evaluation',\n category: 'pro-scouting',\n description: 'Full MLB/MiLB pitcher assessment for trade/free agency decisions',\n audiences: ['gm', 'scout', 'analyst'],\n templateFile: 'pro-pitcher-eval.hbs',\n dataRequirements: [\n { queryTemplate: 'pitcher-arsenal', paramMapping: { player: 'player' }, required: true },\n { queryTemplate: 'pitcher-velocity-trend', paramMapping: { player: 'player' }, required: false },\n { queryTemplate: 'pitcher-handedness-splits', paramMapping: { player: 'player' }, required: true },\n ],\n requiredSections: ['Header', 'Pitch Arsenal', 'Performance Profile', 'Splits Analysis', 'Trend Analysis', 'Risk Assessment', 'Comparable Player', 'Role Projection'],\n examples: ['bbdata report pro-pitcher-eval --player \"Corbin Burnes\"'],\n});\n\nregisterReportTemplate({\n id: 'pro-hitter-eval',\n name: 'Pro Hitter Evaluation',\n category: 'pro-scouting',\n description: 'Full MLB/MiLB hitter assessment for acquisition decisions',\n audiences: ['gm', 'scout', 'analyst'],\n templateFile: 'pro-hitter-eval.hbs',\n dataRequirements: [\n { queryTemplate: 'hitter-batted-ball', paramMapping: { player: 'player' }, required: true },\n { queryTemplate: 'hitter-vs-pitch-type', paramMapping: { player: 'player' }, required: true },\n { queryTemplate: 'hitter-hot-cold-zones', paramMapping: { player: 'player' }, required: false },\n ],\n requiredSections: ['Header', 'Batted Ball Profile', 'Approach & Discipline', 'Splits Analysis', 'Trend Analysis', 'Risk Assessment', 'Comparable Player', 'Role Projection'],\n examples: ['bbdata report pro-hitter-eval --player \"Juan Soto\"'],\n});\n\nregisterReportTemplate({\n id: 'relief-pitcher-quick',\n name: 'Relief Pitcher Quick Eval',\n category: 'pro-scouting',\n description: 'Fast 1-page evaluation for bullpen additions',\n audiences: ['gm', 'scout'],\n templateFile: 'relief-pitcher-quick.hbs',\n dataRequirements: [\n { queryTemplate: 'pitcher-arsenal', paramMapping: { player: 'player' }, required: true },\n ],\n requiredSections: ['Header', 'Arsenal', 'Key Metrics', 'Recommendation'],\n examples: ['bbdata report relief-pitcher-quick --player \"Edwin Diaz\"'],\n});\n\nregisterReportTemplate({\n id: 'college-pitcher-draft',\n name: 'College Pitcher Draft Report',\n category: 'amateur-scouting',\n description: 'Draft evaluation with tools and projection focus',\n audiences: ['gm', 'scout'],\n templateFile: 'college-pitcher-draft.hbs',\n dataRequirements: [],\n requiredSections: ['Header', 'Physical', 'Arsenal Grades', 'Performance', 'Projection', 'Risk', 'Recommendation'],\n examples: ['bbdata report college-pitcher-draft --player \"Chase Burns\"'],\n});\n\nregisterReportTemplate({\n id: 'college-hitter-draft',\n name: 'College Hitter Draft Report',\n category: 'amateur-scouting',\n description: 'Draft evaluation with tools and projection focus',\n audiences: ['gm', 'scout'],\n templateFile: 'college-hitter-draft.hbs',\n dataRequirements: [],\n requiredSections: ['Header', 'Physical', 'Tool Grades', 'Performance', 'Projection', 'Risk', 'Recommendation'],\n examples: ['bbdata report college-hitter-draft --player \"Charlie Condon\"'],\n});\n\nregisterReportTemplate({\n id: 'hs-prospect',\n name: 'High School Prospect Report',\n category: 'amateur-scouting',\n description: 'Tools-and-projection focused (stats unreliable at HS level)',\n audiences: ['gm', 'scout'],\n templateFile: 'hs-prospect.hbs',\n dataRequirements: [],\n requiredSections: ['Header', 'Physical', 'Tool Grades', 'Makeup', 'Projection', 'Signability', 'Recommendation'],\n examples: ['bbdata report hs-prospect --player \"Prospect Name\"'],\n});\n\nregisterReportTemplate({\n id: 'advance-sp',\n name: 'Advance Report: Starting Pitcher',\n category: 'advance',\n description: 'Game prep for opposing starter — actionable, 1-page, bullet-point format',\n audiences: ['coach', 'analyst'],\n templateFile: 'advance-sp.hbs',\n dataRequirements: [\n { queryTemplate: 'pitcher-arsenal', paramMapping: { player: 'player' }, required: true },\n { queryTemplate: 'pitcher-handedness-splits', paramMapping: { player: 'player' }, required: true },\n ],\n requiredSections: ['Header', 'Recent Form', 'Pitch Mix & Sequencing', 'Times Through Order', 'Platoon Vulnerabilities', 'How to Attack'],\n examples: ['bbdata report advance-sp --player \"Gerrit Cole\" --audience coach'],\n});\n\nregisterReportTemplate({\n id: 'advance-lineup',\n name: 'Advance Report: Opposing Lineup',\n category: 'advance',\n description: 'Hitter-by-hitter breakdown for pitchers and catchers',\n audiences: ['coach', 'analyst'],\n templateFile: 'advance-lineup.hbs',\n dataRequirements: [],\n requiredSections: ['Header', 'Lineup Overview', 'Hitter Breakdowns', 'Key Matchups'],\n examples: ['bbdata report advance-lineup --team NYY'],\n});\n\nregisterReportTemplate({\n id: 'dev-progress',\n name: 'Development Progress Report',\n category: 'player-dev',\n description: 'Track minor league player growth over time (monthly/quarterly)',\n audiences: ['scout', 'analyst'],\n templateFile: 'dev-progress.hbs',\n dataRequirements: [],\n requiredSections: ['Header', 'Current Stats', 'Trend Analysis', 'Mechanical Notes', 'Development Goals', 'Next Steps'],\n examples: ['bbdata report dev-progress --player \"Jackson Holliday\"'],\n});\n\nregisterReportTemplate({\n id: 'post-promotion',\n name: 'Post-Promotion Evaluation',\n category: 'player-dev',\n description: 'Assess player adjustment after level change',\n audiences: ['scout', 'analyst'],\n templateFile: 'post-promotion.hbs',\n dataRequirements: [],\n requiredSections: ['Header', 'Pre-Promotion Stats', 'Post-Promotion Stats', 'Adjustment Analysis', 'Recommendation'],\n examples: ['bbdata report post-promotion --player \"Jackson Holliday\"'],\n});\n\nregisterReportTemplate({\n id: 'trade-target-onepager',\n name: 'Trade Target One-Pager',\n category: 'executive',\n description: 'Condensed 2-minute evaluation for GM-level trade decisions',\n audiences: ['gm'],\n templateFile: 'trade-target-onepager.hbs',\n dataRequirements: [\n { queryTemplate: 'hitter-batted-ball', paramMapping: { player: 'player' }, required: false },\n { queryTemplate: 'pitcher-arsenal', paramMapping: { player: 'player' }, required: false },\n ],\n requiredSections: ['Header', 'Key Stats', 'Strengths', 'Concerns', 'Fit Assessment', 'Recommendation'],\n examples: ['bbdata report trade-target-onepager --player \"Vladimir Guerrero Jr.\" --audience gm'],\n});\n\nregisterReportTemplate({\n id: 'draft-board-card',\n name: 'Draft Board Summary Card',\n category: 'executive',\n description: 'Glanceable index card for draft room use',\n audiences: ['gm', 'scout'],\n templateFile: 'draft-board-card.hbs',\n dataRequirements: [],\n requiredSections: ['Name', 'Position', 'School', 'Tool Grades', 'Projection', 'Comp', 'Round Range'],\n examples: ['bbdata report draft-board-card --player \"Prospect Name\"'],\n});\n","import { program } from '../src/cli.js';\n\nprogram.parse(process.argv);\n"],"mappings":"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","names":["query","statGroup","query","query","query","chalk","template","z","template","template","template","template","template","template","template","template","template","template","template","findStat","template","adapters","program","templates","readFileSync","existsSync","join","chalk","templates","template","__dirname","join","existsSync","readFileSync","template","program","templates"]}