helpers/skills.py.dox.md
skills.py helper module.skills.py because this directory is intentionally flat.skills.py owns the runtime implementation.skills.py.dox.md owns durable notes about responsibilities, contracts, side effects, and verification for that implementation.ActiveSkillEntry (TypedDict)CatalogSkill (TypedDict)Skill (no explicit base class)get_skills_base_dir() -> Pathget_skill_roots(agent: Agent | None=...) -> List[str]_is_hidden_path(path: Path) -> booldiscover_skill_md_files(root: Path) -> List[Path]: Recursively discover SKILL.md files under a root directory._coerce_list(value: Any) -> List[str]_normalize_name(name: str) -> str_read_text(path: Path) -> strsplit_frontmatter(markdown: str) -> Tuple[Dict[str, Any], str, List[str]]: Splits a SKILL.md into (frontmatter_dict, body_text, errors)._parse_frontmatter_fallback(frontmatter_text: str) -> Dict[str, Any]parse_frontmatter(frontmatter_text: str) -> Tuple[Dict[str, Any], List[str]]: Parse YAML frontmatter with PyYAML when available,skill_from_markdown(skill_md_path: Path, include_content: bool=..., validate: bool=...) -> Optional[Skill]list_skills(agent: Agent | None=..., include_content: bool=..., include_hidden: bool=...) -> List[Skill]: List skills, optionally filtered by agent scope.delete_skill(skill_path: str) -> None: Delete a skill directory.find_skill(skill_name: str, agent: Agent | None=..., include_content: bool=..., include_hidden: bool=...) -> Optional[Skill]load_skill_for_agent(skill_name: str, agent: Agent | None=...) -> str: Load skill and format it as a complete string for agent context.skill_instruction_name(message: Any) -> str_get_skill_files(skill_dir: Path) -> str: Get file tree for skill directory.search_skills(query: str, limit: int=..., agent: Agent | None=..., include_hidden: bool=...) -> List[Skill]validate_skill(skill: Skill) -> List[str]validate_skill_md(skill_md_path: Path) -> List[str]_normalize_max_active_skills(value: Any) -> intget_max_active_skills(agent: Agent | None=..., project_name: str | None=...) -> intnormalize_skills_config(config: dict[str, Any] | None) -> dict[str, Any]normalize_active_skills(raw: Any, limit: int | None=...) -> list[ActiveSkillEntry]normalize_hidden_skills(raw: Any) -> list[ActiveSkillEntry]normalize_skill_entries(raw: Any, limit: int | None=...) -> list[ActiveSkillEntry]list_skill_catalog(project_name: str=..., agent: Agent | None=...) -> list[CatalogSkill]get_scope_active_skills(agent: Agent | None) -> list[ActiveSkillEntry]get_scope_hidden_skills(agent: Agent | None) -> list[ActiveSkillEntry]get_chat_active_skills(context: Any | None) -> list[ActiveSkillEntry]get_chat_disabled_skills(context: Any | None) -> list[ActiveSkillEntry]get_loaded_skill_names(agent: Agent | None) -> list[str]set_loaded_skill_names(agent: Agent | None, skill_names: Any) -> list[str]add_loaded_skill_name(agent: Agent | None, skill_name: str, limit: int | None=...) -> list[str]MAX_ACTIVE_SKILLS, ACTIVE_SKILLS_PLUGIN_NAME, AGENT_DATA_NAME_LOADED_SKILLS, CONTEXT_DATA_NAME_LOADED_SKILLS, CONTEXT_DATA_NAME_CHAT_ACTIVE_SKILLS, CONTEXT_DATA_NAME_CHAT_DISABLED_SKILLS, CONTEXT_DATA_NAME_CHAT_VISIBLE_SKILLS, _NAME_RE.CONTEXT_DATA_NAME_LOADED_SKILLS; legacy agent-local loaded_skills lists are migrated into context data and cleared when read.__future__, dataclasses, helpers, os, pathlib, re, typing.dataclass, re.compile, field, Path, root.rglob, results.sort, re.sub, path.read_text, text.splitlines, join.strip, parse_frontmatter, frontmatter_text.splitlines, _parse_frontmatter_fallback, split_frontmatter, str.strip, _coerce_list, Skill, get_skill_roots, _filter_hidden_skills, files.get_abs_path.tests/test_a0_connector_prompt_gating.pytests/test_browser_agent_regressions.pytests/test_document_query_plugin.pytests/test_fasta2a_client.pytests/test_office_canvas_setup.pytests/test_office_document_store.pytests/test_skills_runtime.pytests/test_time_travel.pyNo child DOX files.