{"record":{"id":"2cc92a61f0b0da71","repo":"oraios/serena","slug":"project-file-yml-path-already-exists","errorCode":null,"errorMessage":"Project file {yml_path} already exists.","messagePattern":"Project file (.+?) already exists\\.","errorType":"exception","errorClass":"FileExistsError","httpStatus":null,"severity":"error","filePath":"src/serena/cli.py","lineNumber":707,"sourceCode":"        )\n\n    @staticmethod\n    def _create_project(project_path: str, name: str | None, language: tuple[str, ...]) -> RegisteredProject:\n        \"\"\"\n        Helper method to create a project configuration file.\n\n        :param project_path: Path to the project directory\n        :param name: Optional project name (defaults to directory name if not specified)\n        :param language: Tuple of language names\n        :raises FileExistsError: If project.yml already exists\n        :raises ValueError: If an unsupported language is specified\n        :return: the RegisteredProject instance\n        \"\"\"\n        project_root = Path(project_path).resolve()\n        serena_config = SerenaConfig.from_config_file()\n        yml_path = serena_config.get_project_yml_location(str(project_root))\n        if os.path.exists(yml_path):\n            raise FileExistsError(f\"Project file {yml_path} already exists.\")\n\n        languages: list[LanguageServerId] = []\n        if language:\n            for lang in language:\n                try:\n                    languages.append(LanguageServerId(lang.lower()))\n                except ValueError:\n                    all_langs = [l.value for l in LanguageServerId]\n                    raise ValueError(f\"Unknown language '{lang}'. Supported: {all_langs}\")\n\n        generated_conf = ProjectConfig.autogenerate(\n            project_root=project_path,\n            serena_config=serena_config,\n            project_name=name,\n            languages=languages if languages else None,\n            interactive=True,\n        )\n        languages_str = \", \".join([lang.value for lang in generated_conf.language_servers]) if generated_conf.language_servers else \"N/A\"","sourceCodeStart":689,"sourceCodeEnd":725,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/serena/cli.py#L689-L725","documentation":"_create_project registers a new project by generating a .serena/project.yml inside the target directory (via SerenaConfig.get_project_yml_location). It raises FileExistsError if a project yml is already present, because re-running creation would overwrite the existing project configuration. This makes project creation idempotent-safe: existing projects must be activated, not recreated.","triggerScenarios":"Calling `serena project create <path>` / `serena index` (which auto-creates) or _create_project directly on a directory that already contains a Serena project file (.serena/project.yml at the resolved root).","commonSituations":"Running `serena index` on an already-registered project; accidentally pointing create at a parent directory that already has a project.yml; re-running setup scripts that call create on every invocation; symlink/resolution making a subdirectory resolve to an existing project root.","solutions":["Skip creation: the project already exists — activate it instead (`serena start-mcp-server --project <path>` or the activate_project tool).","If you intend to regenerate, delete or rename the existing project.yml first (after backing up custom settings).","In scripts, check os.path.exists(<project>/.serena/project.yml) before calling create, and branch to activate/index logic.","Verify you passed the intended project root, not a parent that already contains .serena/project.yml."],"exampleFix":"// before\nyml = cfg.get_project_yml_location(str(root))\n_create_project(path)  # FileExistsError on re-run\n// after\nif not os.path.exists(os.path.join(path, '.serena', 'project.yml')):\n    _create_project(path)\nelse:\n    agent.activate_project_from_path_or_name(path)","handlingStrategy":"validation","validationCode":"import os\ndef project_already_created(project_path: str) -> bool:\n    root = os.path.abspath(project_path)\n    return os.path.exists(os.path.join(root, '.serena', 'project.yml'))","typeGuard":null,"tryCatchPattern":"try:\n    _create_project(path)\nexcept FileExistsError as e:\n    log.info('Project already exists (%s); activating instead', e)\n    agent.activate_project_from_path_or_name(path)","preventionTips":["Check for .serena/project.yml before calling create; switch to activate/index when present.","In automation scripts, make create step conditional/idempotent.","Point create at the exact intended project root, not a parent that already hosts a project.yml.","Back up project.yml before deleting it to force regeneration."],"tags":["cli","project-creation","file-exists","idempotency"],"backgroundTag":"file-already-exists","analyzedSha":"7fcbca7e62555ec2287ddb2f083caee805848ea6","analyzedAt":"2026-08-29T00:04:09.619Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}