{"record":{"id":"e5048b31f8d842ec","repo":"vercel/turborepo","slug":"generator-config-directory-already-exists-at-con","errorCode":null,"errorMessage":"Generator config directory already exists at ${configDirectory}","messagePattern":"Generator config directory already exists at (.+?)","errorType":"exception","errorClass":"GeneratorError","httpStatus":null,"severity":"error","filePath":"packages/turbo-gen/src/utils/setup-from-template.ts","lineNumber":25,"sourceCode":"export async function setupFromTemplate({\n  project,\n  template\n}: {\n  project: Project;\n  template: \"ts\" | \"js\";\n}) {\n  const configDirectory = path.join(project.paths.root, \"turbo\", \"generators\");\n\n  const templateKey = `simple-${template}`;\n  const embeddedTemplate = TEMPLATES[templateKey];\n  if (!embeddedTemplate) {\n    throw new GeneratorError(`Unknown template \"${templateKey}\"`, {\n      type: \"config_directory_already_exists\"\n    });\n  }\n\n  if (await fs.pathExists(configDirectory)) {\n    throw new GeneratorError(\n      `Generator config directory already exists at ${configDirectory}`,\n      { type: \"config_directory_already_exists\" }\n    );\n  }\n\n  for (const file of embeddedTemplate.files) {\n    const filePath = path.join(configDirectory, file.relativePath);\n    await fs.outputFile(filePath, file.content);\n  }\n}\n","sourceCodeStart":7,"sourceCodeEnd":36,"githubUrl":"https://github.com/vercel/turborepo/blob/9f94a7d215b3881942527dd526afa3fc650869d5/packages/turbo-gen/src/utils/setup-from-template.ts#L7-L36","documentation":"Thrown by setupFromTemplate() in @turbo/gen when scaffolding an embedded 'simple-ts' or 'simple-js' generator template. The function only writes its files into a fresh <projectRoot>/turbo/generators directory, so it refuses to run if that directory already exists, wrapping the failure in a GeneratorError of type config_directory_already_exists.","triggerScenarios":"Calling setupFromTemplate({ project, template }) for a project whose path.join(project.paths.root, 'turbo', 'generators') already exists on disk (even if empty) — e.g. running the generator init/scaffold flow twice in the same monorepo, or a checkout that already contains turbo/generators/config.json or custom generators.","commonSituations":"Re-running `turbo gen init` after a previous run; a repo that already has custom plop generators under turbo/generators; scaffolding into a template project that pre-creates the directory.","solutions":["Delete or rename the existing <root>/turbo/generators directory, then re-run the command","If you want to keep existing generators, skip the embedded template setup and add the new generator files manually under turbo/generators","Run the command against a different project root that does not yet have a turbo/generators directory"],"exampleFix":"# before: turbo/generators already exists, command fails\nrm -rf turbo/generators        # or: mv turbo/generators turbo/generators.bak\n\n# after: re-run the scaffold command\nnpx turbo gen init","handlingStrategy":"validation","validationCode":"import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nconst configDir = path.join(project.paths.root, \"turbo\", \"generators\");\nif (await fs.pathExists(configDir)) {\n  // choose: skip scaffold, or prompt to overwrite\n} else {\n  await setupFromTemplate({ project, template });\n}","typeGuard":"import { GeneratorError } from \"@turbo/gen/utils/error\";\n\nfunction isConfigDirExistsError(e: unknown): boolean {\n  return e instanceof GeneratorError && e.type === \"config_directory_already_exists\";\n}","tryCatchPattern":"try {\n  await setupFromTemplate({ project, template });\n} catch (e) {\n  if (e instanceof GeneratorError && e.type === \"config_directory_already_exists\") {\n    // prompt user or skip; message names the existing directory\n  } else {\n    throw e;\n  }\n}","preventionTips":["Check for turbo/generators before scaffolding in interactive CLIs and offer to skip or delete","Treat presence of turbo/generators as 'already initialized' state in your tooling","Never blind-run the scaffold twice in scripts; gate it on a pathExists check"],"tags":["generator","filesystem","scaffolding","turbo-gen"],"backgroundTag":"directory-already-exists","analyzedSha":"9f94a7d215b3881942527dd526afa3fc650869d5","analyzedAt":"2026-08-16T19:47:29.531Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}