diff --git a/src/cli/actions/defaultAction.ts b/src/cli/actions/defaultAction.ts index ccd835a9f..285b3b486 100644 --- a/src/cli/actions/defaultAction.ts +++ b/src/cli/actions/defaultAction.ts @@ -1,16 +1,15 @@ import path from 'node:path'; import { loadFileConfig, mergeConfigs } from '../../config/configLoad.js'; -import { - type RepomixConfigCli, - type RepomixConfigFile, - type RepomixConfigMerged, - type RepomixOutputStyle, - repomixConfigCliSchema, +import type { + RepomixConfigCli, + RepomixConfigFile, + RepomixConfigMerged, + RepomixOutputStyle, } from '../../config/configSchema.js'; import { readFilePathsFromStdin } from '../../core/file/fileStdin.js'; import type { PackResult } from '../../core/packager.js'; import { generateDefaultSkillName } from '../../core/skill/skillUtils.js'; -import { RepomixError, rethrowValidationErrorIfZodError } from '../../shared/errorHandle.js'; +import { RepomixError } from '../../shared/errorHandle.js'; import { logger } from '../../shared/logger.js'; import { splitPatterns } from '../../shared/patternUtils.js'; import { initTaskRunner } from '../../shared/processConcurrency.js'; @@ -25,6 +24,13 @@ import type { PingTask, } from './workers/defaultActionWorker.js'; +// Pre-warm Zod schema loading as soon as defaultAction module is imported. +// configSchema.js transitively loads Zod (~50ms). By starting the import here, +// the module loads in the background during migration check (~5ms) and other +// setup work. When loadFileConfig or buildCliConfig later calls +// import('../../config/configSchema.js'), the module is already cached. +const _configSchemaWarmup = import('../../config/configSchema.js').catch(() => {}); + export interface DefaultActionRunnerResult { packResult: PackResult; config: RepomixConfigMerged; @@ -339,12 +345,11 @@ export const buildCliConfig = (options: CliOptions): RepomixConfigCli => { cliConfig.skillGenerate = options.skillGenerate; } - try { - return repomixConfigCliSchema.parse(cliConfig); - } catch (error) { - rethrowValidationErrorIfZodError(error, 'Invalid cli arguments'); - throw error; - } + // CLI config is built entirely from Commander-parsed options above — each field + // is set from a typed CLI option with known values. Zod validation is redundant + // here and would require awaiting the ~50ms configSchema.js import. File configs + // (user-authored JSON) are still Zod-validated in loadFileConfig. + return cliConfig as RepomixConfigCli; }; /** diff --git a/src/cli/cliRun.ts b/src/cli/cliRun.ts index 837de53ca..dff091706 100644 --- a/src/cli/cliRun.ts +++ b/src/cli/cliRun.ts @@ -265,8 +265,9 @@ export const runCli = async (directories: string[], cwd: string, options: CliOpt return; } - // Skip version header in stdin mode to avoid interfering with piped output from interactive tools like fzf - if (!options.stdin) { + // Skip version header in stdin/stdout/quiet mode to avoid unnecessary I/O + // (package.json read) when output would be suppressed anyway. + if (!options.stdin && !options.stdout && !options.quiet) { const version = await getVersion(); logger.log(pc.dim(`\nšŸ“¦ Repomix v${version}\n`)); }