{"record":{"id":"b2cd82b1c5a9ea5d","repo":"yamadashy/repomix","slug":"skill-project-name-cannot-be-empty","errorCode":null,"errorMessage":"--skill-project-name cannot be empty","messagePattern":"--skill-project-name cannot be empty","errorType":"exception","errorClass":"RepomixError","httpStatus":null,"severity":"error","filePath":"src/cli/actions/defaultAction.ts","lineNumber":109,"sourceCode":"  validateConflictingOptions(config);\n\n  // Validate --skill-output and --force require --skill-generate\n  if (cliOptions.skillOutput && config.skillGenerate === undefined) {\n    throw new RepomixError('--skill-output can only be used with --skill-generate');\n  }\n  if (cliOptions.force && config.skillGenerate === undefined) {\n    throw new RepomixError('--force can only be used with --skill-generate');\n  }\n  if (cliOptions.skillProjectName !== undefined && config.skillGenerate === undefined) {\n    throw new RepomixError('--skill-project-name can only be used with --skill-generate');\n  }\n\n  // Validate --skill-output is not empty or whitespace only\n  if (cliOptions.skillOutput !== undefined && !cliOptions.skillOutput.trim()) {\n    throw new RepomixError('--skill-output path cannot be empty');\n  }\n  if (cliOptions.skillProjectName !== undefined && !cliOptions.skillProjectName.trim()) {\n    throw new RepomixError('--skill-project-name cannot be empty');\n  }\n\n  // Validate skill generation options and prompt for location\n  if (config.skillGenerate !== undefined) {\n    // Resolve skill name: use pre-computed name (from remoteAction) or generate from directory\n    cliOptions.skillName ??=\n      typeof config.skillGenerate === 'string'\n        ? config.skillGenerate\n        : generateDefaultSkillName(directories.map((d) => path.resolve(cwd, d)));\n\n    // Determine skill directory\n    if (cliOptions.skillOutput && !cliOptions.skillDir) {\n      // Non-interactive mode: use provided path directly\n      cliOptions.skillDir = await resolveAndPrepareSkillDir(cliOptions.skillOutput, cwd, cliOptions.force ?? false);\n    } else if (!cliOptions.skillDir) {\n      // Interactive mode: prompt for skill location\n      const promptResult = await promptSkillLocation(cliOptions.skillName, cwd);\n      cliOptions.skillDir = promptResult.skillDir;","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/yamadashy/repomix/blob/f465ad909315a22120636baf03fa5e28701a50cb/src/cli/actions/defaultAction.ts#L91-L127","documentation":"--skill-project-name requires a non-empty, non-whitespace value since it names the project inside the generated skill metadata. runDefaultAction throws this when the flag is given but its trimmed value is empty (src/cli/actions/defaultAction.ts:109).","triggerScenarios":"`repomix --skill-generate --skill-project-name \"\"` or `--skill-project-name \"   \"`; scripts passing an unset/empty variable as the value.","commonSituations":"CI pipelines where PROJECT_NAME is undefined; templated commands with a placeholder never filled in; quoting bugs that swallow the value.","solutions":["Supply an actual name: `repomix --skill-generate --skill-project-name \"My Project\"`.","Omit the flag entirely — a project name is derived automatically (e.g. from the directory or remote URL).","In scripts, default the value: `--skill-project-name \"${PROJECT_NAME:-$(basename $PWD)}\"`."],"exampleFix":"# before (PROJECT_NAME unset)\nrepomix --skill-generate --skill-project-name \"$PROJECT_NAME\"\n# after\nrepomix --skill-generate --skill-project-name \"${PROJECT_NAME:-$(basename \"$PWD\")}\"","handlingStrategy":"validation","validationCode":"const i = args.indexOf('--skill-project-name');\nif (i !== -1 && !(args[i + 1] ?? '').trim()) {\n  throw new Error('Provide a non-empty --skill-project-name or omit the flag');\n}","typeGuard":"const isFilled = (v: string | undefined): v is string => typeof v === 'string' && v.trim().length > 0;","tryCatchPattern":"try {\n  await repomixRun(args);\n} catch (e) {\n  if (String(e.message).includes('--skill-project-name cannot be empty')) {\n    return repomixRun(args.filter((a, idx) => a !== '--skill-project-name' && args[idx - 1] !== '--skill-project-name'));\n  }\n  throw e;\n}","preventionTips":["Prefer omitting --skill-project-name and letting repomix derive the name automatically.","Use ${VAR:-default} expansion so empty variables never reach the flag.","Validate required variables at the top of CI jobs with test -n \"$VAR\"."],"tags":["cli","argument-validation","empty-value","repomix"],"backgroundTag":"empty-option-value","analyzedSha":"f465ad909315a22120636baf03fa5e28701a50cb","analyzedAt":"2026-08-29T01:27:42.024Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}