yamadashy/repomix · error · RepomixError

--force can only be used with --skill-generate

Error message

--force can only be used with --skill-generate

What it means

--force (which lets the skill generator overwrite an existing skill directory) is only meaningful together with --skill-generate. runDefaultAction rejects a standalone --force so users cannot unknowingly enable destructive overwrites in normal packing mode. The check runs before any filesystem work in runDefaultAction (src/cli/actions/defaultAction.ts:98).

Source

Thrown at src/cli/actions/defaultAction.ts:98

  directories: string[],
  cwd: string,
  cliOptions: CliOptions,
  progressCallback?: RepomixProgressCallback,
): Promise<DefaultActionRunnerResult> => {
  logger.trace('Loaded CLI options:', redactOptionsForLog(cliOptions));

  // Build the merged config (migration + file config + CLI options)
  const config = await buildMergedConfig(cwd, cliOptions);

  // Validate conflicting options
  validateConflictingOptions(config);

  // Validate --skill-output and --force require --skill-generate
  if (cliOptions.skillOutput && config.skillGenerate === undefined) {
    throw new RepomixError('--skill-output can only be used with --skill-generate');
  }
  if (cliOptions.force && config.skillGenerate === undefined) {
    throw new RepomixError('--force can only be used with --skill-generate');
  }
  if (cliOptions.skillProjectName !== undefined && config.skillGenerate === undefined) {
    throw new RepomixError('--skill-project-name can only be used with --skill-generate');
  }

  // Validate --skill-output is not empty or whitespace only
  if (cliOptions.skillOutput !== undefined && !cliOptions.skillOutput.trim()) {
    throw new RepomixError('--skill-output path cannot be empty');
  }
  if (cliOptions.skillProjectName !== undefined && !cliOptions.skillProjectName.trim()) {
    throw new RepomixError('--skill-project-name cannot be empty');
  }

  // Validate skill generation options and prompt for location
  if (config.skillGenerate !== undefined) {
    // Resolve skill name: use pre-computed name (from remoteAction) or generate from directory
    cliOptions.skillName ??=
      typeof config.skillGenerate === 'string'

View on GitHub (pinned to f465ad9093)

Solutions

  1. Use `repomix --skill-generate --force --skill-output <path>` when you intend to overwrite a skill directory.
  2. If no skill is intended, drop --force; standard packing does not require it.
  3. Review CI scripts/aliases for a hardcoded --force flag unrelated to your current invocation.

Example fix

// before
repomix --force
// after
repomix --skill-generate --skill-output ./skill --force
Defensive patterns

Strategy: validation

Validate before calling

if (args.includes('--force') && !args.includes('--skill-generate')) {
  args = args.filter(a => a !== '--force');
}

Type guard

const canUseForce = (argv: string[]): boolean => !argv.includes('--force') || argv.includes('--skill-generate');

Try / catch

try {
  await repomixRun(args);
} catch (e) {
  if (String(e.message).includes('--force can only be used with --skill-generate')) {
    throw new Error('Drop --force or add --skill-generate');
  }
  throw e;
}

Prevention

When it happens

Trigger: Executing `repomix --force` without --skill-generate; scripts exporting repomix() wrappers that always append --force; config merging where cliOptions.force is true but skillGenerate is undefined.

Common situations: Reusing a skill-generation command line from documentation but deleting the --skill-generate part; CI templates where --force was added for skill regeneration; users assuming --force relates to overwriting repomix output files generally.

Related errors


AI-assisted analysis of yamadashy/repomix@f465ad9093 (2026-08-29). Data as JSON: /api/errors/76a4a64d480dfb5c. Report an issue: GitHub.