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.SKILL.md frontmatter emits a once-per-path scan warning with the skipped skill path/name and a line number when the parser can identify one directly.__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.