helpers/projects.py.dox.md
projects.py helper module.projects.py because this directory is intentionally flat.projects.py owns the runtime implementation.projects.py.dox.md owns durable notes about responsibilities, contracts, side effects, and verification for that implementation.FileStructureInjectionSettings (TypedDict)SubAgentSettings (TypedDict)BasicProjectData (TypedDict)GitStatusData (TypedDict)EditProjectData (BasicProjectData)get_projects_parent_folder()get_project_folder(name: str)get_project_meta(name: str, *sub_dirs)validate_project_name(name: str | None) -> strdelete_project(name: str)create_project(name: str, data: BasicProjectData)clone_git_project(name: str, git_url: str, git_token: str, data: BasicProjectData): Clone a git repository as a new A0 project. Token is used only for cloning via http header.load_project_header(name: str)_default_file_structure_settings()_normalizeBasicData(data: BasicProjectData) -> BasicProjectData_normalizeEditData(data: EditProjectData) -> EditProjectData_edit_data_to_basic_data(data: EditProjectData)_basic_data_to_edit_data(data: BasicProjectData) -> EditProjectDataupdate_project(name: str, data: EditProjectData)load_basic_project_data(name: str) -> BasicProjectDataload_edit_project_data(name: str) -> EditProjectDatasave_project_header(name: str, data: BasicProjectData)load_project_extended_data(name: str) -> ProjectExtendedDatasave_project_extended_data(name: str, project_data: ProjectExtendedData)_project_extended_data_for_save(data: object) -> ProjectExtendedData_merge_project_extended_data(data: EditProjectData, extended_data: object) -> Noneload_project_mcp_servers(name: str) -> strsave_project_mcp_servers(name: str, mcp_servers: str)get_active_projects_list()_get_projects_list(parent_dir)activate_project(context_id: str, name: str, mark_dirty: bool=...)deactivate_project(context_id: str, mark_dirty: bool=...)reactivate_project_in_chats(name: str)deactivate_project_in_chats(name: str)build_system_prompt_vars(name: str)get_additional_instructions_files(name: str)get_project_instruction_files(name: str, include_agents_md: bool=...) -> list[tuple[str, str]]get_project_agents_md_instruction_file(name: str) -> tuple[str, str] | None_format_project_instruction_files(instruction_files: list[tuple[str, str]]) -> str_normalize_include_agents_md(value: object) -> boolPROJECTS_PARENT_DIR, PROJECT_META_DIR, PROJECT_INSTRUCTIONS_DIR, PROJECT_KNOWLEDGE_DIR, PROJECT_SKILLS_DIR, PROJECT_HEADER_FILE, PROJECT_MCP_SERVERS_FILE, PROJECT_AGENTS_MD_FILES, DEFAULT_MCP_SERVERS_CONFIG, CONTEXT_DATA_KEY_PROJECT..a0proj/mcp_servers.json, exposed through load_edit_project_data(...), and saved during project create/clone/update flows.load_project_extended_data(...) and save_project_extended_data(...); the project helper must stay storage-agnostic and plugin-specific config rules belong to the owning plugin.llm, but it must not overwrite core project fields owned by EditProjectData.git_token; plugins needing core metadata should load it by project name..a0proj/instructions, .a0proj/knowledge, and .a0proj/skills so settings surfaces can open those folders consistently.mcpServers..a0proj/mcp_servers.json.helpers, helpers.print_style, os, typing.files.get_abs_path, files.delete_dir, deactivate_project_in_chats, files.create_dir_safe, create_project_meta_folders, _normalizeBasicData, save_project_header, save_project_mcp_servers, load_project_mcp_servers, save_project_extended_data, load_project_extended_data, _project_extended_data_for_save, _merge_project_extended_data, _PROJECT_CORE_EDIT_KEYS, _PROJECT_TRANSIENT_INPUT_KEYS, extension.extensible, files.basename, dirty_json.parse, FileStructureInjectionSettings, cast, _normalizeEditData, load_edit_project_data, _edit_data_to_basic_data, save_project_variables, save_project_secrets, save_project_subagents, reactivate_project_in_chats, load_basic_project_data.tests/test_model_config_project_presets.pytests/test_office_document_store.pytests/test_plugin_activation_ui.pytests/test_projects.pytests/test_skills_runtime.pytests/test_task_scheduler_timezone.pytests/test_time_travel.pytests/test_tool_action_contracts.pyNo child DOX files.